diff options
-rw-r--r-- | xps/ghostxps.h | 4 | ||||
-rw-r--r-- | xps/xpscolor.c | 2 | ||||
-rw-r--r-- | xps/xpsdoc.c | 34 | ||||
-rw-r--r-- | xps/xpsglyphs.c | 2 | ||||
-rw-r--r-- | xps/xpsimage.c | 2 | ||||
-rw-r--r-- | xps/xpsmem.c | 65 | ||||
-rw-r--r-- | xps/xpspage.c | 2 | ||||
-rw-r--r-- | xps/xpsresource.c | 8 | ||||
-rw-r--r-- | xps/xpszip.c | 2 | ||||
-rw-r--r-- | xps/xpszipseek.c | 8 |
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); |