diff --git a/src/auth.c b/src/auth.c index fbf21fc..6872b83 100644 --- a/src/auth.c +++ b/src/auth.c @@ -219,6 +219,7 @@ static int _handle_features(xmpp_conn_t * const conn, void * const userdata) { xmpp_stanza_t *child, *mech; + const char *ns; char *text; /* remove the handler that detects missing stream:features */ @@ -228,8 +229,10 @@ static int _handle_features(xmpp_conn_t * const conn, if (!conn->secured) { if (!conn->tls_disabled) { child = xmpp_stanza_get_child_by_name(stanza, "starttls"); - if (child && (strcmp(xmpp_stanza_get_ns(child), XMPP_NS_TLS) == 0)) - conn->tls_support = 1; + if (child) { + ns = xmpp_stanza_get_ns(child); + conn->tls_support = ns != NULL && strcmp(ns, XMPP_NS_TLS) == 0; + } } else { conn->tls_support = 0; } @@ -237,11 +240,15 @@ static int _handle_features(xmpp_conn_t * const conn, /* check for SASL */ child = xmpp_stanza_get_child_by_name(stanza, "mechanisms"); - if (child && (strcmp(xmpp_stanza_get_ns(child), XMPP_NS_SASL) == 0)) { + ns = child ? xmpp_stanza_get_ns(child) : NULL; + if (child && ns && strcmp(ns, XMPP_NS_SASL) == 0) { for (mech = xmpp_stanza_get_children(child); mech; mech = xmpp_stanza_get_next(mech)) { if (xmpp_stanza_get_name(mech) && strcmp(xmpp_stanza_get_name(mech), "mechanism") == 0) { text = xmpp_stanza_get_text(mech); + if (text == NULL) + continue; + if (strcasecmp(text, "PLAIN") == 0) conn->sasl_support |= SASL_MASK_PLAIN; else if (strcasecmp(text, "DIGEST-MD5") == 0) @@ -871,7 +878,8 @@ static int _handle_features_sasl(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza, void * const userdata) { - xmpp_stanza_t *bind, *session, *iq, *res, *text; + xmpp_stanza_t *bind, *session, *iq, *res, *text, *opt; + const char *ns; char *resource; /* remove missing features handler */ @@ -880,18 +888,21 @@ static int _handle_features_sasl(xmpp_conn_t * const conn, /* we are expecting and since this is a XMPP style connection */ + /* check whether resource binding is required */ bind = xmpp_stanza_get_child_by_name(stanza, "bind"); - if (bind && strcmp(xmpp_stanza_get_ns(bind), XMPP_NS_BIND) == 0) { - /* resource binding is required */ - conn->bind_required = 1; + if (bind) { + ns = xmpp_stanza_get_ns(bind); + conn->bind_required = ns != NULL && strcmp(ns, XMPP_NS_BIND) == 0; } + /* check whether session establishment is required */ session = xmpp_stanza_get_child_by_name(stanza, "session"); - if (session && strcmp(xmpp_stanza_get_ns(session), XMPP_NS_SESSION) == 0) { - /* session establishment might be required */ - xmpp_stanza_t *opt = xmpp_stanza_get_child_by_name(session, "optional"); + if (session) { + ns = xmpp_stanza_get_ns(session); + opt = xmpp_stanza_get_child_by_name(session, "optional"); if (!opt) - conn->session_required = 1; + conn->session_required = ns != NULL && + strcmp(ns, XMPP_NS_SESSION) == 0; } /* if bind is required, go ahead and start it */ diff --git a/src/stanza.c b/src/stanza.c index 8e45f23..e10e6a1 100644 --- a/src/stanza.c +++ b/src/stanza.c @@ -809,10 +809,11 @@ xmpp_stanza_t *xmpp_stanza_get_child_by_ns(xmpp_stanza_t * const stanza, const char * const ns) { xmpp_stanza_t *child; + const char *child_ns; for (child = stanza->children; child; child = child->next) { - if (xmpp_stanza_get_ns(child) && - strcmp(ns, xmpp_stanza_get_ns(child)) == 0) + child_ns = xmpp_stanza_get_ns(child); + if (child_ns && strcmp(ns, child_ns) == 0) break; }