summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--xps/ghostxps.h4
-rw-r--r--xps/xpscolor.c2
-rw-r--r--xps/xpsdoc.c34
-rw-r--r--xps/xpsglyphs.c2
-rw-r--r--xps/xpsimage.c2
-rw-r--r--xps/xpsmem.c65
-rw-r--r--xps/xpspage.c2
-rw-r--r--xps/xpsresource.c8
-rw-r--r--xps/xpszip.c2
-rw-r--r--xps/xpszipseek.c8
10 files changed, 92 insertions, 37 deletions
diff --git a/xps/ghostxps.h b/xps/ghostxps.h
index 8b125dc08..78bdfa19a 100644
--- a/xps/ghostxps.h
+++ b/xps/ghostxps.h
@@ -137,7 +137,7 @@ size_t xps_strlcat(char *destination, const char *source, size_t size);
int xps_strcasecmp(char *a, char *b);
char *xps_strdup_imp(xps_context_t *ctx, const char *str, const char *function);
char *xps_clean_path(char *name);
-void xps_absolute_path(char *output, char *base_uri, char *path);
+void xps_absolute_path(char *output, char *base_uri, char *path, int output_size);
/* end of page device callback foo */
int xps_show_page(xps_context_t *ctx, int num_copies, int flush);
@@ -286,7 +286,7 @@ struct xps_part_s
xps_part_t *xps_read_zip_part(xps_context_t *ctx, char *name);
-void xps_part_name_from_relation_part_name(char *output, char *name);
+void xps_part_name_from_relation_part_name(char *output, char *name, int output_size);
xps_part_t *xps_new_part(xps_context_t *ctx, char *name, int capacity);
xps_part_t *xps_find_part(xps_context_t *ctx, char *name);
diff --git a/xps/xpscolor.c b/xps/xpscolor.c
index f398360a2..0c3d9cc0c 100644
--- a/xps/xpscolor.c
+++ b/xps/xpscolor.c
@@ -154,7 +154,7 @@ xps_parse_color(xps_context_t *ctx, char *base_uri, char *string, gs_color_space
/* Find ICC colorspace part */
- xps_absolute_path(partname, base_uri, profile);
+ xps_absolute_path(partname, base_uri, profile, sizeof partname);
part = xps_read_part(ctx, partname);
if (!part)
return gs_throw1(-1, "cannot find icc profile part '%s'", partname);
diff --git a/xps/xpsdoc.c b/xps/xpsdoc.c
index d5f2aab61..06720bef3 100644
--- a/xps/xpsdoc.c
+++ b/xps/xpsdoc.c
@@ -172,16 +172,16 @@ xps_read_part(xps_context_t *ctx, char *name)
*/
void
-xps_part_name_from_relation_part_name(char *output, char *name)
+xps_part_name_from_relation_part_name(char *output, char *name, int output_size)
{
char *p, *q;
- strcpy(output, name);
+ xps_strlcpy(output, name, output_size);
p = strstr(output, "_rels/");
q = strstr(name, "_rels/");
if (p)
{
*p = 0;
- strcat(output, q + 6);
+ xps_strlcat(output, q + 6, output_size);
}
p = strstr(output, ".rels");
if (p)
@@ -432,8 +432,8 @@ xps_parse_metadata_imp(void *zp, char *name, char **atts)
if (target && type)
{
- xps_part_name_from_relation_part_name(realpart, ctx->part_uri);
- xps_absolute_path(tgtbuf, ctx->base_uri, target);
+ xps_part_name_from_relation_part_name(realpart, ctx->part_uri, sizeof realpart);
+ xps_absolute_path(tgtbuf, ctx->base_uri, target, sizeof tgtbuf);
xps_add_relation(ctx, realpart, tgtbuf, type);
}
}
@@ -451,7 +451,7 @@ xps_parse_metadata_imp(void *zp, char *name, char **atts)
if (source)
{
- xps_absolute_path(srcbuf, ctx->base_uri, source);
+ xps_absolute_path(srcbuf, ctx->base_uri, source, sizeof srcbuf);
xps_add_fixed_document(ctx, srcbuf);
}
}
@@ -475,7 +475,7 @@ xps_parse_metadata_imp(void *zp, char *name, char **atts)
if (source)
{
- xps_absolute_path(srcbuf, ctx->base_uri, source);
+ xps_absolute_path(srcbuf, ctx->base_uri, source, sizeof srcbuf);
xps_add_fixed_page(ctx, srcbuf, width, height);
}
}
@@ -489,7 +489,7 @@ xps_parse_metadata(xps_context_t *ctx, xps_part_t *part)
char *s;
/* Save directory name part */
- strcpy(buf, part->name);
+ xps_strlcpy(buf, part->name, sizeof buf);
s = strrchr(buf, '/');
if (s)
s[0] = 0;
@@ -551,7 +551,7 @@ xps_parse_color_relation(xps_context_t *ctx, char *string)
/* "ContextColor /Resources/Foo.icc 1,0.3,0.5,1.0" */
- strcpy(buf, string);
+ xps_strlcpy(buf, string, sizeof buf);
sp = strchr(buf, ' ');
if (sp)
{
@@ -560,7 +560,7 @@ xps_parse_color_relation(xps_context_t *ctx, char *string)
if (ep)
{
*ep = 0;
- xps_absolute_path(path, ctx->base_uri, sp);
+ xps_absolute_path(path, ctx->base_uri, sp, sizeof path);
xps_trim_url(path);
xps_add_relation(ctx, ctx->part_uri, path, REL_REQUIRED_RESOURCE);
}
@@ -578,7 +578,7 @@ xps_parse_image_relation(xps_context_t *ctx, char *string)
if (strstr(string, "{ColorConvertedBitmap") == string)
{
- strcpy(buf, string);
+ xps_strlcpy(buf, string, sizeof buf);
sp = strchr(buf, ' ');
if (sp)
{
@@ -587,7 +587,7 @@ xps_parse_image_relation(xps_context_t *ctx, char *string)
if (ep)
{
*ep = 0;
- xps_absolute_path(path, ctx->base_uri, sp);
+ xps_absolute_path(path, ctx->base_uri, sp, sizeof path);
xps_trim_url(path);
xps_add_relation(ctx, ctx->part_uri, path, REL_REQUIRED_RESOURCE);
@@ -596,7 +596,7 @@ xps_parse_image_relation(xps_context_t *ctx, char *string)
if (ep)
{
*ep = 0;
- xps_absolute_path(path, ctx->base_uri, sp);
+ xps_absolute_path(path, ctx->base_uri, sp, sizeof path);
xps_trim_url(path);
xps_add_relation(ctx, ctx->part_uri, path, REL_REQUIRED_RESOURCE);
}
@@ -605,7 +605,7 @@ xps_parse_image_relation(xps_context_t *ctx, char *string)
}
else
{
- xps_absolute_path(path, ctx->base_uri, string);
+ xps_absolute_path(path, ctx->base_uri, string, sizeof path);
xps_trim_url(path);
xps_add_relation(ctx, ctx->part_uri, path, REL_REQUIRED_RESOURCE);
}
@@ -631,7 +631,7 @@ xps_parse_content_relations_imp(void *zp, char *ns_name, char **atts)
{
if (!strcmp(atts[i], "FontUri"))
{
- xps_absolute_path(path, ctx->base_uri, atts[i+1]);
+ xps_absolute_path(path, ctx->base_uri, atts[i+1], sizeof path);
xps_trim_url(path);
xps_add_relation(ctx, ctx->part_uri, path, REL_REQUIRED_RESOURCE);
}
@@ -651,7 +651,7 @@ xps_parse_content_relations_imp(void *zp, char *ns_name, char **atts)
{
if (!strcmp(atts[i], "Source"))
{
- xps_absolute_path(path, ctx->base_uri, atts[i+1]);
+ xps_absolute_path(path, ctx->base_uri, atts[i+1], sizeof path);
xps_trim_url(path);
xps_add_relation(ctx, ctx->part_uri, path, REL_REQUIRED_RESOURCE_RECURSIVE);
}
@@ -681,7 +681,7 @@ xps_parse_content_relations(xps_context_t *ctx, xps_part_t *part)
char *s;
/* Set current directory for resolving relative path names */
- strcpy(buf, part->name);
+ xps_strlcpy(buf, part->name, sizeof buf);
s = strrchr(buf, '/');
if (s)
s[0] = 0;
diff --git a/xps/xpsglyphs.c b/xps/xpsglyphs.c
index f6be20762..4f666277c 100644
--- a/xps/xpsglyphs.c
+++ b/xps/xpsglyphs.c
@@ -558,7 +558,7 @@ xps_parse_glyphs(xps_context_t *ctx,
* Find and load the font resource
*/
- xps_absolute_path(partname, base_uri, font_uri_att);
+ xps_absolute_path(partname, base_uri, font_uri_att, sizeof partname);
subfont = strrchr(partname, '#');
if (subfont)
{
diff --git a/xps/xpsimage.c b/xps/xpsimage.c
index 6e33805d2..5d34c70de 100644
--- a/xps/xpsimage.c
+++ b/xps/xpsimage.c
@@ -309,7 +309,7 @@ xps_find_image_brush_source_part(xps_context_t *ctx, char *base_uri, xps_item_t
dprintf2("warning: ignoring color profile '%s' associated with image '%s'\n",
profile_name, image_name);
- xps_absolute_path(partname, base_uri, image_name);
+ xps_absolute_path(partname, base_uri, image_name, sizeof partname);
part = xps_read_part(ctx, partname);
if (!part)
return gs_throw1(-1, "cannot find image resource part '%s'", partname);
diff --git a/xps/xpsmem.c b/xps/xpsmem.c
index 2dd49cfe9..3081f3218 100644
--- a/xps/xpsmem.c
+++ b/xps/xpsmem.c
@@ -54,6 +54,61 @@ xps_strdup_imp(xps_context_t *ctx, const char *str, const char *cname)
return cpy;
}
+size_t
+xps_strlcpy(char *dst, const char *src, size_t siz)
+{
+ register char *d = dst;
+ register const char *s = src;
+ register int n = siz;
+
+ /* Copy as many bytes as will fit */
+ if (n != 0 && --n != 0) {
+ do {
+ if ((*d++ = *s++) == 0)
+ break;
+ } while (--n != 0);
+ }
+
+ /* Not enough room in dst, add NUL and traverse rest of src */
+ if (n == 0) {
+ if (siz != 0)
+ *d = '\0'; /* NUL-terminate dst */
+ while (*s++)
+ ;
+ }
+
+ return(s - src - 1); /* count does not include NUL */
+}
+
+size_t
+xps_strlcat(char *dst, const char *src, size_t siz)
+{
+ register char *d = dst;
+ register const char *s = src;
+ register int n = siz;
+ int dlen;
+
+ /* Find the end of dst and adjust bytes left but don't go past end */
+ while (*d != '\0' && n-- != 0)
+ d++;
+ dlen = d - dst;
+ n = siz - dlen;
+
+ if (n == 0)
+ return dlen + strlen(s);
+ while (*s != '\0') {
+ if (n != 1) {
+ *d++ = *s;
+ n--;
+ }
+ s++;
+ }
+ *d = '\0';
+
+ return dlen + (s - src); /* count does not include NUL */
+}
+
+
#define SEP(x) ((x)=='/' || (x) == 0)
char *
@@ -112,17 +167,17 @@ xps_clean_path(char *name)
}
void
-xps_absolute_path(char *output, char *base_uri, char *path)
+xps_absolute_path(char *output, char *base_uri, char *path, int output_size)
{
if (path[0] == '/')
{
- strcpy(output, path);
+ xps_strlcpy(output, path, output_size);
}
else
{
- strcpy(output, base_uri);
- strcat(output, "/");
- strcat(output, path);
+ xps_strlcpy(output, base_uri, output_size);
+ xps_strlcat(output, "/", output_size);
+ xps_strlcat(output, path, output_size);
}
xps_clean_path(output);
}
diff --git a/xps/xpspage.c b/xps/xpspage.c
index ea9211fa5..6f1a6e0f6 100644
--- a/xps/xpspage.c
+++ b/xps/xpspage.c
@@ -123,7 +123,7 @@ xps_parse_fixed_page(xps_context_t *ctx, xps_part_t *part)
if (xps_doc_trace)
dprintf1("doc: parsing page %s\n", part->name);
- strcpy(base_uri, part->name);
+ xps_strlcpy(base_uri, part->name, sizeof base_uri);
s = strrchr(base_uri, '/');
if (s)
s[1] = 0;
diff --git a/xps/xpsresource.c b/xps/xpsresource.c
index 9af6afd6e..76e29f209 100644
--- a/xps/xpsresource.c
+++ b/xps/xpsresource.c
@@ -43,7 +43,7 @@ xps_parse_resource_reference(xps_context_t *ctx, xps_resource_t *dict, char *att
if (strstr(att, "{StaticResource ") != att)
return NULL;
- strcpy(name, att + 16);
+ xps_strlcpy(name, att + 16, sizeof name);
s = strrchr(name, '}');
if (s)
*s = 0;
@@ -78,7 +78,7 @@ xps_parse_remote_resource_dictionary(xps_context_t *ctx, char *base_uri, char *s
char *s;
/* External resource dictionaries MUST NOT reference other resource dictionaries */
- xps_absolute_path(part_name, base_uri, source_att);
+ xps_absolute_path(part_name, base_uri, source_att, sizeof part_name);
part = xps_read_part(ctx, part_name);
if (!part)
{
@@ -99,7 +99,7 @@ xps_parse_remote_resource_dictionary(xps_context_t *ctx, char *base_uri, char *s
return NULL;
}
- strcpy(part_uri, part_name);
+ xps_strlcpy(part_uri, part_name, sizeof part_uri);
s = strrchr(part_uri, '/');
if (s)
s[1] = 0;
@@ -158,7 +158,7 @@ xps_parse_resource_dictionary(xps_context_t *ctx, char *base_uri, xps_item_t *ro
if (head)
{
head->base_uri = xps_alloc(ctx, strlen(base_uri) + 1);
- strcpy(head->base_uri, base_uri);
+ xps_strlcpy(head->base_uri, base_uri, sizeof head->base_uri);
}
return head;
diff --git a/xps/xpszip.c b/xps/xpszip.c
index bbae70f7d..1aab5b5d5 100644
--- a/xps/xpszip.c
+++ b/xps/xpszip.c
@@ -165,7 +165,7 @@ xps_process_part(xps_context_t *ctx, xps_part_t *part)
{
char realname[1024];
xps_part_t *realpart;
- xps_part_name_from_relation_part_name(realname, part->name);
+ xps_part_name_from_relation_part_name(realname, part->name, sizeof realname);
realpart = xps_find_part(ctx, realname);
if (realpart)
{
diff --git a/xps/xpszipseek.c b/xps/xpszipseek.c
index 55ca44385..2ee8fb08a 100644
--- a/xps/xpszipseek.c
+++ b/xps/xpszipseek.c
@@ -151,8 +151,8 @@ xps_read_zip_entry(xps_context_t *ctx, char *name, xps_entry_t *ent)
xps_part_t *part;
int code;
- strcpy(buf, "/");
- strcat(buf, name);
+ xps_strlcpy(buf, "/", sizeof buf);
+ xps_strlcat(buf, name, sizeof buf);
part = xps_find_part(ctx, buf);
if (!part)
@@ -197,8 +197,8 @@ xps_read_zip_interleaved_entries(xps_context_t *ctx, char *name, int count, int
int code;
int i;
- strcpy(buf, "/");
- strcat(buf, name);
+ xps_strlcpy(buf, "/", sizeof buf);
+ xps_strlcat(buf, name, sizeof buf);
if (xps_zip_trace)
dprintf3("zip: interleaved part '%s' pieces=%d size=%d\n", buf, count, size);