diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2018-11-21 10:50:38 -0800 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2018-11-21 10:53:30 -0800 |
commit | 7a85a40ef402460eafe3254df4f916369829ea21 (patch) | |
tree | 42c5dcf43f089b8bf55abde224e7a1150a2deaea /lib-src | |
parent | e01d030723aef2f90a2fc53a0b5251f29df94527 (diff) | |
download | emacs-7a85a40ef402460eafe3254df4f916369829ea21.tar.gz emacs-7a85a40ef402460eafe3254df4f916369829ea21.tar.bz2 emacs-7a85a40ef402460eafe3254df4f916369829ea21.zip |
emacsclient: fix unlikely crash with "&"
* lib-src/emacsclient.c (quote_argument):
Mention *DATA in comment so it’s clear DATA must be non-null.
(quote_argument, unquote_argument): Simplify.
(unquote_argument): Don’t crash if the string ends in "&".
Diffstat (limited to 'lib-src')
-rw-r--r-- | lib-src/emacsclient.c | 85 |
1 files changed, 34 insertions, 51 deletions
diff --git a/lib-src/emacsclient.c b/lib-src/emacsclient.c index 66ada43908e..e3e1d9b16d3 100644 --- a/lib-src/emacsclient.c +++ b/lib-src/emacsclient.c @@ -772,10 +772,10 @@ sock_err_message (const char *function_name) } -/* Let's send the data to Emacs when either - - the data ends in "\n", or +/* Send to S the data in *DATA when either + - the data's last byte is '\n', or - the buffer is full (but this shouldn't happen) - Otherwise, we just accumulate it. */ + Otherwise, just accumulate the data. */ static void send_to_emacs (HSOCKET s, const char *data) { @@ -823,33 +823,21 @@ static void quote_argument (HSOCKET s, const char *str) { char *copy = xmalloc (strlen (str) * 2 + 1); - const char *p; - char *q; - - p = str; - q = copy; - while (*p) + char *q = copy; + if (*str == '-') + *q++ = '&', *q++ = *str++; + for (; *str; str++) { - if (*p == ' ') - { - *q++ = '&'; - *q++ = '_'; - p++; - } - else if (*p == '\n') - { - *q++ = '&'; - *q++ = 'n'; - p++; - } - else - { - if (*p == '&' || (*p == '-' && p == str)) - *q++ = '&'; - *q++ = *p++; - } + char c = *str; + if (c == ' ') + *q++ = '&', c = '_'; + else if (c == '\n') + *q++ = '&', c = 'n'; + else if (c == '&') + *q++ = '&'; + *q++ = c; } - *q++ = 0; + *q = 0; send_to_emacs (s, copy); @@ -857,36 +845,31 @@ quote_argument (HSOCKET s, const char *str) } -/* The inverse of quote_argument. Removes quoting in string STR by - modifying the string in place. Returns STR. */ +/* The inverse of quote_argument. Remove quoting in string STR by + modifying the addressed string in place. Return STR. */ static char * unquote_argument (char *str) { - char *p, *q; - - if (! str) - return str; + char const *p = str; + char *q = str; + char c; - p = str; - q = str; - while (*p) + do { - if (*p == '&') - { - p++; - if (*p == '&') - *p = '&'; - else if (*p == '_') - *p = ' '; - else if (*p == 'n') - *p = '\n'; - else if (*p == '-') - *p = '-'; - } - *q++ = *p++; + c = *p++; + if (c == '&') + { + c = *p++; + if (c == '_') + c = ' '; + else if (c == 'n') + c = '\n'; + } + *q++ = c; } - *q = 0; + while (c); + return str; } |