From 57dd2c6a891b560d571c0a48a3a7f2d2dbfc7171 Mon Sep 17 00:00:00 2001 From: Simon Arlott Date: Fri, 25 Nov 2016 16:02:11 +0000 Subject: [PATCH] msgbuf: don't append a ';' unless there are existing tags When both account-tag and server-time are present but the client doesn't have the first (i == 0) of these enabled. They will get an erroneous ';' after the '@'. Track whether or not there are tags present, and use this to determine whether to add the ';' or not. Also remove the extra function that loops over all of the tags by using this flag to handle the case where there are no tags being written. --- ircd/msgbuf.c | 26 ++++++++------------------ 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/ircd/msgbuf.c b/ircd/msgbuf.c index cac37c48..9d63d109 100644 --- a/ircd/msgbuf.c +++ b/ircd/msgbuf.c @@ -115,33 +115,22 @@ msgbuf_parse(struct MsgBuf *msgbuf, char *line) return 0; } -static int -msgbuf_has_matching_tags(struct MsgBuf *msgbuf, unsigned int capmask) -{ - for (size_t i = 0; i < msgbuf->n_tags; i++) - { - if ((msgbuf->tags[i].capmask & capmask) != 0) - return 1; - } - - return 0; -} - static void msgbuf_unparse_tags(char *buf, size_t buflen, struct MsgBuf *msgbuf, unsigned int capmask) { - if (!msgbuf_has_matching_tags(msgbuf, capmask)) - return; - - *buf = '@'; + bool has_tags = false; for (size_t i = 0; i < msgbuf->n_tags; i++) { if ((msgbuf->tags[i].capmask & capmask) == 0) continue; - if (i != 0) + if (has_tags) { rb_strlcat(buf, ";", buflen); + } else { + *buf = '@'; + has_tags = true; + } rb_strlcat(buf, msgbuf->tags[i].key, buflen); @@ -153,7 +142,8 @@ msgbuf_unparse_tags(char *buf, size_t buflen, struct MsgBuf *msgbuf, unsigned in } } - rb_strlcat(buf, " ", buflen); + if (has_tags) + rb_strlcat(buf, " ", buflen); } void