summaryrefslogtreecommitdiff
path: root/lib-src
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2018-11-21 10:50:38 -0800
committerPaul Eggert <eggert@cs.ucla.edu>2018-11-21 10:53:30 -0800
commit7a85a40ef402460eafe3254df4f916369829ea21 (patch)
tree42c5dcf43f089b8bf55abde224e7a1150a2deaea /lib-src
parente01d030723aef2f90a2fc53a0b5251f29df94527 (diff)
downloademacs-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.c85
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;
}