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;
}