tests/jid: fixed crash on QNX
QNX version of printf() doesn't check whether a string is valid or not. Passing NULL pointer leads to a crash inside strlen(). Fix this with a wrapper _s() which returns "<NULL>" for instead of NULL pointer. Add checks before strcmp() to avoid crash in case of unexpected result of the jid functions.
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
/* test_jid.c
|
/* test_jid.c
|
||||||
** libstrophe XMPP client library -- test routines for the jid utils
|
** libstrophe XMPP client library -- test routines for the jid utils
|
||||||
**
|
**
|
||||||
** Copyright (C) 2005-2009 Collecta, Inc.
|
** Copyright (C) 2005-2009 Collecta, Inc.
|
||||||
**
|
**
|
||||||
** This software is provided AS-IS with no warranty, either express
|
** This software is provided AS-IS with no warranty, either express
|
||||||
** or implied.
|
** or implied.
|
||||||
@@ -20,6 +20,11 @@ static const char jid2[] = "anyone@example.com/hullo";
|
|||||||
static const char jid3[] = "manic.porter@xyz.net/frob";
|
static const char jid3[] = "manic.porter@xyz.net/frob";
|
||||||
static const char jid4[] = "domain.tld";
|
static const char jid4[] = "domain.tld";
|
||||||
|
|
||||||
|
static const char *_s(const char *s)
|
||||||
|
{
|
||||||
|
return s == NULL ? "<NULL>" : s;
|
||||||
|
}
|
||||||
|
|
||||||
int test_jid(xmpp_ctx_t *ctx)
|
int test_jid(xmpp_ctx_t *ctx)
|
||||||
{
|
{
|
||||||
char *node;
|
char *node;
|
||||||
@@ -30,9 +35,9 @@ int test_jid(xmpp_ctx_t *ctx)
|
|||||||
domain = xmpp_jid_domain(ctx, jid1);
|
domain = xmpp_jid_domain(ctx, jid1);
|
||||||
resource = xmpp_jid_resource(ctx, jid1);
|
resource = xmpp_jid_resource(ctx, jid1);
|
||||||
printf("jid '%s' parsed to %s, %s, %s\n",
|
printf("jid '%s' parsed to %s, %s, %s\n",
|
||||||
jid1, node, domain, resource);
|
jid1, _s(node), _s(domain), _s(resource));
|
||||||
if (strcmp(node, "foo")) return 1;
|
if (node == NULL || strcmp(node, "foo")) return 1;
|
||||||
if (strcmp(domain, "bar.com")) return 1;
|
if (domain == NULL || strcmp(domain, "bar.com")) return 1;
|
||||||
if (resource != NULL) return 1;
|
if (resource != NULL) return 1;
|
||||||
if (node) xmpp_free(ctx, node);
|
if (node) xmpp_free(ctx, node);
|
||||||
if (domain) xmpp_free(ctx, domain);
|
if (domain) xmpp_free(ctx, domain);
|
||||||
@@ -42,10 +47,10 @@ int test_jid(xmpp_ctx_t *ctx)
|
|||||||
domain = xmpp_jid_domain(ctx, jid2);
|
domain = xmpp_jid_domain(ctx, jid2);
|
||||||
resource = xmpp_jid_resource(ctx, jid2);
|
resource = xmpp_jid_resource(ctx, jid2);
|
||||||
printf("jid '%s' parsed to %s, %s, %s\n",
|
printf("jid '%s' parsed to %s, %s, %s\n",
|
||||||
jid2, node, domain, resource);
|
jid2, _s(node), _s(domain), _s(resource));
|
||||||
if (strcmp(node, "anyone")) return 1;
|
if (node == NULL || strcmp(node, "anyone")) return 1;
|
||||||
if (strcmp(domain, "example.com")) return 1;
|
if (domain == NULL || strcmp(domain, "example.com")) return 1;
|
||||||
if (strcmp(resource, "hullo")) return 1;
|
if (resource == NULL || strcmp(resource, "hullo")) return 1;
|
||||||
if (node) xmpp_free(ctx, node);
|
if (node) xmpp_free(ctx, node);
|
||||||
if (domain) xmpp_free(ctx, domain);
|
if (domain) xmpp_free(ctx, domain);
|
||||||
if (resource) xmpp_free(ctx, resource);
|
if (resource) xmpp_free(ctx, resource);
|
||||||
@@ -54,10 +59,10 @@ int test_jid(xmpp_ctx_t *ctx)
|
|||||||
domain = xmpp_jid_domain(ctx, jid3);
|
domain = xmpp_jid_domain(ctx, jid3);
|
||||||
resource = xmpp_jid_resource(ctx, jid3);
|
resource = xmpp_jid_resource(ctx, jid3);
|
||||||
printf("jid '%s' parsed to %s, %s, %s\n",
|
printf("jid '%s' parsed to %s, %s, %s\n",
|
||||||
jid3, node, domain, resource);
|
jid3, _s(node), _s(domain), _s(resource));
|
||||||
if (strcmp(node, "manic.porter")) return 1;
|
if (node == NULL || strcmp(node, "manic.porter")) return 1;
|
||||||
if (strcmp(domain, "xyz.net")) return 1;
|
if (domain == NULL || strcmp(domain, "xyz.net")) return 1;
|
||||||
if (strcmp(resource, "frob")) return 1;
|
if (resource == NULL || strcmp(resource, "frob")) return 1;
|
||||||
if (node) xmpp_free(ctx, node);
|
if (node) xmpp_free(ctx, node);
|
||||||
if (domain) xmpp_free(ctx, domain);
|
if (domain) xmpp_free(ctx, domain);
|
||||||
if (resource) xmpp_free(ctx, resource);
|
if (resource) xmpp_free(ctx, resource);
|
||||||
@@ -66,9 +71,9 @@ int test_jid(xmpp_ctx_t *ctx)
|
|||||||
domain = xmpp_jid_domain(ctx, jid4);
|
domain = xmpp_jid_domain(ctx, jid4);
|
||||||
resource = xmpp_jid_resource(ctx, jid4);
|
resource = xmpp_jid_resource(ctx, jid4);
|
||||||
printf("jid '%s' parsed to %s, %s, %s\n",
|
printf("jid '%s' parsed to %s, %s, %s\n",
|
||||||
jid4, node, domain, resource);
|
jid4, _s(node), _s(domain), _s(resource));
|
||||||
if (node != NULL) return 1;
|
if (node != NULL) return 1;
|
||||||
if (strcmp(domain, "domain.tld")) return 1;
|
if (domain == NULL || strcmp(domain, "domain.tld")) return 1;
|
||||||
if (resource != NULL) return 1;
|
if (resource != NULL) return 1;
|
||||||
if (node) xmpp_free(ctx, node);
|
if (node) xmpp_free(ctx, node);
|
||||||
if (domain) xmpp_free(ctx, domain);
|
if (domain) xmpp_free(ctx, domain);
|
||||||
@@ -99,23 +104,23 @@ int main(int argc, char *argv[])
|
|||||||
xmpp_ctx_t *ctx;
|
xmpp_ctx_t *ctx;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
printf("allocating context... ");
|
printf("allocating context... ");
|
||||||
ctx = xmpp_ctx_new(NULL, NULL);
|
ctx = xmpp_ctx_new(NULL, NULL);
|
||||||
if (ctx == NULL) printf("failed to create context\n");
|
if (ctx == NULL) printf("failed to create context\n");
|
||||||
if (ctx == NULL) return -1;
|
if (ctx == NULL) return -1;
|
||||||
printf("ok.\n");
|
printf("ok.\n");
|
||||||
|
|
||||||
printf("testing jid routines... ");
|
printf("testing jid routines...\n");
|
||||||
ret = test_jid(ctx);
|
ret = test_jid(ctx);
|
||||||
if (ret) printf("failed!\n");
|
if (ret) printf("testing jid routines... failed!\n");
|
||||||
if (ret) return ret;
|
if (ret) return ret;
|
||||||
printf("ok.\n");
|
printf("testing jid routines... ok.\n");
|
||||||
|
|
||||||
printf("testing jid new routines... ");
|
printf("testing jid new routines...\n");
|
||||||
ret = test_jid_new(ctx);
|
ret = test_jid_new(ctx);
|
||||||
if (ret) printf("failed!\n");
|
if (ret) printf("testing jid new routines... failed!\n");
|
||||||
if (ret) return ret;
|
if (ret) return ret;
|
||||||
printf("ok.\n");
|
printf("testing jid new routines... ok.\n");
|
||||||
|
|
||||||
printf("freeing context... ");
|
printf("freeing context... ");
|
||||||
xmpp_ctx_free(ctx);
|
xmpp_ctx_free(ctx);
|
||||||
|
|||||||
Reference in New Issue
Block a user