auth: fixed memory leaks in _handle_scram_sha1_challenge()
This commit is contained in:
47
src/auth.c
47
src/auth.c
@@ -432,6 +432,7 @@ static int _handle_scram_sha1_challenge(xmpp_conn_t * const conn,
|
|||||||
xmpp_stanza_t *auth, *authdata;
|
xmpp_stanza_t *auth, *authdata;
|
||||||
char *name;
|
char *name;
|
||||||
char *challenge;
|
char *challenge;
|
||||||
|
char *scram_init = (char *)userdata;
|
||||||
|
|
||||||
name = xmpp_stanza_get_name(stanza);
|
name = xmpp_stanza_get_name(stanza);
|
||||||
xmpp_debug(conn->ctx, "xmpp",
|
xmpp_debug(conn->ctx, "xmpp",
|
||||||
@@ -439,41 +440,29 @@ static int _handle_scram_sha1_challenge(xmpp_conn_t * const conn,
|
|||||||
|
|
||||||
if (strcmp(name, "challenge") == 0) {
|
if (strcmp(name, "challenge") == 0) {
|
||||||
text = xmpp_stanza_get_text(stanza);
|
text = xmpp_stanza_get_text(stanza);
|
||||||
|
if (!text)
|
||||||
|
goto err;
|
||||||
|
|
||||||
challenge = (char *)base64_decode(conn->ctx, text, strlen(text));
|
challenge = (char *)base64_decode(conn->ctx, text, strlen(text));
|
||||||
if (!challenge) {
|
xmpp_free(conn->ctx, text);
|
||||||
disconnect_mem_error(conn);
|
if (!challenge)
|
||||||
return 0;
|
goto err;
|
||||||
}
|
|
||||||
|
|
||||||
/* userdata is scram_init allocated in _auth() */
|
response = sasl_scram_sha1(conn->ctx, challenge, scram_init,
|
||||||
response = sasl_scram_sha1(conn->ctx, challenge, (char *)userdata,
|
|
||||||
conn->jid, conn->pass);
|
conn->jid, conn->pass);
|
||||||
if (!response) {
|
|
||||||
xmpp_free(conn->ctx, challenge);
|
|
||||||
disconnect_mem_error(conn);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
xmpp_free(conn->ctx, challenge);
|
xmpp_free(conn->ctx, challenge);
|
||||||
|
if (!response)
|
||||||
|
goto err;
|
||||||
|
|
||||||
auth = xmpp_stanza_new(conn->ctx);
|
auth = xmpp_stanza_new(conn->ctx);
|
||||||
if (!auth) {
|
if (!auth)
|
||||||
xmpp_free(conn->ctx, response);
|
goto err_free_response;
|
||||||
disconnect_mem_error(conn);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
xmpp_stanza_set_name(auth, "response");
|
xmpp_stanza_set_name(auth, "response");
|
||||||
xmpp_stanza_set_ns(auth, XMPP_NS_SASL);
|
xmpp_stanza_set_ns(auth, XMPP_NS_SASL);
|
||||||
|
|
||||||
authdata = xmpp_stanza_new(conn->ctx);
|
authdata = xmpp_stanza_new(conn->ctx);
|
||||||
if (!authdata) {
|
if (!authdata)
|
||||||
xmpp_free(conn->ctx, response);
|
goto err_release_auth;
|
||||||
xmpp_stanza_release(auth);
|
|
||||||
disconnect_mem_error(conn);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
xmpp_stanza_set_text(authdata, response);
|
xmpp_stanza_set_text(authdata, response);
|
||||||
xmpp_free(conn->ctx, response);
|
xmpp_free(conn->ctx, response);
|
||||||
|
|
||||||
@@ -484,10 +473,20 @@ static int _handle_scram_sha1_challenge(xmpp_conn_t * const conn,
|
|||||||
xmpp_stanza_release(auth);
|
xmpp_stanza_release(auth);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
xmpp_free(conn->ctx, scram_init);
|
||||||
return _handle_sasl_result(conn, stanza, "SCRAM-SHA-1");
|
return _handle_sasl_result(conn, stanza, "SCRAM-SHA-1");
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
err_release_auth:
|
||||||
|
xmpp_stanza_release(auth);
|
||||||
|
err_free_response:
|
||||||
|
xmpp_free(conn->ctx, response);
|
||||||
|
err:
|
||||||
|
xmpp_free(conn->ctx, scram_init);
|
||||||
|
disconnect_mem_error(conn);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *_get_nonce(xmpp_ctx_t *ctx)
|
static char *_get_nonce(xmpp_ctx_t *ctx)
|
||||||
|
|||||||
Reference in New Issue
Block a user