[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] master 7a85a40 1/2: emacsclient: fix unlikely crash with "
From: |
Paul Eggert |
Subject: |
[Emacs-diffs] master 7a85a40 1/2: emacsclient: fix unlikely crash with "&" |
Date: |
Wed, 21 Nov 2018 13:53:36 -0500 (EST) |
branch: master
commit 7a85a40ef402460eafe3254df4f916369829ea21
Author: Paul Eggert <address@hidden>
Commit: Paul Eggert <address@hidden>
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 "&".
---
lib-src/emacsclient.c | 85 +++++++++++++++++++++------------------------------
1 file changed, 34 insertions(+), 51 deletions(-)
diff --git a/lib-src/emacsclient.c b/lib-src/emacsclient.c
index 66ada43..e3e1d9b 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;
}