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:
Dmitry Podgorny
2016-09-02 19:57:25 +03:00
parent b6fcb7035d
commit f351d62355

View File

@@ -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);
@@ -105,17 +110,17 @@ int main(int argc, char *argv[])
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);