conn: handle stream tag properly
If `id == NULL' there were two issues: use-after-free error or logging wrong error description. Also open stream handler was called even when error occured and conn object was disconnected.
This commit is contained in:
30
src/conn.c
30
src/conn.c
@@ -891,27 +891,31 @@ static void _handle_stream_start(char *name, char **attrs,
|
|||||||
xmpp_conn_t *conn = (xmpp_conn_t *)userdata;
|
xmpp_conn_t *conn = (xmpp_conn_t *)userdata;
|
||||||
char *id;
|
char *id;
|
||||||
|
|
||||||
if (strcmp(name, "stream")) {
|
if (conn->stream_id) xmpp_free(conn->ctx, conn->stream_id);
|
||||||
printf("name = %s\n", name);
|
conn->stream_id = NULL;
|
||||||
xmpp_error(conn->ctx, "conn", "Server did not open valid stream.");
|
|
||||||
conn_disconnect(conn);
|
if (strcmp(name, "stream") == 0) {
|
||||||
} else {
|
|
||||||
_log_open_tag(conn, attrs);
|
_log_open_tag(conn, attrs);
|
||||||
|
|
||||||
if (conn->stream_id) xmpp_free(conn->ctx, conn->stream_id);
|
|
||||||
|
|
||||||
id = _get_stream_attribute(attrs, "id");
|
id = _get_stream_attribute(attrs, "id");
|
||||||
if (id)
|
if (id)
|
||||||
conn->stream_id = xmpp_strdup(conn->ctx, id);
|
conn->stream_id = xmpp_strdup(conn->ctx, id);
|
||||||
|
|
||||||
if (!conn->stream_id) {
|
/* check and log errors */
|
||||||
|
if (!id)
|
||||||
|
xmpp_error(conn->ctx, "conn", "No id attribute.");
|
||||||
|
else if (!conn->stream_id)
|
||||||
xmpp_error(conn->ctx, "conn", "Memory allocation failed.");
|
xmpp_error(conn->ctx, "conn", "Memory allocation failed.");
|
||||||
conn_disconnect(conn);
|
} else {
|
||||||
}
|
xmpp_error(conn->ctx, "conn", "Server did not open valid stream."
|
||||||
|
" name = %s.", name);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* call stream open handler */
|
if (conn->stream_id) {
|
||||||
conn->open_handler(conn);
|
/* call stream open handler */
|
||||||
|
conn->open_handler(conn);
|
||||||
|
} else {
|
||||||
|
conn_disconnect(conn);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _handle_stream_end(char *name,
|
static void _handle_stream_end(char *name,
|
||||||
|
|||||||
Reference in New Issue
Block a user