From 9e553991e4c99814eb342d83b4fb42b5af457390 Mon Sep 17 00:00:00 2001 From: Shailesh Mistry Date: Fri, 8 May 2020 21:50:30 +0100 Subject: [PATCH] Bug 697545 : Prevent numerous memory leaks. Prevent memory leaks by propagating error codes and freeing loose objects. Also resolve some compiler warnings. Error created using :- EMENTO_FAILAT=19484 ./membin/gpcl6 -sDEVICE=pbmraw -o /dev/null ./tests_private/pcl/pcl5efts/fts.0051 --- base/gscspace.c | 11 +++++++---- base/gxclrast.c | 10 ++++++++-- base/gxcpath.c | 4 +++- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/base/gscspace.c b/base/gscspace.c index aa3e3cf..f00bdba 100644 --- a/base/gscspace.c +++ b/base/gscspace.c @@ -329,8 +329,11 @@ gx_install_DeviceGray(gs_color_space * pcs, gs_gstate * pgs) return 0; /* If we haven't initialised the iccmanager, do it now. */ - if (pgs->icc_manager->default_gray == NULL) - gsicc_init_iccmanager(pgs); + if (pgs->icc_manager->default_gray == NULL) { + int code = gsicc_init_iccmanager(pgs); + if (code < 0) + return code; + } /* pcs takes a reference to the default_gray profile data */ pcs->cmm_icc_profile_data = pgs->icc_manager->default_gray; @@ -677,7 +680,7 @@ int gx_set_overprint_cmyk(const gs_color_space * pcs, gs_gstate * pgs) } if_debug1m(gs_debug_flag_overprint, pgs->memory, - "[overprint] gx_set_overprint_cmyk. drawn_comps = 0x%x\n", drawn_comps); + "[overprint] gx_set_overprint_cmyk. drawn_comps = 0x%x\n", (uint)drawn_comps); if (drawn_comps == 0) return gx_spot_colors_set_overprint(pcs, pgs); @@ -760,7 +763,7 @@ int gx_set_overprint_cmyk(const gs_color_space * pcs, gs_gstate * pgs) if_debug2m(gs_debug_flag_overprint, pgs->memory, "[overprint] gx_set_overprint_cmyk. retain_any_comps = %d, drawn_comps = 0x%x\n", - params.retain_any_comps, params.drawn_comps); + params.retain_any_comps, (uint)(params.drawn_comps)); /* We are in CMYK, the profiles match and overprint is true. Set effective overprint mode to overprint mode but only if effective has not already diff --git a/base/gxclrast.c b/base/gxclrast.c index 4e75d3e..65df9bd 100644 --- a/base/gxclrast.c +++ b/base/gxclrast.c @@ -612,6 +612,8 @@ in: /* Initialize for a new page. */ memset(&gs_gstate, 0, sizeof(gs_gstate)); GS_STATE_INIT_VALUES_CLIST((&gs_gstate)); code = gs_gstate_initialize(&gs_gstate, mem); + if (code < 0) + goto out; gs_gstate.device = tdev; gs_gstate.view_clip = NULL; /* Avoid issues in pdf14 fill stroke */ gs_gstate.clip_path = &clip_path; @@ -620,7 +622,9 @@ in: /* Initialize for a new page. */ code = gs_note_error(gs_error_VMerror); goto out; } - pcs->type->install_cspace(pcs, &gs_gstate); + code = pcs->type->install_cspace(pcs, &gs_gstate); + if (code < 0) + goto out; gs_gstate.color[0].color_space = pcs; rc_increment_cs(pcs); gs_gstate.color[1].color_space = pcs; @@ -2383,6 +2387,8 @@ idata: data_size = 0; if (code < 0) { if (pfs.dev != NULL) term_patch_fill_state(&pfs); + gs_free_object(mem, pcs, "clist_playback_band(pcs)"); + gs_free_object(mem, cbuf_storage, "clist_playback_band(cbuf_storage)"); gx_cpath_free(&clip_path, "clist_playback_band"); if (pcpath != &clip_path) gx_cpath_free(pcpath, "clist_playback_band"); diff --git a/base/gxcpath.c b/base/gxcpath.c index d9518b8..082c389 100644 --- a/base/gxcpath.c +++ b/base/gxcpath.c @@ -403,8 +403,10 @@ gx_cpath_path_list_new(gs_memory_t *mem, gx_clip_path *pcpath, int rule, rc_init_free(pcplist, mem, 1, rc_free_cpath_path_list); if (pcpath!=NULL && !pcpath->path_valid) { code = gx_path_init_contained_shared(&pcplist->path, NULL, mem, cname); - if (code < 0) + if (code < 0) { + gs_free_object(mem, pcplist, "gx_cpath_path_list_new"); return code; + } code = gx_cpath_to_path(pcpath, &pcplist->path); } else { gx_path_init_local(&pcplist->path, mem); -- 1.8.3.1