Skip to content

Commit ca315a5

Browse files
authored
Merge pull request #3312 from hamarituc/cyrus-imapd-2.4
Fix two use after free segfaults
2 parents d233d8e + 70a3d19 commit ca315a5

File tree

4 files changed

+23
-14
lines changed

4 files changed

+23
-14
lines changed

Diff for: imap/backend.c

+14-9
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,6 @@ static int backend_authenticate(struct backend *s, struct protocol_t *prot,
284284
struct sockaddr_storage saddr_l, saddr_r;
285285
char remoteip[60], localip[60];
286286
socklen_t addrsize;
287-
int local_cb = 0;
288287
char buf[2048], optstr[128], *p;
289288
const char *mech_conf, *pass;
290289

@@ -301,8 +300,8 @@ static int backend_authenticate(struct backend *s, struct protocol_t *prot,
301300
if(iptostring((struct sockaddr *)&saddr_l, addrsize, localip, 60) != 0)
302301
return SASL_FAIL;
303302

303+
s->sasl_cb = NULL;
304304
if (!cb) {
305-
local_cb = 1;
306305
strlcpy(optstr, s->hostname, sizeof(optstr));
307306
p = strchr(optstr, '.');
308307
if (p) *p = '\0';
@@ -313,6 +312,7 @@ static int backend_authenticate(struct backend *s, struct protocol_t *prot,
313312
config_getstring(IMAPOPT_PROXY_AUTHNAME),
314313
config_getstring(IMAPOPT_PROXY_REALM),
315314
pass);
315+
s->sasl_cb = cb;
316316
}
317317

318318
/* Require proxying if we have an "interesting" userid (authzid) */
@@ -321,14 +321,16 @@ static int backend_authenticate(struct backend *s, struct protocol_t *prot,
321321
(prot->sasl_cmd.parse_success ? SASL_SUCCESS_DATA : 0),
322322
&s->saslconn);
323323
if (r != SASL_OK) {
324-
if (local_cb) free_callbacks(cb);
325-
return r;
324+
free_callbacks(s->sasl_cb);
325+
s->sasl_cb = NULL;
326+
return r;
326327
}
327328

328329
r = sasl_setprop(s->saslconn, SASL_SEC_PROPS, &secprops);
329330
if (r != SASL_OK) {
330-
if (local_cb) free_callbacks(cb);
331-
return r;
331+
free_callbacks(s->sasl_cb);
332+
s->sasl_cb = NULL;
333+
return r;
332334
}
333335

334336
/* Get SASL mechanism list. We can force a particular
@@ -377,9 +379,6 @@ static int backend_authenticate(struct backend *s, struct protocol_t *prot,
377379
&s->capability, NULL,
378380
prot->tls_cmd.auto_capa)));
379381

380-
/* xxx unclear that this is correct */
381-
if (local_cb) free_callbacks(cb);
382-
383382
if (r == SASL_OK) {
384383
prot_setsasl(s->in, s->saslconn);
385384
prot_setsasl(s->out, s->saslconn);
@@ -722,6 +721,12 @@ void backend_disconnect(struct backend *s)
722721
s->saslconn = NULL;
723722
}
724723

724+
/* Free any SASL callbacks */
725+
if (s->sasl_cb) {
726+
free_callbacks(s->sasl_cb);
727+
s->sasl_cb = NULL;
728+
}
729+
725730
/* free last_result buffer */
726731
buf_free(&s->last_result);
727732
}

Diff for: imap/backend.h

+1
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ struct backend {
7171
struct prot_waitevent *timeout; /* event for idle timeout */
7272

7373
sasl_conn_t *saslconn;
74+
sasl_callback_t *sasl_cb;
7475
#ifdef HAVE_SSL
7576
SSL *tlsconn;
7677
SSL_SESSION *tlssess;

Diff for: imap/mupdate-client.c

+7-5
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,6 @@ int mupdate_connect(const char *server,
105105
sasl_callback_t *cbs)
106106
{
107107
mupdate_handle *h = NULL;
108-
int local_cbs = 0;
109108
const char *status = NULL;
110109

111110
if(!handle)
@@ -122,21 +121,21 @@ int mupdate_connect(const char *server,
122121
h = xzmalloc(sizeof(mupdate_handle));
123122
*handle = h;
124123

124+
h->sasl_cb = NULL;
125125
if(!cbs) {
126-
local_cbs = 1;
127126
cbs = mysasl_callbacks(config_getstring(IMAPOPT_MUPDATE_USERNAME),
128127
config_getstring(IMAPOPT_MUPDATE_AUTHNAME),
129128
config_getstring(IMAPOPT_MUPDATE_REALM),
130129
config_getstring(IMAPOPT_MUPDATE_PASSWORD));
130+
h->sasl_cb = cbs;
131131
}
132132

133133
h->conn = backend_connect(NULL, server, &mupdate_protocol,
134134
"", cbs, &status);
135135

136-
/* xxx unclear that this is correct, but it prevents a memory leak */
137-
if (local_cbs) free_callbacks(cbs);
138-
139136
if (!h->conn) {
137+
free_callbacks(h->sasl_cb);
138+
h->sasl_cb = NULL;
140139
syslog(LOG_ERR, "mupdate_connect failed: %s", status ? status : "no auth status");
141140
return MUPDATE_NOCONN;
142141
}
@@ -157,6 +156,9 @@ void mupdate_disconnect(mupdate_handle **hp)
157156
backend_disconnect(h->conn);
158157
free(h->conn);
159158

159+
free_callbacks(h->sasl_cb);
160+
h->sasl_cb = NULL;
161+
160162
buf_free(&(h->tag));
161163
buf_free(&(h->cmd));
162164
buf_free(&(h->arg1));

Diff for: imap/mupdate.h

+1
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
#include "global.h"
6363

6464
struct mupdate_handle_s {
65+
sasl_callback_t *sasl_cb;
6566
struct backend *conn;
6667

6768
/* For keeping track of what tag # is next */

0 commit comments

Comments
 (0)