summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/misc.c16
-rw-r--r--src/core/misc.h3
-rw-r--r--src/fe-common/core/chat-completion.c6
3 files changed, 23 insertions, 2 deletions
diff --git a/src/core/misc.c b/src/core/misc.c
index 6bf87177..01ae0f1d 100644
--- a/src/core/misc.c
+++ b/src/core/misc.c
@@ -770,3 +770,19 @@ int expand_escape(const char **data)
return strtol(digit, NULL, 8);
}
}
+
+/* Escape all '"', "'" and '\' chars with '\' */
+char *escape_string(const char *str)
+{
+ char *ret, *p;
+
+ p = ret = g_malloc(strlen(str)*2+1);
+ while (*str != '\0') {
+ if (*str == '"' || *str == '\'' || *str == '\\')
+ *p++ = '\\';
+ *p++ = *str++;
+ }
+ *p = '\0';
+
+ return ret;
+}
diff --git a/src/core/misc.h b/src/core/misc.h
index 804cffc2..b9002c1c 100644
--- a/src/core/misc.h
+++ b/src/core/misc.h
@@ -105,4 +105,7 @@ GSList *columns_sort_list(GSList *list, int rows);
one after '\'. Returns the expanded character or -1 if error. */
int expand_escape(const char **data);
+/* Escape all '"', "'" and '\' chars with '\' */
+char *escape_string(const char *str);
+
#endif
diff --git a/src/fe-common/core/chat-completion.c b/src/fe-common/core/chat-completion.c
index c70f7e5b..a5a4287b 100644
--- a/src/fe-common/core/chat-completion.c
+++ b/src/fe-common/core/chat-completion.c
@@ -928,7 +928,7 @@ static char *auto_complete(CHANNEL_REC *channel, const char *line)
static void event_text(const char *data, SERVER_REC *server, WI_ITEM_REC *item)
{
- char *line, *str;
+ char *line, *str, *target;
g_return_if_fail(data != NULL);
@@ -956,9 +956,11 @@ static void event_text(const char *data, SERVER_REC *server, WI_ITEM_REC *item)
/* the nick is quoted in case it contains '-' character. also
spaces should work too now :) Unquoter function also allows
'"' characters as long as the next character isn't space. */
+ target = escape_string(window_item_get_target(item));
str = g_strdup_printf(IS_CHANNEL(item) ? "-channel \"%s\" %s" :
IS_QUERY(item) ? "-nick \"%s\" %s" : "%s %s",
- window_item_get_target(item), line);
+ target, line);
+ g_free(target);
signal_emit("command msg", 3, str, server, item);