1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-07-10 07:43:48 -05:00

Another big batch of memory leak fixes, again mostly on error paths.

The most interesting one is printer_add_enum, which I've modified to
take a char ** rather than a char * so that it can both realloc its
input buffer _and_ return NULL to indicate error.

[originally from svn r9959]
This commit is contained in:
Simon Tatham
2013-07-22 07:11:54 +00:00
parent 4c61cb20a1
commit b99bec3b02
9 changed files with 107 additions and 42 deletions

View File

@ -18,39 +18,39 @@ struct printer_job_tag {
HANDLE hprinter;
};
static char *printer_add_enum(int param, DWORD level, char *buffer,
int offset, int *nprinters_ptr)
static int printer_add_enum(int param, DWORD level, char **buffer,
int offset, int *nprinters_ptr)
{
DWORD needed = 0, nprinters = 0;
buffer = sresize(buffer, offset+512, char);
*buffer = sresize(*buffer, offset+512, char);
/*
* Exploratory call to EnumPrinters to determine how much space
* we'll need for the output. Discard the return value since it
* will almost certainly be a failure due to lack of space.
*/
EnumPrinters(param, NULL, level, buffer+offset, 512,
EnumPrinters(param, NULL, level, (*buffer)+offset, 512,
&needed, &nprinters);
if (needed < 512)
needed = 512;
buffer = sresize(buffer, offset+needed, char);
*buffer = sresize(*buffer, offset+needed, char);
if (EnumPrinters(param, NULL, level, buffer+offset,
if (EnumPrinters(param, NULL, level, (*buffer)+offset,
needed, &needed, &nprinters) == 0)
return NULL;
return FALSE;
*nprinters_ptr += nprinters;
return buffer;
return TRUE;
}
printer_enum *printer_start_enum(int *nprinters_ptr)
{
printer_enum *ret = snew(printer_enum);
char *buffer = NULL, *retval;
char *buffer = NULL;
*nprinters_ptr = 0; /* default return value */
buffer = snewn(512, char);
@ -71,12 +71,9 @@ printer_enum *printer_start_enum(int *nprinters_ptr)
ret->enum_level = 4;
}
retval = printer_add_enum(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS,
ret->enum_level, buffer, 0, nprinters_ptr);
if (!retval)
if (!printer_add_enum(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS,
ret->enum_level, &buffer, 0, nprinters_ptr))
goto error;
else
buffer = retval;
switch (ret->enum_level) {
case 4: