From 2dd1b5ebc6c364750c1d6514354ea9b24a590f20 Mon Sep 17 00:00:00 2001 From: Lefteris Chatzimparmpas Date: Mon, 27 Feb 2012 01:10:56 +0100 Subject: [PATCH] Forward the BYE response properly all the way up Some methods didn't return the correct value when a BYE response was received from the server. --- src/response.c | 60 ++++++++++++++++++++++++++++++-------------------- 1 file changed, 36 insertions(+), 24 deletions(-) diff --git a/src/response.c b/src/response.c index 1aec3f9..2cba1ea 100644 --- a/src/response.c +++ b/src/response.c @@ -304,8 +304,9 @@ response_capability(session *ssn, int tag) char *s; regexp *re; - if ((r = response_generic(ssn, tag)) == -1) - return -1; + r = response_generic(ssn, tag); + if (r == -1 || r == STATUS_BYE) + return r; ssn->protocol = PROTOCOL_NONE; @@ -376,8 +377,9 @@ response_namespace(session *ssn, int tag) int r, n; regexp *re; - if ((r = response_generic(ssn, tag)) == -1) - return -1; + r = response_generic(ssn, tag); + if (r == -1 || r == STATUS_BYE) + return r; ssn->ns.prefix = NULL; ssn->ns.delim = '\0'; @@ -409,8 +411,9 @@ response_status(session *ssn, int tag, unsigned int *exist, char *s; regexp *re; - if ((r = response_generic(ssn, tag)) == -1) - return -1; + r = response_generic(ssn, tag); + if (r == -1 || r == STATUS_BYE) + return r; re = &responses[RESPONSE_STATUS]; @@ -451,8 +454,9 @@ response_examine(session *ssn, int tag, unsigned int *exist, int r; regexp *re; - if ((r = response_generic(ssn, tag)) == -1) - return -1; + r = response_generic(ssn, tag); + if (r == -1 || r == STATUS_BYE) + return r; re = &responses[RESPONSE_EXAMINE_EXISTS]; if (!regexec(re->preg, ibuf.data, re->nmatch, re->pmatch, 0)) @@ -474,8 +478,9 @@ response_select(session *ssn, int tag) { int r; - if ((r = response_generic(ssn, tag)) == -1) - return -1; + r = response_generic(ssn, tag); + if (r == -1 || r == STATUS_BYE) + return r; if (xstrcasestr(ibuf.data, "[READ-ONLY]")) return STATUS_READONLY; @@ -496,8 +501,9 @@ response_list(session *ssn, int tag, char **mboxs, char **folders) const char *v; regexp *re; - if ((r = response_generic(ssn, tag)) == -1) - return -1; + r = response_generic(ssn, tag); + if (r == -1 || r == STATUS_BYE) + return r; m = *mboxs = (char *)xmalloc((ibuf.len + 1) * sizeof(char)); f = *folders = (char *)xmalloc((ibuf.len + 1) * sizeof(char)); @@ -563,8 +569,9 @@ response_search(session *ssn, int tag, char **mesgs) regexp *re; char *b, *m; - if ((r = response_generic(ssn, tag)) == -1) - return -1; + r = response_generic(ssn, tag); + if (r == -1 || r == STATUS_BYE) + return r; re = &responses[RESPONSE_SEARCH]; @@ -604,8 +611,9 @@ response_fetchfast(session *ssn, int tag, char **flags, char **date, char *s; regexp *re; - if ((r = response_generic(ssn, tag)) == -1) - return -1; + r = response_generic(ssn, tag); + if (r == -1 || r == STATUS_BYE) + return r; re = &responses[RESPONSE_FETCH]; if (!regexec(re->preg, ibuf.data, re->nmatch, re->pmatch, 0)) { @@ -644,8 +652,9 @@ response_fetchflags(session *ssn, int tag, char **flags) char *s; regexp *re; - if ((r = response_generic(ssn, tag)) == -1) - return -1; + r = response_generic(ssn, tag); + if (r == -1 || r == STATUS_BYE) + return r; re = &responses[RESPONSE_FETCH]; if (!regexec(re->preg, ibuf.data, re->nmatch, re->pmatch, 0)) { @@ -675,8 +684,9 @@ response_fetchdate(session *ssn, int tag, char **date) char *s; regexp *re; - if ((r = response_generic(ssn, tag)) == -1) - return -1; + r = response_generic(ssn, tag); + if (r == -1 || r == STATUS_BYE) + return r; re = &responses[RESPONSE_FETCH]; if (!regexec(re->preg, ibuf.data, re->nmatch, re->pmatch, 0)) { @@ -706,8 +716,9 @@ response_fetchsize(session *ssn, int tag, char **size) char *s; regexp *re; - if ((r = response_generic(ssn, tag)) == -1) - return -1; + r = response_generic(ssn, tag); + if (r == -1 || r == STATUS_BYE) + return r; re = &responses[RESPONSE_FETCH]; if (!regexec(re->preg, ibuf.data, re->nmatch, re->pmatch, 0)) { @@ -737,8 +748,9 @@ response_fetchstructure(session *ssn, int tag, char **structure) char *s; regexp *re; - if ((r = response_generic(ssn, tag)) == -1) - return -1; + r = response_generic(ssn, tag); + if (r == -1 || r == STATUS_BYE) + return r; re = &responses[RESPONSE_FETCH]; if (!regexec(re->preg, ibuf.data, re->nmatch, re->pmatch, 0)) {