]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
tool: avoid generating ambiguous escaped characters in --libcurl
authorPatrick Monnerat <patrick@monnerat.net>
Tue, 4 Oct 2022 14:50:45 +0000 (16:50 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Wed, 5 Oct 2022 14:09:46 +0000 (16:09 +0200)
C string hexadecimal-escaped characters may have more than 2 digits.
This results in a wrong C compiler interpretation of a 2-digit escaped
character when followed by an hex digit character.

The solution retained here is to represent such characters as 3-digit
octal escapes.

Adjust and extend test 1465 for this case.

Closes #9643

src/tool_setopt.c
tests/data/test1465

index b051388895544e0d10e2cba72a02dd681bcda78c..917191ef29def3b5e6851cd634eb263e6a056344 100644 (file)
@@ -252,12 +252,17 @@ static char *c_escape(const char *str, curl_off_t len)
       strcpy(e, "\\?");
       e += 2;
     }
-    else if(!ISPRINT(c)) {
+    else if(ISPRINT(c))
+      *e++ = c;
+    else if(len > 1 && ISXDIGIT(s[1])) {
+      /* Octal escape to avoid >2 digit hex. */
+      msnprintf(e, 5, "\\%03o", (unsigned)c);
+      e += 4;
+    }
+    else {
       msnprintf(e, 5, "\\x%02x", (unsigned)c);
       e += 4;
     }
-    else
-      *e++ = c;
   }
   while(cutoff--)
     *e++ = '.';
index 356b1e1b9439058dc7b6779cdd31dc42bac49cdf..9703f68cf2c0786711876fb52d12bbda2b765b48 100644 (file)
Binary files a/tests/data/test1465 and b/tests/data/test1465 differ