diff options
author | Chris Liddell <chris.liddell@artifex.com> | 2014-03-12 17:18:25 +0000 |
---|---|---|
committer | Chris Liddell <chris.liddell@artifex.com> | 2014-03-13 11:01:55 +0000 |
commit | fe0b8fcfb69246cbea99b85f453ed6c3c83f4592 (patch) | |
tree | fdb201849f2757be4a5728a1c2ac1507a7feaba9 | |
parent | 83b6646951fee8fe153d14d3e2d7da75894b922a (diff) | |
download | ghostpdl-fe0b8fcfb69246cbea99b85f453ed6c3c83f4592.tar.gz |
Bug 693380: raise file path/name size limit to 4k
And move as many cases of paths allocated on the stack to heap memory as is
reasonable.
No cluster differences.
-rw-r--r-- | gs/base/gdevdevn.c | 50 | ||||
-rw-r--r-- | gs/base/gp.h | 7 | ||||
-rw-r--r-- | gs/base/gsdevice.c | 83 | ||||
-rw-r--r-- | gs/base/gsiodisk.c | 366 | ||||
-rw-r--r-- | gs/base/gsiomacres.c | 28 | ||||
-rw-r--r-- | gs/base/gsparam2.c | 18 | ||||
-rw-r--r-- | gs/devices/gdevtsep.c | 188 | ||||
-rw-r--r-- | gs/devices/vector/gdevxps.c | 17 | ||||
-rw-r--r-- | gs/psi/zfile.c | 50 | ||||
-rw-r--r-- | xps/xpsjxr.c | 27 |
10 files changed, 567 insertions, 267 deletions
diff --git a/gs/base/gdevdevn.c b/gs/base/gdevdevn.c index 7a07980ef..de93faae8 100644 --- a/gs/base/gdevdevn.c +++ b/gs/base/gdevdevn.c @@ -276,8 +276,8 @@ devn_get_color_comp_index(gx_device * dev, gs_devn_params * pdevn_params, gs_separations * separations = &pdevn_params->separations; int sep_num = separations->num_separations++; /* We have a new spot colorant - put in stable memory to avoid "restore" */ - sep_name = gs_alloc_bytes(dev->memory->stable_memory, - name_size, "devn_get_color_comp_index"); + sep_name = gs_alloc_bytes(dev->memory->stable_memory, name_size, "devn_get_color_comp_index"); + memcpy(sep_name, pname, name_size); separations->names[sep_num].size = name_size; separations->names[sep_num].data = sep_name; @@ -2140,10 +2140,10 @@ spotcmyk_print_page(gx_device_printer * pdev, FILE * prn_stream) int pcmlinelength = 0; /* Initialize against indeterminizm in case of pdev->height == 0. */ int linelength[GX_DEVICE_COLOR_MAX_COMPONENTS]; byte *data; - char spotname[gp_file_name_sizeof]; + char *spotname = (char *)gs_alloc_bytes(pdev->memory, gp_file_name_sizeof, "spotcmyk_print_page(spotname)"); - if (in == NULL || buf == NULL) { - code = gs_error_VMerror; + if (in == NULL || buf == NULL || spotname == NULL) { + code = gs_note_error(gs_error_VMerror); goto prn_done; } /* @@ -2164,7 +2164,7 @@ spotcmyk_print_page(gx_device_printer * pdev, FILE * prn_stream) gs_sprintf(spotname, "%ss%d", pdevn->fname, i); spot_file[i] = gp_fopen(spotname, "wb"); if (spot_file[i] == NULL) { - code = gs_error_VMerror; + code = gs_note_error(gs_error_VMerror); goto prn_done; } } @@ -2197,13 +2197,13 @@ spotcmyk_print_page(gx_device_printer * pdev, FILE * prn_stream) code = devn_write_pcx_file(pdev, (char *) &pdevn->fname, npcmcolors, bpc, pcmlinelength); if (code < 0) - return code; + goto prn_done; } for(i = 0; i < nspot; i++) { gs_sprintf(spotname, "%ss%d", pdevn->fname, i); code = devn_write_pcx_file(pdev, spotname, 1, bpc, linelength[i]); if (code < 0) - return code; + goto prn_done; } /* Clean up and exit */ @@ -2216,6 +2216,8 @@ spotcmyk_print_page(gx_device_printer * pdev, FILE * prn_stream) gs_free_object(pdev->memory, in, "spotcmyk_print_page(in)"); if (buf != NULL) gs_free_object(pdev->memory, buf, "spotcmyk_print_page(buf)"); + if (spotname != NULL) + gs_free_object(pdev->memory, spotname, "spotcmyk_print_page(spotname)"); return code; } @@ -2526,19 +2528,26 @@ devn_write_pcx_file(gx_device_printer * pdev, char * filename, int ncomp, pcx_header header; int code; bool planar; - char outname[gp_file_name_sizeof]; - FILE * in; - FILE * out; + char *outname = (char *)gs_alloc_bytes(pdev->memory, gp_file_name_sizeof, "devn_write_pcx_file(outname)"); + FILE * in = NULL; + FILE * out = NULL; int depth = bpc_to_depth(ncomp, bpc); + if (outname == NULL) { + code = gs_note_error(gs_error_VMerror); + goto done; + } + in = gp_fopen(filename, "rb"); - if (!in) - return_error(gs_error_invalidfileaccess); + if (!in) { + code = gs_note_error(gs_error_invalidfileaccess); + goto done; + } gs_sprintf(outname, "%s.pcx", filename); out = gp_fopen(outname, "wb"); if (!out) { - fclose(in); - return_error(gs_error_invalidfileaccess); + code = gs_note_error(gs_error_invalidfileaccess); + goto done; } planar = devn_setup_pcx_header(pdev, &header, ncomp, bpc); @@ -2546,8 +2555,15 @@ devn_write_pcx_file(gx_device_printer * pdev, char * filename, int ncomp, if (code >= 0) code = devn_finish_pcx_file(pdev, out, &header, ncomp, bpc); - fclose(in); - fclose(out); +done: + if (in) + fclose(in); + if (out) + fclose(out); + + if (outname) + gs_free_object(pdev->memory, outname, "spotcmyk_print_page(outname)"); + return code; } diff --git a/gs/base/gp.h b/gs/base/gp.h index d1b8fa663..829a782fd 100644 --- a/gs/base/gp.h +++ b/gs/base/gp.h @@ -177,8 +177,13 @@ const char *gp_getenv_display(void); * parameter, but it would break too many clients to make this change now.) * Note that this is the size of the buffer, not the maximum number of * characters: the latter is one less, because of the terminating \0. + * + * This used to be 260, the same as the MAX_PATH value on Windows, + * but although MAX_PATH still exists on Windows, it is no longer + * the maximum length of a path - doh?? + * We now use 4k as a reasonable limit for most environments. */ -#define gp_file_name_sizeof 260 /* == MAX_PATH on Windows */ +#define gp_file_name_sizeof 4096 /* Define the character used for separating file names in a list. */ extern const char gp_file_name_list_separator; diff --git a/gs/base/gsdevice.c b/gs/base/gsdevice.c index f5ea88966..e57560f1c 100644 --- a/gs/base/gsdevice.c +++ b/gs/base/gsdevice.c @@ -1042,14 +1042,22 @@ int gx_device_delete_output_file(const gx_device * dev, const char *fname) { gs_parsed_file_name_t parsed; const char *fmt; - char pfname[gp_file_name_sizeof]; - int code = gx_parse_output_file_name(&parsed, &fmt, fname, strlen(fname), + char *pfname = (char *)gs_alloc_bytes(dev->memory, gp_file_name_sizeof, "gx_device_delete_output_file(pfname)"); + int code; + + if (pfname == NULL) { + code = gs_note_error(gs_error_VMerror); + goto done; + } + + code = gx_parse_output_file_name(&parsed, &fmt, fname, strlen(fname), dev->memory); + if (code < 0) { + goto done; + } - if (code < 0) - return code; if (parsed.iodev && !strcmp(parsed.iodev->dname, "%stdout%")) - return 0; + goto done; if (fmt) { /* filename includes "%nnd" */ long count1 = dev->PageCount + 1; @@ -1069,8 +1077,15 @@ int gx_device_delete_output_file(const gx_device * dev, const char *fname) parsed.len = strlen(parsed.fname); } if (parsed.iodev) - return (parsed.iodev->procs.delete_file((gx_io_device *)(&parsed.iodev), (const char *)parsed.fname)); - return_error(gs_error_invalidfileaccess); + code = parsed.iodev->procs.delete_file((gx_io_device *)(&parsed.iodev), (const char *)parsed.fname); + else + code = gs_note_error(gs_error_invalidfileaccess); + +done: + if (pfname != NULL) + gs_free_object(dev->memory, pfname, "gx_device_delete_output_file(pfname)"); + + return(code); } /* Open the output file for a device. */ @@ -1080,18 +1095,28 @@ gx_device_open_output_file(const gx_device * dev, char *fname, { gs_parsed_file_name_t parsed; const char *fmt; - char pfname[gp_file_name_sizeof]; - int code = gx_parse_output_file_name(&parsed, &fmt, fname, strlen(fname), - dev->memory); + char *pfname = (char *)gs_alloc_bytes(dev->memory, gp_file_name_sizeof, "gx_device_open_output_file(pfname)"); + int code; + + if (pfname == NULL) { + code = gs_note_error(gs_error_VMerror); + goto done; + } + + code = gx_parse_output_file_name(&parsed, &fmt, fname, strlen(fname), dev->memory); + if (code < 0) { + goto done; + } - if (code < 0) - return code; if (parsed.iodev && !strcmp(parsed.iodev->dname, "%stdout%")) { - if (parsed.fname) - return_error(gs_error_undefinedfilename); + if (parsed.fname) { + code = gs_note_error(gs_error_undefinedfilename); + goto done; + } *pfile = dev->memory->gs_lib_ctx->fstdout; /* Force stdout to binary. */ - return gp_setmode_binary(*pfile, true); + code = gp_setmode_binary(*pfile, true); + goto done; } else if (parsed.iodev && !strcmp(parsed.iodev->dname, "%pipe%")) { positionable = false; } @@ -1115,8 +1140,10 @@ gx_device_open_output_file(const gx_device * dev, char *fname, if (positionable || (parsed.iodev && parsed.iodev != iodev_default(dev->memory))) { char fmode[4]; - if (!parsed.fname) - return_error(gs_error_undefinedfilename); + if (!parsed.fname) { + code = gs_note_error(gs_error_undefinedfilename); + goto done; + } strcpy(fmode, gp_fmode_wb); if (positionable) strcat(fmode, "+"); @@ -1126,15 +1153,21 @@ gx_device_open_output_file(const gx_device * dev, char *fname, emprintf1(dev->memory, "**** Could not open the file %s .\n", parsed.fname); - return code; } - *pfile = gp_open_printer(dev->memory, (pfname[0] ? pfname : fname), binary); - if (*pfile) - return 0; - emprintf1(dev->memory, - "**** Could not open the file %s .\n", - (pfname[0] ? pfname : fname)); - return_error(gs_error_invalidfileaccess); + else { + *pfile = gp_open_printer(dev->memory, (pfname[0] ? pfname : fname), binary); + if (!(*pfile)) { + emprintf1(dev->memory, "**** Could not open the file %s .\n", (pfname[0] ? pfname : fname)); + + code = gs_note_error(gs_error_invalidfileaccess); + } + } + +done: + if (pfname != NULL) + gs_free_object(dev->memory, pfname, "gx_device_open_output_file(pfname)"); + + return(code); } /* Close the output file for a device. */ diff --git a/gs/base/gsiodisk.c b/gs/base/gsiodisk.c index ed6266262..243651fad 100644 --- a/gs/base/gsiodisk.c +++ b/gs/base/gsiodisk.c @@ -110,7 +110,7 @@ /* Function prototypes */ static iodev_proc_init(iodev_diskn_init); -static iodev_proc_gp_fopen(iodev_diskn_gp_fopen); +static iodev_proc_fopen(iodev_diskn_fopen); static iodev_proc_delete_file(diskn_delete); static iodev_proc_rename_file(diskn_rename); static iodev_proc_file_status(diskn_status); @@ -127,7 +127,7 @@ const gx_io_device varname = \ { \ diskname, "FileSystem", \ {iodev_diskn_init, iodev_no_open_device, \ - NULL /* no longer used */ , iodev_diskn_gp_fopen, iodev_os_fclose, \ + NULL /* no longer used */ , iodev_diskn_fopen, iodev_os_fclose, \ diskn_delete, diskn_rename, diskn_status, \ iodev_no_enumerate_files, /* Only until we have a root location */ \ diskn_enumerate_next, diskn_enumerate_close, \ @@ -163,7 +163,6 @@ gs_private_st_ptrs1(st_diskn_state, struct diskn_state_s, "diskn_state", #define TEMP_FILE_NAME "Tmp.txt" #define MAP_FILE_VERSION 1 #define InitialNumber 0 -#define BUFFER_LENGTH gp_file_name_sizeof typedef struct map_file_enum_s { FILE * stream; /* stream to map file */ @@ -175,13 +174,13 @@ typedef struct map_file_enum_s { gs_private_st_ptrs2(st_map_file_enum, struct map_file_enum_s, "map_file_enum", map_file_enum_enum_ptrs, map_file_enum_reloc_ptrs, pattern, root); -static void * map_file_enum_init(gs_memory_t *, const char *, const char *); +static void * map_file_enum_init(gs_memory_t *, const char *, const char *, uint); static bool map_file_enum_next(void *, char *); static void map_file_enum_close(void *); -static bool map_file_name_get(const char *, const char *, char *); -static void map_file_name_add(const char *, const char *); -static void map_file_name_ren(const char*, const char *, const char *); -static void map_file_name_del(const char *, const char *); +static bool map_file_name_get(gs_memory_t *, const char *, const char *, char *); +static void map_file_name_add(gs_memory_t *, const char *, const char *); +static void map_file_name_ren(gs_memory_t *, const char*, const char *, const char *); +static void map_file_name_del(gs_memory_t *, const char *, const char *); static int iodev_diskn_init(gx_io_device * iodev, gs_memory_t * mem) @@ -198,101 +197,159 @@ iodev_diskn_init(gx_io_device * iodev, gs_memory_t * mem) } static int -iodev_diskn_gp_fopen(gx_io_device * iodev, const char *fname, const char *access, +iodev_diskn_fopen(gx_io_device * iodev, const char *fname, const char *access, FILE ** pfile, char *rfname, uint rnamelen) { - char realname[gp_file_name_sizeof]; diskn_state * pstate = (diskn_state *)iodev->state; + char *realname = (char *)gs_alloc_bytes(pstate->memory, gp_file_name_sizeof, "iodev_diskn_fopen(realname)"); + int code = 0; + + if (realname == NULL) { + code = gs_note_error(gs_error_VMerror); + goto done; + } /* Exit if we do not have a root location */ - if (!pstate->root) - return_error(gs_error_undefinedfilename); + if (!pstate->root) { + code = gs_note_error(gs_error_undefinedfilename); + goto done; + } /* Remap filename (if it exists). */ - if (!map_file_name_get((char *)pstate->root, fname, realname)) { + if (!map_file_name_get(pstate->memory, (char *)pstate->root, fname, realname)) { if (strchr(access, 'w')) { - map_file_name_add(pstate->root, fname); - map_file_name_get(pstate->root, fname, realname); + map_file_name_add(pstate->memory, pstate->root, fname); + map_file_name_get(pstate->memory, pstate->root, fname, realname); } - else - return_error(gs_error_undefinedfilename); + else { + code = gs_note_error(gs_error_undefinedfilename); + goto done; + } } - return iodev_os_gp_fopen(iodev_default(pstate->memory), realname, access, pfile, rfname, rnamelen); + code = iodev_os_gp_fopen(iodev_default(pstate->memory), realname, access, pfile, rfname, rnamelen); + +done: + if (realname != NULL) + gs_free_object(pstate->memory, realname, "iodev_diskn_fopen(realname)"); + + return(code); } static int diskn_delete(gx_io_device * iodev, const char *fname) { - char realname[gp_file_name_sizeof]; diskn_state * pstate = (diskn_state *)iodev->state; + char *realname = (char *)gs_alloc_bytes(pstate->memory, gp_file_name_sizeof, "diskn_delete(realname)"); + int code = 0; + + if (realname == NULL) { + code = gs_note_error(gs_error_VMerror); + goto done; + } /* Exit if we do not have a root location */ - if (!pstate->root) - return_error(gs_error_undefinedfilename); + if (!pstate->root) { + code = gs_note_error(gs_error_undefinedfilename); + goto done; + } /* Map filename (if it exists). */ - if (!map_file_name_get((char *)pstate->root, fname, realname)) - return_error(gs_error_undefinedfilename); + if (!map_file_name_get(pstate->memory, (char *)pstate->root, fname, realname)) { + code = gs_note_error(gs_error_undefinedfilename); + goto done; + } + + map_file_name_del(pstate->memory, (char *)pstate->root, fname); + code = (unlink(realname) == 0 ? 0 : gs_note_error(gs_error_ioerror)); + +done: + if (realname != NULL) + gs_free_object(pstate->memory, realname, "diskn_delete(realname)"); - map_file_name_del((char *)pstate->root, fname); - return (unlink(realname) == 0 ? 0 : gs_error_ioerror); + return(code); } static int diskn_rename(gx_io_device * iodev, const char *from, const char *to) { - char toreal[gp_file_name_sizeof]; - int code = 0; diskn_state * pstate = (diskn_state *)iodev->state; + char *toreal = (char *)gs_alloc_bytes(pstate->memory, gp_file_name_sizeof, "diskn_rename(toreal)"); + int code = 0; + + if (toreal == NULL) { + code = gs_note_error(gs_error_VMerror); + goto done; + } /* Exit if we do not have a root location */ - if (!pstate->root) - return_error(gs_error_undefinedfilename); + if (!pstate->root) { + code = gs_note_error(gs_error_undefinedfilename); + goto done; + } /* if filenames are the same them we are done. */ - if (strcmp(to, from) == 0) - return 0; + if (strcmp(to, from) == 0) { + code = 0; + goto done; + } /* * If the destination file already exists, then we want to delete it. */ - if (map_file_name_get((char *)pstate->root, to, toreal)) { - map_file_name_del((char *)pstate->root, to); - code = unlink(toreal) == 0 ? 0 : gs_error_ioerror; + if (map_file_name_get(pstate->memory, (char *)pstate->root, to, toreal)) { + map_file_name_del(pstate->memory, (char *)pstate->root, to); + code = unlink(toreal) == 0 ? 0 : gs_note_error(gs_error_ioerror); } - map_file_name_ren((char *)pstate->root, from, to); - return code; + map_file_name_ren(pstate->memory, (char *)pstate->root, from, to); + +done: + if (toreal != NULL) + gs_free_object(pstate->memory, toreal, "diskn_rename(toreal)"); + + return(code); } static int diskn_status(gx_io_device * iodev, const char *fname, struct stat *pstat) { - char realname[gp_file_name_sizeof]; diskn_state * pstate = (diskn_state *)iodev->state; + char *realname = (char *)gs_alloc_bytes(pstate->memory, gp_file_name_sizeof, "diskn_status(realname)"); + int code = 0; + + if (realname == NULL) { + code = gs_note_error(gs_error_VMerror); + goto done; + } /* Exit if we do not have a root location */ - if (!pstate->root) - return_error(gs_error_undefinedfilename); + if (!pstate->root) { + code = gs_note_error(gs_error_undefinedfilename); + goto done; + } /* Map filename (if it exists). */ - if (!map_file_name_get((char *)pstate->root, fname, realname)) - return_error(gs_error_undefinedfilename); + if (!map_file_name_get(pstate->memory, (char *)pstate->root, fname, realname)) { + code = gs_note_error(gs_error_undefinedfilename); + } + + code = stat((char *)realname, pstat) < 0 ? gs_note_error(gs_error_undefinedfilename) : 0; - return (stat((char *)realname, pstat) < 0 ? gs_error_undefinedfilename : 0); +done: + if (realname != NULL) + gs_free_object(pstate->memory, realname, "diskn_status(realname)"); + + return(code); } static file_enum * -diskn_enumerate_files_init(gx_io_device * iodev, const char *pat, uint patlen, +diskn_enumerate_files(gx_io_device * iodev, const char *pat, uint patlen, gs_memory_t * mem) { - char patstr[gp_file_name_sizeof]; diskn_state * pstate = (diskn_state *)iodev->state; - - memcpy(patstr, pat, patlen); /* Copy string to buffer */ - patstr[patlen]=0; /* Terminate string */ - return (file_enum *)map_file_enum_init(mem, (char *)pstate->root, patstr); + + return (file_enum *)map_file_enum_init(mem, (char *)pstate->root, pat, patlen); } static void @@ -391,7 +448,7 @@ diskn_put_params(gx_io_device *iodev, gs_param_list *plist) return gs_error_VMerror; pstate->root_size = rootstr.size + 1; /* Now allow enumeration of files on the disk */ - iodev->procs.enumerate_files = diskn_enumerate_files_init; + iodev->procs.enumerate_files = diskn_enumerate_files; } memcpy(pstate->root, rootstr.data, rootstr.size); @@ -409,14 +466,25 @@ diskn_put_params(gx_io_device *iodev, gs_param_list *plist) * Returns - NULL if error, file structure pointer if no error */ static FILE * -MapFileOpen(const char * rootpath, const char * filename, const char * attributes) +MapFileOpen(gs_memory_t *mem, const char * rootpath, const char * filename, const char * attributes) { - char fullname[BUFFER_LENGTH]; + char *fullname = NULL; + FILE *f = NULL; + int totlen = strlen(rootpath) + strlen(filename) + 1; - if (strlen(rootpath) + strlen(filename) >= BUFFER_LENGTH) + if (totlen >= gp_file_name_sizeof) return NULL; - gs_sprintf(fullname, "%s%s", rootpath, filename); - return gp_fopen(fullname, attributes); + + fullname = (char *)gs_alloc_bytes(mem, totlen, "MapFileOpen(fullname)"); + if (fullname) { + + gs_sprintf(fullname, "%s%s", rootpath, filename); + f = gp_fopen(fullname, attributes); + + gs_free_object(mem, fullname , "MapFileOpen(fullname)"); + } + + return(f); } /* @@ -479,7 +547,7 @@ MapFileRead(FILE * mapfile, char * namebuf, int * value) /* Get the file name */ do { namebuf[count++] = c = fgetc(mapfile); - } while (count < BUFFER_LENGTH && c != EOF && c != '\n' && c != '\r'); + } while (count < gp_file_name_sizeof && c != EOF && c != '\n' && c != '\r'); namebuf[--count] = 0; /* Terminate file name */ /* Clean up any trailing linefeeds or carriage returns */ @@ -510,14 +578,21 @@ MapFileWrite(FILE * mapfile, const char * namebuf, int value) * filename - File name string */ static void -MapFileUnlink(const char * rootpath, const char * filename) +MapFileUnlink(gs_memory_t *mem, const char * rootpath, const char * filename) { - char fullname[BUFFER_LENGTH]; + char *fullname = NULL; + int totlen = strlen(rootpath) + strlen(filename) + 1; - if (strlen(rootpath) + strlen(filename) >= BUFFER_LENGTH) + if (totlen >= gp_file_name_sizeof) return; - gs_sprintf(fullname, "%s%s", rootpath, filename); - unlink(fullname); + fullname = (char *)gs_alloc_bytes(mem, totlen, "MapFileUnlink(fullname)"); + if (fullname) { + gs_sprintf(fullname, "%s%s", rootpath, filename); + + unlink(fullname); + + gs_free_object(mem, fullname , "MapFileUnlink(fullname)"); + } } /* @@ -528,18 +603,28 @@ MapFileUnlink(const char * rootpath, const char * filename) * newfilename - New file name string */ static void -MapFileRename(const char * rootpath, const char * newfilename, const char * oldfilename) +MapFileRename(gs_memory_t *mem, const char * rootpath, const char * newfilename, const char * oldfilename) { - char oldfullname[BUFFER_LENGTH]; - char newfullname[BUFFER_LENGTH]; + char *oldfullname = NULL; + char *newfullname = NULL; + int ototlen = strlen(rootpath) + strlen(oldfilename) + 1; + int ntotlen = strlen(rootpath) + strlen(newfilename) + 1; - if (strlen(rootpath) + strlen(oldfilename) >= BUFFER_LENGTH) + if (ototlen >= gp_file_name_sizeof) return; - if (strlen(rootpath) + strlen(newfilename) >= BUFFER_LENGTH) + if (ntotlen >= gp_file_name_sizeof) return; - gs_sprintf(oldfullname, "%s%s", rootpath, oldfilename); - gs_sprintf(newfullname, "%s%s", rootpath, newfilename); - rename(oldfullname, newfullname); + oldfullname = (char *)gs_alloc_bytes(mem, ototlen, "MapFileRename(oldfullname)"); + newfullname = (char *)gs_alloc_bytes(mem, ntotlen, "MapFileRename(newfullname)"); + + if (oldfullname && newfullname) { + gs_sprintf(oldfullname, "%s%s", rootpath, oldfilename); + gs_sprintf(newfullname, "%s%s", rootpath, newfilename); + rename(oldfullname, newfullname); + } + + gs_free_object(mem, oldfullname , "MapFileRename(oldfullname)"); + gs_free_object(mem, newfullname , "MapFileRename(newfullname)"); } /* @@ -552,14 +637,14 @@ MapFileRename(const char * rootpath, const char * newfilename, const char * oldf * returns -1 if file not found, file number if found. */ static int -MapToFile(const char* rootpath, const char* name) +MapToFile(gs_memory_t *mem, const char* rootpath, const char* name) { FILE * mapfile; int d = -1; - char filename[BUFFER_LENGTH]; + char *filename = NULL; int file_version; - mapfile = MapFileOpen(rootpath, MAP_FILE_NAME, "r"); + mapfile = MapFileOpen(mem, rootpath, MAP_FILE_NAME, "r"); if (mapfile == NULL) return -1; @@ -568,13 +653,15 @@ MapToFile(const char* rootpath, const char* name) if (MapFileReadVersion(mapfile, &file_version) && file_version == MAP_FILE_VERSION) { + filename = (char *)gs_alloc_bytes(mem, gp_file_name_sizeof, "MapToFile(filename)"); /* Scan the file looking for the given name */ - while (MapFileRead(mapfile, filename, &d)) { + while (filename && MapFileRead(mapfile, filename, &d)) { if (strcmp(filename, name) == 0) break; d = -1; } + gs_free_object(mem, filename, "MapToFile(filename)"); } fclose(mapfile); return d; @@ -591,7 +678,7 @@ MapToFile(const char* rootpath, const char* name) * Returns: NULL if error, else pointer to enumeration structure. */ static void * -map_file_enum_init(gs_memory_t * mem, const char * root_name, const char * search_pattern) +map_file_enum_init(gs_memory_t *mem, const char * root_name, const char * search_pattern, uint search_pattern_len) { int file_version; map_file_enum * mapfileenum = gs_alloc_struct(mem, map_file_enum, &st_map_file_enum, @@ -603,13 +690,15 @@ map_file_enum_init(gs_memory_t * mem, const char * root_name, const char * searc mapfileenum->memory = mem; if (search_pattern) { - mapfileenum->pattern = (char *)gs_alloc_bytes(mem, strlen(search_pattern) + 1, + mapfileenum->pattern = (char *)gs_alloc_bytes(mem, search_pattern_len + 1, "diskn:enum_init(pattern)"); if (mapfileenum->pattern == NULL) { map_file_enum_close((file_enum *) mapfileenum); return NULL; } - strcpy(mapfileenum->pattern, search_pattern); + memcpy(mapfileenum->pattern, search_pattern, search_pattern_len); + /* Terminate string */ + mapfileenum->pattern[search_pattern_len] = '\0'; } mapfileenum->root = (char *)gs_alloc_bytes(mem, strlen(root_name) + 1, @@ -619,10 +708,10 @@ map_file_enum_init(gs_memory_t * mem, const char * root_name, const char * searc return NULL; } - if (strlen(root_name) >= BUFFER_LENGTH) + if (strlen(root_name) >= gp_file_name_sizeof) return NULL; strcpy(mapfileenum->root, root_name); - mapfileenum->stream = MapFileOpen(root_name, MAP_FILE_NAME, "r"); + mapfileenum->stream = MapFileOpen(mem, root_name, MAP_FILE_NAME, "r"); /* Check the mapping file version number */ if (mapfileenum->stream != NULL @@ -704,13 +793,13 @@ map_file_enum_close(void * enum_mem) * osname char* resulting os specific path to the file */ static bool -map_file_name_get(const char * root_name, const char * Fname, char * osname) +map_file_name_get(gs_memory_t *mem, const char * root_name, const char * Fname, char * osname) { - int d = MapToFile(root_name, Fname); + int d = MapToFile(mem, root_name, Fname); if (d != -1) { /* 20 characters are enough for even a 64 bit integer */ - if ((strlen(root_name) + 20) < BUFFER_LENGTH) { + if ((strlen(root_name) + 20) < gp_file_name_sizeof) { gs_sprintf(osname, "%s%d", root_name, d); return true; } @@ -729,32 +818,37 @@ map_file_name_get(const char * root_name, const char * Fname, char * osname) * Fname char* name of the entry to add to the map */ static void -map_file_name_del(const char * root_name, const char * Fname) +map_file_name_del(gs_memory_t *mem, const char * root_name, const char * Fname) { /* search for target entry */ - int d = MapToFile(root_name, Fname); + int d = MapToFile(mem, root_name, Fname); int file_version; + char *name = NULL; - if (d != -1) { /* if the file exists ... */ - char name[BUFFER_LENGTH]; + name = (char *)gs_alloc_bytes(mem, gp_file_name_sizeof, "map_file_name_del(name)"); + + if (name && d != -1) { /* if the file exists ... */ FILE* newMap; FILE* oldMap; /* Open current map file and a working file */ - MapFileUnlink(root_name, TEMP_FILE_NAME ); - newMap = MapFileOpen(root_name, TEMP_FILE_NAME, "w"); - if (newMap == NULL) + MapFileUnlink(mem, root_name, TEMP_FILE_NAME ); + newMap = MapFileOpen(mem, root_name, TEMP_FILE_NAME, "w"); + if (newMap == NULL) { + gs_free_object(mem, name , "map_file_name_del(name)"); return; - oldMap = MapFileOpen(root_name, MAP_FILE_NAME, "r"); + } + oldMap = MapFileOpen(mem, root_name, MAP_FILE_NAME, "r"); if (oldMap != NULL && (!MapFileReadVersion(oldMap, &file_version) || file_version != MAP_FILE_VERSION)) { fclose(oldMap); oldMap= NULL; } if (oldMap == NULL) { + gs_free_object(mem, name , "map_file_name_del(name)"); fclose(newMap); - MapFileUnlink(root_name, TEMP_FILE_NAME); + MapFileUnlink(mem, root_name, TEMP_FILE_NAME); return; } @@ -766,9 +860,10 @@ map_file_name_del(const char * root_name, const char * Fname) MapFileWrite(newMap, name, d); fclose(newMap); fclose(oldMap); - MapFileUnlink(root_name, MAP_FILE_NAME); - MapFileRename(root_name, MAP_FILE_NAME, TEMP_FILE_NAME); + MapFileUnlink(mem, root_name, MAP_FILE_NAME); + MapFileRename(mem, root_name, MAP_FILE_NAME, TEMP_FILE_NAME); } + gs_free_object(mem, name, "map_file_name_del(name)"); } /* @@ -780,51 +875,55 @@ map_file_name_del(const char * root_name, const char * Fname) * Fname char* name of the entry to add to the map */ static void -map_file_name_add(const char * root_name, const char * Fname) +map_file_name_add(gs_memory_t *mem, const char * root_name, const char * Fname) { /* * add entry to map file * entry number is one greater than biggest number */ - char name[BUFFER_LENGTH]; + char *name = NULL; int d; int dmax = -1; int file_version; FILE* newMap; FILE* oldMap; - oldMap = MapFileOpen(root_name, MAP_FILE_NAME, "r"); - if (oldMap != NULL && (!MapFileReadVersion(oldMap, &file_version) - || file_version != MAP_FILE_VERSION)) { - fclose(oldMap); - oldMap = NULL; - } - if (oldMap == NULL) { - oldMap = MapFileOpen(root_name, MAP_FILE_NAME, "w"); - if (!oldMap) - return; - MapFileWriteVersion(oldMap, MAP_FILE_VERSION); - MapFileWrite(oldMap, Fname, InitialNumber); - fclose(oldMap); - } - else { - MapFileUnlink(root_name, TEMP_FILE_NAME); - newMap = MapFileOpen(root_name, TEMP_FILE_NAME, "w"); - if (newMap != NULL) { - MapFileWriteVersion(newMap, MAP_FILE_VERSION); - while (MapFileRead(oldMap, name, &d)) { - MapFileWrite(newMap, name, d); - if (dmax < d) - dmax = d; - } - - dmax += 1; - MapFileWrite(newMap, Fname, dmax); - fclose(newMap); + name = (char *)gs_alloc_bytes(mem, gp_file_name_sizeof, "map_file_name_add(name)"); + if (name) { + oldMap = MapFileOpen(mem, root_name, MAP_FILE_NAME, "r"); + if (oldMap != NULL && (!MapFileReadVersion(oldMap, &file_version) + || file_version != MAP_FILE_VERSION)) { fclose(oldMap); - MapFileUnlink(root_name, MAP_FILE_NAME); - MapFileRename(root_name, MAP_FILE_NAME, TEMP_FILE_NAME); + oldMap = NULL; + } + if (oldMap == NULL) { + oldMap = MapFileOpen(mem, root_name, MAP_FILE_NAME, "w"); + if (!oldMap) + return; + MapFileWriteVersion(oldMap, MAP_FILE_VERSION); + MapFileWrite(oldMap, Fname, InitialNumber); + fclose(oldMap); + } + else { + MapFileUnlink(mem, root_name, TEMP_FILE_NAME); + newMap = MapFileOpen(mem, root_name, TEMP_FILE_NAME, "w"); + if (newMap != NULL) { + MapFileWriteVersion(newMap, MAP_FILE_VERSION); + while (MapFileRead(oldMap, name, &d)) { + MapFileWrite(newMap, name, d); + if (dmax < d) + dmax = d; + } + + dmax += 1; + MapFileWrite(newMap, Fname, dmax); + fclose(newMap); + fclose(oldMap); + MapFileUnlink(mem, root_name, MAP_FILE_NAME); + MapFileRename(mem, root_name, MAP_FILE_NAME, TEMP_FILE_NAME); + } } + gs_free_object(mem, name , "map_file_name_add(name)"); } } @@ -838,25 +937,25 @@ map_file_name_add(const char * root_name, const char * Fname) * newname char* name to change the entry indicated by oldname into */ static void -map_file_name_ren(const char* root_name, const char * oldname, const char * newname) +map_file_name_ren(gs_memory_t *mem, const char* root_name, const char * oldname, const char * newname) { /* search for target entry */ - int d = MapToFile(root_name, oldname); + int d = MapToFile(mem, root_name, oldname); int file_version; + char *name = (char *)gs_alloc_bytes(mem, gp_file_name_sizeof, "map_file_name_ren(name)"); - if (d != -1) { /* if target exists ... */ - char name[BUFFER_LENGTH]; + if (name && d != -1) { /* if target exists ... */ FILE* newMap; FILE* oldMap; /* Open current map file and a working file */ - MapFileUnlink(root_name, TEMP_FILE_NAME ); - newMap = MapFileOpen(root_name, TEMP_FILE_NAME, "w"); + MapFileUnlink(mem, root_name, TEMP_FILE_NAME ); + newMap = MapFileOpen(mem, root_name, TEMP_FILE_NAME, "w"); if (newMap == NULL) return; - oldMap = MapFileOpen(root_name, MAP_FILE_NAME, "r"); + oldMap = MapFileOpen(mem, root_name, MAP_FILE_NAME, "r"); if (oldMap != NULL && (!MapFileReadVersion(oldMap, &file_version) || file_version != MAP_FILE_VERSION)) { fclose(oldMap); @@ -864,7 +963,7 @@ map_file_name_ren(const char* root_name, const char * oldname, const char * newn } if (oldMap == NULL) { fclose(newMap); - MapFileUnlink(root_name, TEMP_FILE_NAME); + MapFileUnlink(mem, root_name, TEMP_FILE_NAME); return; } @@ -878,7 +977,8 @@ map_file_name_ren(const char* root_name, const char * oldname, const char * newn MapFileWrite(newMap, newname, d); fclose(newMap); fclose(oldMap); - MapFileUnlink(root_name, MAP_FILE_NAME); - MapFileRename(root_name, MAP_FILE_NAME, TEMP_FILE_NAME); + MapFileUnlink(mem, root_name, MAP_FILE_NAME); + MapFileRename(mem, root_name, MAP_FILE_NAME, TEMP_FILE_NAME); } + gs_free_object(mem, name ,"map_file_name_ren(name)"); } diff --git a/gs/base/gsiomacres.c b/gs/base/gsiomacres.c index 3b59231f0..064d5d7ad 100644 --- a/gs/base/gsiomacres.c +++ b/gs/base/gsiomacres.c @@ -369,16 +369,21 @@ static int iodev_macresource_open_file(gx_io_device *iodev, const char *fname, uint namelen, const char *access, stream **ps, gs_memory_t *mem) { - char filename[gp_file_name_sizeof]; + char filename = gs_alloc_bytes(dev->memory, gp_file_name_sizeof, "iodev_macresource_open_file(filename)"); char *res_type_string, *res_id_string; uint type; ushort id; bool datafork = 0; - int size; + int size, code; byte *buf; /* return NULL if there's an error */ *ps = NULL; + + if (filename == NULL) { + code = gs_note_error(gs_error_VMerror); + goto done; + } strncpy(filename, fname, min(namelen, gp_file_name_sizeof)); if (namelen < gp_file_name_sizeof) filename[namelen] = '\0'; @@ -387,13 +392,15 @@ iodev_macresource_open_file(gx_io_device *iodev, const char *fname, uint namelen res_type_string = strrchr(filename, '#'); if (res_type_string == NULL) { if_debug0('s', "[s] couldn't find resource type separator\n"); - return_error(e_invalidfileaccess); + code = gs_note_error(e_invalidfileaccess); + goto done; } *res_type_string++ = '\0'; res_id_string = strrchr(res_type_string, '+'); if (res_id_string == NULL) { if_debug0('s', "couldn't find resource id separator\n"); - return_error(e_invalidfileaccess); + code = gs_note_error(e_invalidfileaccess); + goto done; } *res_id_string++ = '\0'; type = res_string2type(res_type_string); @@ -411,7 +418,8 @@ iodev_macresource_open_file(gx_io_device *iodev, const char *fname, uint namelen datafork = true; } else { if_debug0('s', "could not get resource size\n"); - return_error(e_invalidfileaccess); + code = gs_note_error(e_invalidfileaccess); + goto done; } } if_debug1('s', "[s] got resource size %d bytes\n", size); @@ -419,7 +427,8 @@ iodev_macresource_open_file(gx_io_device *iodev, const char *fname, uint namelen buf = gs_alloc_string(mem, size, "macresource buffer"); if (buf == NULL) { if_debug0('s', "macresource: could not allocate buffer for resource data\n"); - return_error(e_VMerror); + code = gs_note_error(e_VMerror); + goto done; } /* call again to get the resource data */ if (!datafork) { @@ -432,6 +441,9 @@ iodev_macresource_open_file(gx_io_device *iodev, const char *fname, uint namelen *ps = s_alloc(mem, "macresource"); sread_string(*ps, buf, size); - /* return success */ - return 0; +done: + if (pfname != NULL) + gs_free_object(dev->memory, filename, "iodev_macresource_open_file(filename)"); + + return (code); } diff --git a/gs/base/gsparam2.c b/gs/base/gsparam2.c index 5aa1f47a4..bd54a0998 100644 --- a/gs/base/gsparam2.c +++ b/gs/base/gsparam2.c @@ -24,7 +24,7 @@ #include "gserrors.h" #include "gsparams.h" -#define MAX_PARAM_KEY 255 +#define MAX_PARAM_KEY gp_file_name_sizeof /* ---------------- Serializer ---------------- */ @@ -42,6 +42,11 @@ gs_param_list_puts(stream *dest, gs_param_list *list) int code = 0; gs_param_enumerator_t key_enum; gs_param_key_t key; + char *string_key = gs_alloc_bytes(dest->memory, MAX_PARAM_KEY + 1, "gs_param_list_puts(string_key)"); + + if (!string_key) { + return_error(gs_error_VMerror); + } param_init_enumerator(&key_enum); @@ -72,7 +77,6 @@ gs_param_list_puts(stream *dest, gs_param_list *list) /* Get next datum & put its type & key to stream */ gs_param_typed_value value; - char string_key[MAX_PARAM_KEY + 1]; if (sizeof(string_key) < key.size + 1) { code = gs_note_error(gs_error_rangecheck); @@ -155,6 +159,8 @@ string_array: sput_word(dest, size); break; } + gs_free_object(dest->memory, string_key, "gs_param_list_puts(string_key)"); + /* Write end marker, which is an (illegal) 0 key length */ return (code < 0 ? code : sput_word(dest, 0)); } @@ -200,6 +206,11 @@ int gs_param_list_gets(stream *src, gs_param_list *list, gs_memory_t *mem) { int code = 0; + char *string_key = gs_alloc_bytes(dest->memory, MAX_PARAM_KEY + 1, "gs_param_list_gets(string_key)"); + + if (!string_key) { + return_error(gs_error_VMerror); + } do { gs_param_typed_value typed; @@ -210,7 +221,6 @@ gs_param_list_gets(stream *src, gs_param_list *list, gs_memory_t *mem) void *data; uint size; gs_param_type type; - char string_key[MAX_PARAM_KEY + 1]; /* key length 0 indicates end of data */ if ((code = sget_word(src, &key_sizeof)) < 0 || @@ -340,6 +350,8 @@ put: if (code < 0) } while (code >= 0); + gs_free_object(dest->memory, string_key, "gs_param_list_gets(string_key)"); + return code; } diff --git a/gs/devices/gdevtsep.c b/gs/devices/gdevtsep.c index 400413c3a..76160fafe 100644 --- a/gs/devices/gdevtsep.c +++ b/gs/devices/gdevtsep.c @@ -502,7 +502,6 @@ tiffcmyk_print_page(gx_device_printer * pdev, FILE * file) /* ---------- The tiffsep device ------------ */ #define NUM_CMYK_COMPONENTS 4 -#define MAX_FILE_NAME_SIZE gp_file_name_sizeof #define MAX_COLOR_VALUE 255 /* We are using 8 bits per colorant */ /* The device descriptor */ @@ -1226,7 +1225,7 @@ tiffsep1_prn_close(gx_device * pdev) int num_std_colorants = tfdev->devn_params.num_std_colorant_names; int num_order = tfdev->devn_params.num_separation_order_names; int num_spot = tfdev->devn_params.separations.num_separations; - char name[MAX_FILE_NAME_SIZE]; + char *name= NULL; int code = gdev_prn_close(pdev); short map_comp_to_sep[GX_DEVICE_COLOR_MAX_COMPONENTS]; int comp_num; @@ -1237,15 +1236,26 @@ tiffsep1_prn_close(gx_device * pdev) if (code < 0) return code; + + name = (char *)gs_alloc_bytes(pdev->memory, gp_file_name_sizeof, "tiffsep1_prn_close(name)"); + if (!name) + return_error(gs_error_VMerror); + code = gx_parse_output_file_name(&parsed, &fmt, tfdev->fname, strlen(tfdev->fname), pdev->memory); - if (code < 0) - return code; + if (code < 0) { + goto done; + } /* If we are doing separate pages, delete the old default file */ if (parsed.iodev == iodev_default(pdev->memory)) { /* filename includes "%nnd" */ + char *compname = (char *)gs_alloc_bytes(pdev->memory, gp_file_name_sizeof, "tiffsep1_prn_close(compname)"); + if (!compname) { + code = gs_note_error(gs_error_VMerror); + goto done; + } + if (fmt) { - char compname[MAX_FILE_NAME_SIZE]; long count1 = pdev->PageCount; while (*fmt != 'l' && *fmt != '%') @@ -1258,7 +1268,7 @@ tiffsep1_prn_close(gx_device * pdev) } else { parsed.iodev->procs.delete_file(parsed.iodev, tfdev->fname); } - + gs_free_object(pdev->memory, compname, "tiffsep1_prn_close(compname)"); } if (tfdev->close_files) { @@ -1269,12 +1279,14 @@ tiffsep1_prn_close(gx_device * pdev) int sep_num = map_comp_to_sep[comp_num]; code = create_separation_file_name((tiffsep_device *)tfdev, name, - MAX_FILE_NAME_SIZE, sep_num, true); - if (code < 0) - return code; + gp_file_name_sizeof, sep_num, true); + if (code < 0) { + goto done; + } code = gx_device_close_output_file(pdev, name, tfdev->sep_file[comp_num]); - if (code < 0) - return code; + if (code < 0) { + goto done; + } tfdev->sep_file[comp_num] = NULL; } if (tfdev->tiff[comp_num]) { @@ -1287,7 +1299,12 @@ tiffsep1_prn_close(gx_device * pdev) if( tfdev->thresholds[0].dstart != NULL) { sep1_free_thresholds(tfdev); } - return 0; + +done: + + if (name) + gs_free_object(pdev->memory, name, "tiffsep1_prn_close(name)"); + return code; } @@ -1664,19 +1681,24 @@ tiffsep_prn_close(gx_device * pdev) int num_std_colorants = pdevn->devn_params.num_std_colorant_names; int num_order = pdevn->devn_params.num_separation_order_names; int num_spot = pdevn->devn_params.separations.num_separations; - char name[MAX_FILE_NAME_SIZE]; + char *name = NULL; int code; int comp_num; int num_comp = number_output_separations(num_dev_comp, num_std_colorants, num_order, num_spot); + name = (char *)gs_alloc_bytes(pdev->memory, gp_file_name_sizeof, "tiffsep_prn_close(name)"); + if (!name) + return_error(gs_error_VMerror); + if (pdevn->tiff_comp && pdevn->close_files) { TIFFCleanup(pdevn->tiff_comp); pdevn->tiff_comp = NULL; } code = gdev_prn_close(pdev); - if (code < 0) - return code; + if (code < 0) { + goto done; + } if (pdevn->close_files) { /* Close the separation files */ @@ -1685,17 +1707,23 @@ tiffsep_prn_close(gx_device * pdev) int sep_num = pdevn->devn_params.separation_order_map[comp_num]; code = create_separation_file_name(pdevn, name, - MAX_FILE_NAME_SIZE, sep_num, true); - if (code < 0) - return code; + gp_file_name_sizeof, sep_num, true); + if (code < 0) { + goto done; + } code = tiffsep_close_sep_file(pdevn, name, comp_num); - if (code < 0) - return code; + if (code < 0) { + goto done; + } } } } - return 0; +done: + + if (name) + gs_free_object(pdev->memory, name, "tiffsep_prn_close(name)"); + return code; } /* @@ -2101,7 +2129,7 @@ tiffsep_print_page(gx_device_printer * pdev, FILE * file) int num_spot = tfdev->devn_params.separations.num_separations; int num_comp, comp_num, sep_num, code = 0, code1 = 0; cmyk_composite_map cmyk_map[GX_DEVICE_COLOR_MAX_COMPONENTS]; - char name[MAX_FILE_NAME_SIZE]; + char *name = NULL; int base_filename_length = length_base_file_name(tfdev); int save_depth = pdev->color_info.depth; int save_numcomps = pdev->color_info.num_components; @@ -2115,12 +2143,15 @@ tiffsep_print_page(gx_device_printer * pdev, FILE * file) int width = gx_downscaler_scale(tfdev->width, factor); int height = gx_downscaler_scale(tfdev->height, factor); + name = (char *)gs_alloc_bytes(pdev->memory, gp_file_name_sizeof, "tiffsep_print_page(name)"); + if (!name) + return_error(gs_error_VMerror); /* Print the names of the spot colors */ if (num_order == 0) { for (sep_num = 0; sep_num < num_spot; sep_num++) { copy_separation_name(tfdev, name, - MAX_FILE_NAME_SIZE - base_filename_length - SUFFIX_SIZE, sep_num); + gp_file_name_sizeof - base_filename_length - SUFFIX_SIZE, sep_num); dmlprintf1(pdev->memory, "%%%%SeparationName: %s\n", name); } } @@ -2142,12 +2173,15 @@ tiffsep_print_page(gx_device_printer * pdev, FILE * file) } code = gx_device_open_output_file((gx_device *)pdev, pdev->fname, true, true, &(tfdev->comp_file)); - if (code < 0) - return code; + if (code < 0) { + goto done; + } tfdev->tiff_comp = tiff_from_filep(pdev, pdev->dname, tfdev->comp_file, tfdev->BigEndian, tfdev->UseBigTIFF); - if (!tfdev->tiff_comp) - return_error(gs_error_invalidfileaccess); + if (!tfdev->tiff_comp) { + code = gs_note_error(gs_error_invalidfileaccess); + goto done; + } } code = tiff_set_fields_for_printer(pdev, tfdev->tiff_comp, factor, 0); @@ -2161,8 +2195,9 @@ tiffsep_print_page(gx_device_printer * pdev, FILE * file) } pdev->color_info.depth = save_depth; - if (code < 0) - return code; + if (code < 0) { + goto done; + } /* Set up the separation output files */ num_comp = number_output_separations( tfdev->color_info.num_components, @@ -2175,36 +2210,45 @@ tiffsep_print_page(gx_device_printer * pdev, FILE * file) for (comp_num = 0; comp_num < num_comp; comp_num++ ) { int sep_num = tfdev->devn_params.separation_order_map[comp_num]; - code = create_separation_file_name(tfdev, name, MAX_FILE_NAME_SIZE, + code = create_separation_file_name(tfdev, name, gp_file_name_sizeof, sep_num, true); - if (code < 0) - return code; + if (code < 0) { + goto done; + } /* Open the separation file, if not already open */ if (tfdev->sep_file[comp_num] == NULL) { code = gx_device_open_output_file((gx_device *)pdev, name, true, true, &(tfdev->sep_file[comp_num])); - if (code < 0) - return code; + if (code < 0) { + goto done; + } tfdev->tiff[comp_num] = tiff_from_filep(pdev, name, tfdev->sep_file[comp_num], tfdev->BigEndian, tfdev->UseBigTIFF); - if (!tfdev->tiff[comp_num]) - return_error(gs_error_ioerror); + if (!tfdev->tiff[comp_num]) { + code = gs_note_error(gs_error_ioerror); + goto done; + } } pdev->color_info.depth = dst_bpc; /* Create files for 8 bit gray */ pdev->color_info.num_components = 1; if (tfdev->Compression==COMPRESSION_NONE && height*8/dst_bpc > ((unsigned long) 0xFFFFFFFF - (file ? ftell(file): 0))/width) /* note width is never 0 in print_page */ - return_error(gs_error_rangecheck); /* this will overflow 32 bits */ + { + code = gs_note_error(gs_error_rangecheck); /* this will overflow 32 bits */ + goto done; + } + code = tiff_set_fields_for_printer(pdev, tfdev->tiff[comp_num], factor, 0); tiff_set_gray_fields(pdev, tfdev->tiff[comp_num], dst_bpc, tfdev->Compression, tfdev->MaxStripSize); pdev->color_info.depth = save_depth; pdev->color_info.num_components = save_numcomps; - if (code < 0) - return code; + if (code < 0) { + goto done; + } } build_cmyk_map(tfdev, num_comp, cmyk_map); @@ -2220,6 +2264,10 @@ tiffsep_print_page(gx_device_printer * pdev, FILE * file) sep_line = gs_alloc_bytes(pdev->memory, cmyk_raster, "tiffsep_print_page"); + if (!sep_line) { + code = gs_note_error(gs_error_VMerror); + goto done; + } for (comp_num = 0; comp_num < num_comp; comp_num++ ) TIFFCheckpointDirectory(tfdev->tiff[comp_num]); @@ -2249,7 +2297,7 @@ tiffsep_print_page(gx_device_printer * pdev, FILE * file) "tiffsep_print_page"); params.data[comp_num] = planes[comp_num]; if (params.data[comp_num] == NULL) { - code = gs_error_VMerror; + code = gs_note_error(gs_error_VMerror); goto cleanup; } } @@ -2270,7 +2318,7 @@ tiffsep_print_page(gx_device_printer * pdev, FILE * file) /* Assign the new plane to the appropriate position */ params.data[plane_index] = planes[plane_count]; if (params.data[plane_index] == NULL) { - code = gs_error_VMerror; + code = gs_note_error(gs_error_VMerror); goto cleanup; } plane_count += 1; @@ -2289,7 +2337,7 @@ tiffsep_print_page(gx_device_printer * pdev, FILE * file) "tiffsep_print_page"); params.data[comp_num] = planes[comp_num]; if (params.data[comp_num] == NULL) { - code = gs_error_VMerror; + code = gs_note_error(gs_error_VMerror); goto cleanup; } } @@ -2369,7 +2417,7 @@ cleanup: if (fmt) { int sep_num = tfdev->devn_params.separation_order_map[comp_num]; - code = create_separation_file_name(tfdev, name, MAX_FILE_NAME_SIZE, sep_num, false); + code = create_separation_file_name(tfdev, name, gp_file_name_sizeof, sep_num, false); if (code < 0) { code1 = code; continue; @@ -2389,6 +2437,10 @@ cleanup: code = code1; } } + +done: + if (name) + gs_free_object(pdev->memory, name, "tiffsep_print_page(name)"); return code; } @@ -2408,7 +2460,7 @@ tiffsep1_print_page(gx_device_printer * pdev, FILE * file) int num_spot = tfdev->devn_params.separations.num_separations; int num_comp, comp_num, code = 0, code1 = 0; short map_comp_to_sep[GX_DEVICE_COLOR_MAX_COMPONENTS]; - char name[MAX_FILE_NAME_SIZE]; + char *name = NULL; int save_depth = pdev->color_info.depth; int save_numcomps = pdev->color_info.num_components; const char *fmt; @@ -2418,6 +2470,10 @@ tiffsep1_print_page(gx_device_printer * pdev, FILE * file) if (tfdev->thresholds[0].dstart == NULL) return_error(gs_error_rangecheck); + name = (char *)gs_alloc_bytes(pdev->memory, gp_file_name_sizeof, "tiffsep1_print_page(name)"); + if (!name) + return_error(gs_error_VMerror); + build_comp_to_sep_map((tiffsep_device *)tfdev, map_comp_to_sep); /* @@ -2430,8 +2486,12 @@ tiffsep1_print_page(gx_device_printer * pdev, FILE * file) /* If the output file is on disk and the name contains a page #, */ /* then delete the previous file. */ if (pdev->file != NULL && parsed.iodev == iodev_default(pdev->memory) && fmt) { - char compname[MAX_FILE_NAME_SIZE]; long count1 = pdev->PageCount; + char *compname = (char *)gs_alloc_bytes(pdev->memory, gp_file_name_sizeof, "tiffsep1_print_page(compname)"); + if (!compname) { + code = gs_note_error(gs_error_VMerror); + goto done; + } gx_device_close_output_file((gx_device *)pdev, pdev->fname, pdev->file); pdev->file = NULL; @@ -2444,8 +2504,12 @@ tiffsep1_print_page(gx_device_printer * pdev, FILE * file) gs_sprintf(compname, parsed.fname, (int)count1); parsed.iodev->procs.delete_file(parsed.iodev, compname); /* we always need an open printer (it will get deleted in tiffsep1_prn_close */ - if ((code = gdev_prn_open_printer((gx_device *)pdev, 1)) < 0) - return code; + code = gdev_prn_open_printer((gx_device *)pdev, 1); + + gs_free_object(pdev->memory, compname, "tiffsep_print_page(compname)"); + if (code < 0) { + goto done; + } } /* Set up the separation output files */ @@ -2455,21 +2519,25 @@ tiffsep1_print_page(gx_device_printer * pdev, FILE * file) int sep_num = map_comp_to_sep[comp_num]; code = create_separation_file_name((tiffsep_device *)tfdev, name, - MAX_FILE_NAME_SIZE, sep_num, true); - if (code < 0) - return code; + gp_file_name_sizeof, sep_num, true); + if (code < 0) { + goto done; + } /* Open the separation file, if not already open */ if (tfdev->sep_file[comp_num] == NULL) { code = gx_device_open_output_file((gx_device *)pdev, name, true, true, &(tfdev->sep_file[comp_num])); - if (code < 0) - return code; + if (code < 0) { + goto done; + } tfdev->tiff[comp_num] = tiff_from_filep(pdev, name, tfdev->sep_file[comp_num], tfdev->BigEndian, tfdev->UseBigTIFF); - if (!tfdev->tiff[comp_num]) - return_error(gs_error_ioerror); + if (!tfdev->tiff[comp_num]) { + code = gs_note_error(gs_error_ioerror); + goto done; + } } pdev->color_info.depth = 8; /* Create files for 8 bit gray */ @@ -2478,8 +2546,9 @@ tiffsep1_print_page(gx_device_printer * pdev, FILE * file) tiff_set_gray_fields(pdev, tfdev->tiff[comp_num], 1, tfdev->Compression, tfdev->MaxStripSize); pdev->color_info.depth = save_depth; pdev->color_info.num_components = save_numcomps; - if (code < 0) - return code; + if (code < 0) { + goto done; + } } /* end initialization of separation files */ @@ -2612,7 +2681,7 @@ tiffsep1_print_page(gx_device_printer * pdev, FILE * file) if (fmt) { int sep_num = map_comp_to_sep[comp_num]; - code = create_separation_file_name((tiffsep_device *)tfdev, name, MAX_FILE_NAME_SIZE, sep_num, false); + code = create_separation_file_name((tiffsep_device *)tfdev, name, gp_file_name_sizeof, sep_num, false); if (code < 0) { code1 = code; continue; @@ -2637,8 +2706,11 @@ cleanup: */ if (non_encodable_count) { dmlprintf1(pdev->memory, "WARNING: Non encodable pixels = %d\n", non_encodable_count); - return_error(gs_error_rangecheck); + code = gs_note_error(gs_error_rangecheck); } +done: + if (name) + gs_free_object(pdev->memory, name, "tiffsep1_print_page(name)"); return code; } diff --git a/gs/devices/vector/gdevxps.c b/gs/devices/vector/gdevxps.c index 37b651147..b61a0fc58 100644 --- a/gs/devices/vector/gdevxps.c +++ b/gs/devices/vector/gdevxps.c @@ -376,12 +376,23 @@ zip_append_data(gs_memory_t *mem, gx_device_xps_zinfo_t *info, byte *data, uint /* if there is no data then this is the first call for this archive file, open a temporary file to store the data. */ if (info->data.count == 0) { - char filename[gp_file_name_sizeof]; - FILE *fp = gp_open_scratch_file(mem, "xpsdata-", + char *filename = + (char *)gs_alloc_bytes(mem, gp_file_name_sizeof, "zip_append_data(filename)"); + FILE *fp; + + if (!filename) { + return(gs_throw_code(gs_error_VMerror)); + } + + fp = gp_open_scratch_file(mem, "xpsdata-", filename, "wb+"); - if (fp == NULL) + + if (fp == NULL) { + gs_free_object(mem, filename, "zip_append_data(filename)"); return gs_throw_code(gs_error_Fatal); + } unlink(filename); + gs_free_object(mem, filename, "zip_append_data(filename)"); info->data.fp = fp; } diff --git a/gs/psi/zfile.c b/gs/psi/zfile.c index 6061d3189..e092bed9c 100644 --- a/gs/psi/zfile.c +++ b/gs/psi/zfile.c @@ -665,8 +665,8 @@ ztempfile(i_ctx_t *i_ctx_p) const char *pstr; char fmode[4]; int code = parse_file_access_string(op, fmode); - char prefix[gp_file_name_sizeof]; - char fname[gp_file_name_sizeof]; + char *prefix = NULL; + char *fname= NULL; uint fnlen; FILE *sfile; stream *s; @@ -674,6 +674,13 @@ ztempfile(i_ctx_t *i_ctx_p) if (code < 0) return code; + prefix = (char *)gs_alloc_bytes(imemory, gp_file_name_sizeof, "ztempfile(prefix)"); + fname = (char *)gs_alloc_bytes(imemory, gp_file_name_sizeof, "ztempfile(fname)"); + if (!prefix || !fname) { + code = gs_note_error(gs_error_VMerror); + goto done; + } + strcat(fmode, gp_fmode_binary_suffix); if (r_has_type(op - 1, t_null)) pstr = gp_scratch_file_name_prefix; @@ -682,8 +689,10 @@ ztempfile(i_ctx_t *i_ctx_p) check_read_type(op[-1], t_string); psize = r_size(op - 1); - if (psize >= gp_file_name_sizeof) - return_error(e_rangecheck); + if (psize >= gp_file_name_sizeof) { + code = gs_note_error(e_rangecheck); + goto done; + } memcpy(prefix, op[-1].value.const_bytes, psize); prefix[psize] = 0; pstr = prefix; @@ -692,29 +701,37 @@ ztempfile(i_ctx_t *i_ctx_p) if (gp_file_name_is_absolute(pstr, strlen(pstr))) { if (check_file_permissions(i_ctx_p, pstr, strlen(pstr), "PermitFileWriting") < 0) { - return_error(e_invalidfileaccess); + code = gs_note_error(e_invalidfileaccess); + goto done; } } else if (!prefix_is_simple(pstr)) { - return_error(e_invalidfileaccess); + code = gs_note_error(e_invalidfileaccess); + goto done; } s = file_alloc_stream(imemory, "ztempfile(stream)"); - if (s == 0) - return_error(e_VMerror); + if (s == 0) { + code = gs_note_error(e_VMerror); + goto done; + } buf = gs_alloc_bytes(imemory, file_default_buffer_size, "ztempfile(buffer)"); - if (buf == 0) - return_error(e_VMerror); + if (buf == 0) { + code = gs_note_error(e_VMerror); + goto done; + } sfile = gp_open_scratch_file(imemory, pstr, fname, fmode); if (sfile == 0) { gs_free_object(imemory, buf, "ztempfile(buffer)"); - return_error(e_invalidfileaccess); + code = gs_note_error(e_invalidfileaccess); + goto done; } fnlen = strlen(fname); sbody = ialloc_string(fnlen, ".tempfile(fname)"); if (sbody == 0) { gs_free_object(imemory, buf, "ztempfile(buffer)"); - return_error(e_VMerror); + code = gs_note_error(e_VMerror); + goto done; } memcpy(sbody, fname, fnlen); file_init_stream(s, sfile, fmode, buf, file_default_buffer_size); @@ -724,10 +741,17 @@ ztempfile(i_ctx_t *i_ctx_p) sclose(s); iodev_dflt->procs.delete_file(iodev_dflt, fname); ifree_string(sbody, fnlen, ".tempfile(fname)"); - return_error(e_VMerror); + code = gs_note_error(e_VMerror); + goto done; } make_string(op - 1, a_readonly | icurrent_space, fnlen, sbody); make_stream_file(op, s, fmode); + +done: + if (prefix) + gs_free_object(imemory, prefix, "ztempfile(prefix)"); + if (fname) + gs_free_object(imemory, fname, "ztempfile(fname)"); return code; } diff --git a/xps/xpsjxr.c b/xps/xpsjxr.c index b5bb6c8c4..90c5d3d08 100644 --- a/xps/xpsjxr.c +++ b/xps/xpsjxr.c @@ -168,27 +168,37 @@ int xps_decode_jpegxr(xps_context_t *ctx, byte *buf, int len, xps_image_t *output) { FILE *file; - char name[gp_file_name_sizeof]; + char *name = xps_alloc(ctx, gp_file_name_sizeof); struct state state; jxr_container_t container; jxr_image_t image; int offset, alpha_offset; int rc; + + if (!name) { + return gs_throw(gs_error_VMerror, "cannot allocate scratch file name buffer"); + } memset(output, 0, sizeof(*output)); file = gp_open_scratch_file(ctx->memory, "jpegxr-scratch-", name, "wb+"); - if (!file) + if (!file) { + xps_free(ctx, name); return gs_throw(gs_error_invalidfileaccess, "cannot open scratch file"); + } rc = fwrite(buf, 1, len, file); - if (rc != len) + if (rc != len) { + xps_free(ctx, name); return gs_throw(gs_error_invalidfileaccess, "cannot write to scratch file"); + } fseek(file, 0, SEEK_SET); container = jxr_create_container(); rc = jxr_read_image_container(container, file); - if (rc < 0) + if (rc < 0) { + xps_free(ctx, name); return gs_throw1(-1, "jxr_read_image_container: %s", jxr_error_string(rc)); + } offset = jxrc_image_offset(container, 0); alpha_offset = jxrc_alpha_offset(container, 0); @@ -215,8 +225,10 @@ xps_decode_jpegxr(xps_context_t *ctx, byte *buf, int len, xps_image_t *output) fseek(file, offset, SEEK_SET); rc = jxr_read_image_bitstream(image, file); - if (rc < 0) + if (rc < 0) { + xps_free(ctx, name); return gs_throw1(-1, "jxr_read_image_bitstream: %s", jxr_error_string(rc)); + } jxr_destroy(image); @@ -241,8 +253,10 @@ xps_decode_jpegxr(xps_context_t *ctx, byte *buf, int len, xps_image_t *output) fseek(file, alpha_offset, SEEK_SET); rc = jxr_read_image_bitstream(image, file); - if (rc < 0) + if (rc < 0) { + xps_free(ctx, name); return gs_throw1(-1, "jxr_read_image_bitstream: %s", jxr_error_string(rc)); + } jxr_destroy(image); } @@ -251,6 +265,7 @@ xps_decode_jpegxr(xps_context_t *ctx, byte *buf, int len, xps_image_t *output) fclose(file); unlink(name); + xps_free(ctx, name); return gs_okay; } |