prevent memory leak in xmpp_stanza_new_from_string()
Only remember the first stanza in case the string contains multiple stanzas. Signed-off-by: Steffen Jaeckel <jaeckel-floss@eyet-services.de>
This commit is contained in:
@@ -1640,8 +1640,11 @@ static void _stub_stream_end(char *name, void *userdata)
|
||||
|
||||
static void _stream_stanza(xmpp_stanza_t *stanza, void *userdata)
|
||||
{
|
||||
stanza = xmpp_stanza_clone(stanza);
|
||||
*(xmpp_stanza_t **)userdata = stanza;
|
||||
xmpp_stanza_t **dest = userdata;
|
||||
if (*dest == NULL) {
|
||||
stanza = xmpp_stanza_clone(stanza);
|
||||
*dest = stanza;
|
||||
}
|
||||
}
|
||||
|
||||
/** Create a stanza object from the string.
|
||||
|
||||
@@ -99,7 +99,7 @@ static void test_stanza_from_string(xmpp_ctx_t *ctx)
|
||||
size_t buflen;
|
||||
int ret;
|
||||
|
||||
static const char *str =
|
||||
const char *str =
|
||||
"<signcrypt xmlns=\"urn:xmpp:openpgp:0\"><to "
|
||||
"jid=\"user@domain.com\"/><time "
|
||||
"stamp=\"2020-06-03T21:26:24+0200\"/><rpad/><payload><body "
|
||||
@@ -113,6 +113,22 @@ static void test_stanza_from_string(xmpp_ctx_t *ctx)
|
||||
xmpp_free(ctx, buf);
|
||||
xmpp_stanza_release(stanza);
|
||||
|
||||
/* create a string with two stanzas to make sure we don't
|
||||
* leak any memory when we convert them to a xmpp_stanza_t
|
||||
*/
|
||||
buf = malloc(strlen(str) * 2 + 1);
|
||||
assert(buf != NULL);
|
||||
memcpy(buf, str, strlen(str) + 1);
|
||||
memcpy(&buf[strlen(str)], str, strlen(str) + 1);
|
||||
stanza = xmpp_stanza_new_from_string(ctx, buf);
|
||||
assert(stanza != NULL);
|
||||
free(buf);
|
||||
ret = xmpp_stanza_to_text(stanza, &buf, &buflen);
|
||||
assert(ret == XMPP_EOK);
|
||||
COMPARE(str, buf);
|
||||
xmpp_free(ctx, buf);
|
||||
xmpp_stanza_release(stanza);
|
||||
|
||||
/* Error path. */
|
||||
stanza = xmpp_stanza_new_from_string(ctx, "<uu><uu>tt");
|
||||
assert(stanza == NULL);
|
||||
|
||||
Reference in New Issue
Block a user