summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Liddell <chris.liddell@artifex.com>2013-06-18 16:50:17 +0100
committerChris Liddell <chris.liddell@artifex.com>2013-06-19 08:41:25 +0100
commitfea396d5d3202bf3c6b1207b5c8a17b979d0bb4f (patch)
treefe77a8ba0d23b8c8b794d272460e9d0bf375f8c1
parent95cd6ab8bf3a8866a5a10571a0c034869a4ba064 (diff)
downloadghostpdl-fea396d5d3202bf3c6b1207b5c8a17b979d0bb4f.tar.gz
Bug 694318: remove reference to freed resource
When we're about to free a PDF resource object in pdfwrite, make sure we remove references to it in the substream stack. No cluster differences
-rw-r--r--gs/devices/vector/gdevpdf.c2
-rw-r--r--gs/devices/vector/gdevpdfu.c15
2 files changed, 16 insertions, 1 deletions
diff --git a/gs/devices/vector/gdevpdf.c b/gs/devices/vector/gdevpdf.c
index 5b8750799..e5cb00e56 100644
--- a/gs/devices/vector/gdevpdf.c
+++ b/gs/devices/vector/gdevpdf.c
@@ -2781,8 +2781,8 @@ pdf_close(gx_device * dev)
cos_release(pres->object, "free function dict");
gs_free_object(pdev->pdf_memory, pres->object, "free function resources");
pres->object = 0;
- pnext = pres->next;
}
+ pnext = pres->next;
pres = pnext;
}
}
diff --git a/gs/devices/vector/gdevpdfu.c b/gs/devices/vector/gdevpdfu.c
index cc8986672..e8fd5272d 100644
--- a/gs/devices/vector/gdevpdfu.c
+++ b/gs/devices/vector/gdevpdfu.c
@@ -1131,6 +1131,21 @@ pdf_forget_resource(gx_device_pdf * pdev, pdf_resource_t *pres1, pdf_resource_ty
pdf_resource_t **pprev = &pdev->last_resource;
int i;
+ /* since we're about to free the resource, we can just set
+ any of these references to null
+ */
+ for (i = 0; i < pdev->sbstack_size; i++) {
+ if (pres1 == pdev->sbstack[i].font3) {
+ pdev->sbstack[i].font3 = NULL;
+ }
+ else if (pres1 == pdev->sbstack[i].accumulating_substream_resource) {
+ pdev->sbstack[i].accumulating_substream_resource = NULL;
+ }
+ else if (pres1 == pdev->sbstack[i].pres_soft_mask_dict) {
+ pdev->sbstack[i].pres_soft_mask_dict = NULL;
+ }
+ }
+
for (; (pres = *pprev) != 0; pprev = &pres->prev)
if (pres == pres1) {
*pprev = pres->prev;