diff --git a/xps/xps_common.c b/xps/xps_common.c index eddef1b..31c2a5e 100644 --- a/xps/xps_common.c +++ b/xps/xps_common.c @@ -89,7 +89,7 @@ xps_begin_opacity(xps_document *doc, fz_matrix ctm, fz_rect area, if (scb_color_att) { fz_colorspace *colorspace; - float samples[32]; + float samples[FZ_MAX_COLORS]; xps_parse_color(doc, base_uri, scb_color_att, &colorspace, samples); opacity = opacity * samples[0]; } @@ -208,12 +208,13 @@ void xps_parse_color(xps_document *doc, char *base_uri, char *string, fz_colorspace **csp, float *samples) { + fz_context *ctx = doc->ctx; char *p; int i, n; char buf[1024]; char *profile; - *csp = fz_device_rgb; + *csp = fz_device_rgb; samples[0] = 1; samples[1] = 0; @@ -259,7 +260,7 @@ xps_parse_color(xps_document *doc, char *base_uri, char *string, profile = strchr(buf, ' '); if (!profile) { - fz_warn(doc->ctx, "cannot find icc profile uri in '%s'", string); + fz_warn(ctx, "cannot find icc profile uri in '%s'", string); return; } @@ -267,15 +268,20 @@ xps_parse_color(xps_document *doc, char *base_uri, char *string, p = strchr(profile, ' '); if (!p) { - fz_warn(doc->ctx, "cannot find component values in '%s'", profile); + fz_warn(ctx, "cannot find component values in '%s'", profile); return; } *p++ = 0; n = count_commas(p) + 1; + if (n > FZ_MAX_COLORS) + { + fz_warn(ctx, "ignoring %d color components (max %d allowed)", n - FZ_MAX_COLORS, FZ_MAX_COLORS); + n = FZ_MAX_COLORS; + } i = 0; - while (i < n) - { + while (i < n) + { samples[i++] = fz_atof(p); p = strchr(p, ','); if (!p) @@ -292,10 +298,10 @@ xps_parse_color(xps_document *doc, char *base_uri, char *string, /* TODO: load ICC profile */ switch (n) { - case 2: *csp = fz_device_gray; break; - case 4: *csp = fz_device_rgb; break; - case 5: *csp = fz_device_cmyk; break; - default: *csp = fz_device_gray; break; + case 2: *csp = fz_device_gray; break; + case 4: *csp = fz_device_rgb; break; + case 5: *csp = fz_device_cmyk; break; + default: *csp = fz_device_gray; break; } } } diff --git a/xps/xps_glyphs.c b/xps/xps_glyphs.c index 6b26201..5a4faf0 100644 --- a/xps/xps_glyphs.c +++ b/xps/xps_glyphs.c @@ -587,7 +587,7 @@ xps_parse_glyphs(xps_document *doc, fz_matrix ctm, if (fill_att) { - float samples[32]; + float samples[FZ_MAX_COLORS]; fz_colorspace *colorspace; xps_parse_color(doc, base_uri, fill_att, &colorspace, samples); diff --git a/xps/xps_path.c b/xps/xps_path.c index 8650fbb..84fe14f 100644 --- a/xps/xps_path.c +++ b/xps/xps_path.c @@ -825,7 +825,7 @@ xps_parse_path(xps_document *doc, fz_matrix ctm, char *base_uri, xps_resource *d fz_stroke_state *stroke = NULL; fz_matrix transform; - float samples[32]; + float samples[FZ_MAX_COLORS]; fz_colorspace *colorspace; fz_path *path; fz_path *stroke_path = NULL;