diff options
author | Adrian Johnson <ajohnson@redneon.com> | 2022-01-09 15:13:34 +1030 |
---|---|---|
committer | Adrian Johnson <ajohnson@redneon.com> | 2022-01-09 17:49:25 +1030 |
commit | a4d8eb98ba8d05fd0026f9c2f9433bdfedde1d06 (patch) | |
tree | 0235745b5b617802162f7ef5832278fc6e3fb74b /src/cairo-pdf-surface.c | |
parent | 46c0b8bb4fe53422c93619628212717251821f2e (diff) | |
download | cairo-a4d8eb98ba8d05fd0026f9c2f9433bdfedde1d06.tar.gz |
pdf: ensure url strings are correctly encoded
Fixes #526
Diffstat (limited to 'src/cairo-pdf-surface.c')
-rw-r--r-- | src/cairo-pdf-surface.c | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/src/cairo-pdf-surface.c b/src/cairo-pdf-surface.c index 07fe5dffc..8cc290ade 100644 --- a/src/cairo-pdf-surface.c +++ b/src/cairo-pdf-surface.c @@ -5448,18 +5448,24 @@ _cairo_utf8_to_pdf_string (const char *utf8, char **str_out) { int i; int len; + unsigned char *p; cairo_bool_t ascii; char *str; cairo_int_status_t status = CAIRO_STATUS_SUCCESS; ascii = TRUE; - len = strlen (utf8); - for (i = 0; i < len; i++) { - unsigned c = utf8[i]; - if (c < 32 || c > 126 || c == '(' || c == ')' || c == '\\') { + p = (unsigned char *)utf8; + len = 0; + while (*p) { + if (*p < 32 || *p > 126) { ascii = FALSE; break; } + if (*p == '(' || *p == ')' || *p == '\\') + len += 2; + else + len++; + p++; } if (ascii) { @@ -5468,10 +5474,16 @@ _cairo_utf8_to_pdf_string (const char *utf8, char **str_out) return _cairo_error (CAIRO_STATUS_NO_MEMORY); str[0] = '('; - for (i = 0; i < len; i++) - str[i+1] = utf8[i]; - str[i+1] = ')'; - str[i+2] = 0; + p = (unsigned char *)utf8; + i = 1; + while (*p) { + if (*p == '(' || *p == ')' || *p == '\\') + str[i++] = '\\'; + str[i++] = *p; + p++; + } + str[i++] = ')'; + str[i++] = 0; } else { uint16_t *utf16 = NULL; int utf16_len = 0; |