From 835c7550755e639581b401d2db0d3a6b02932f9b Mon Sep 17 00:00:00 2001
From: Pierre-Louis Bonicoli <pierre-louis.bonicoli@gmx.fr>
Date: Tue, 20 Dec 2011 05:05:04 +0100
Subject: [PATCH] Don't use splitted string after "PASS ". Fix #265

---
 src/irc.c |   33 +++++++++++++++++++++++++++++----
 1 files changed, 29 insertions(+), 4 deletions(-)

diff --git a/src/irc.c b/src/irc.c
index ebc1b34..cc2dabe 100644
--- a/src/irc.c
+++ b/src/irc.c
@@ -859,18 +859,43 @@ static int irc_cli_user(bip_t *bip, struct link_client *ic, struct line *line)
 
 static int irc_cli_pass(bip_t *bip, struct link_client *ic, struct line *line)
 {
-	if (irc_line_count(line) != 2)
+	int len = 0;
+	int nb_spaces;
+	int i;
+
+	if ((irc_line_count(line) < 2)
+		|| !irc_line_elem_case_equals(line, 0, "PASS"))
 		return ERR_PROTOCOL;
 
 	if ((ic->state & IRCC_READY) == IRCC_READY)
 		return ERR_PROTOCOL;
 
 	ic->state |= IRCC_PASS;
-	if (ic->init_pass)
+	if (ic->init_pass) {
 		free(ic->init_pass);
-	ic->init_pass = bip_strdup(irc_line_elem(line, 1));
-	if ((ic->state & IRCC_READY) == IRCC_READY)
+		ic->init_pass = NULL;
+	}
+
+	// concat all words except prefix: "PASS"
+	for (i = 1; i < array_count(&line->words); i++) {
+		len += strlen(array_get(&line->words, i));
+	}
+	nb_spaces = array_count(&line->words) - 2;
+	len += nb_spaces + 1;
+
+	ic->init_pass = bip_malloc(len);
+	ic->init_pass[0] = 0;
+
+	for (i = 1; i < array_count(&line->words) - 1; i++) {
+		strcat(ic->init_pass, array_get(&line->words, i));
+		strcat(ic->init_pass, " ");
+	}
+
+	strcat(ic->init_pass, array_get(&line->words, i));
+
+	if ((ic->state & IRCC_READY) == IRCC_READY) {
 		return irc_cli_startup(bip, ic, line);
+	}
 	return OK_FORGET;
 }
 
-- 
1.7.2.5

