diff options
author | Přemysl Janouch <p.janouch@gmail.com> | 2015-05-30 22:34:09 +0200 |
---|---|---|
committer | Přemysl Janouch <p.janouch@gmail.com> | 2015-05-30 22:34:09 +0200 |
commit | 3c32558a42201fd34daa32ad845c35591388369a (patch) | |
tree | 2c7fa2196b601d290cb19a868ab2a9f8c445cd7c /degesch.c | |
parent | b7b84b489de975ff297cc35f12c2421903aec98c (diff) | |
download | xK-3c32558a42201fd34daa32ad845c35591388369a.tar.gz xK-3c32558a42201fd34daa32ad845c35591388369a.tar.xz xK-3c32558a42201fd34daa32ad845c35591388369a.zip |
degesch: properly unescape RPL_ISUPPORT values
Diffstat (limited to 'degesch.c')
-rw-r--r-- | degesch.c | 27 |
1 files changed, 26 insertions, 1 deletions
@@ -4487,6 +4487,25 @@ irc_handle_isupport_prefix (struct server *s, char *value) } static void +unescape_isupport_value (const char *value, struct str *output) +{ + const char *alphabet = "0123456789abcdef", *a, *b; + for (const char *p = value; *p; p++) + { + if (p[0] == '\\' + && p[1] == 'x' + && p[2] && (a = strchr (alphabet, tolower_ascii (p[2]))) + && p[3] && (b = strchr (alphabet, tolower_ascii (p[3])))) + { + str_append_c (output, (a - alphabet) << 4 | (b - alphabet)); + p += 3; + } + else + str_append_c (output, *p); + } +} + +static void irc_handle_rpl_isupport (struct server *s, const struct irc_message *msg) { if (msg->params.len < 2) @@ -4499,8 +4518,14 @@ irc_handle_rpl_isupport (struct server *s, const struct irc_message *msg) char *value = param + strcspn (param, "="); if (*value) *value++ = '\0'; + struct str value_unescaped; + str_init (&value_unescaped); + unescape_isupport_value (value, &value_unescaped); + if (!strcmp (param, "PREFIX")) - irc_handle_isupport_prefix (s, value); + irc_handle_isupport_prefix (s, value_unescaped.str); + + str_free (&value_unescaped); } // TODO: initialize key_strxfrm according to server properties; |