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)
|
static void _stream_stanza(xmpp_stanza_t *stanza, void *userdata)
|
||||||
{
|
{
|
||||||
stanza = xmpp_stanza_clone(stanza);
|
xmpp_stanza_t **dest = userdata;
|
||||||
*(xmpp_stanza_t **)userdata = stanza;
|
if (*dest == NULL) {
|
||||||
|
stanza = xmpp_stanza_clone(stanza);
|
||||||
|
*dest = stanza;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Create a stanza object from the string.
|
/** Create a stanza object from the string.
|
||||||
|
|||||||
@@ -99,7 +99,7 @@ static void test_stanza_from_string(xmpp_ctx_t *ctx)
|
|||||||
size_t buflen;
|
size_t buflen;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
static const char *str =
|
const char *str =
|
||||||
"<signcrypt xmlns=\"urn:xmpp:openpgp:0\"><to "
|
"<signcrypt xmlns=\"urn:xmpp:openpgp:0\"><to "
|
||||||
"jid=\"user@domain.com\"/><time "
|
"jid=\"user@domain.com\"/><time "
|
||||||
"stamp=\"2020-06-03T21:26:24+0200\"/><rpad/><payload><body "
|
"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_free(ctx, buf);
|
||||||
xmpp_stanza_release(stanza);
|
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. */
|
/* Error path. */
|
||||||
stanza = xmpp_stanza_new_from_string(ctx, "<uu><uu>tt");
|
stanza = xmpp_stanza_new_from_string(ctx, "<uu><uu>tt");
|
||||||
assert(stanza == NULL);
|
assert(stanza == NULL);
|
||||||
|
|||||||
Reference in New Issue
Block a user