From 07b251690a44eef8a573aae6f72f71728b47d9a1 Mon Sep 17 00:00:00 2001 From: Dmitry Podgorny Date: Tue, 13 Aug 2013 15:33:09 +0300 Subject: dev-libs/libstrophe: added patch to fix memory leak --- .../libstrophe-fix-memory-leak-in-logging.patch | 64 ++++++++++++++++++++++ dev-libs/libstrophe/libstrophe-0.8-r1.ebuild | 1 + 2 files changed, 65 insertions(+) create mode 100644 dev-libs/libstrophe/files/libstrophe-fix-memory-leak-in-logging.patch diff --git a/dev-libs/libstrophe/files/libstrophe-fix-memory-leak-in-logging.patch b/dev-libs/libstrophe/files/libstrophe-fix-memory-leak-in-logging.patch new file mode 100644 index 0000000..4537d8f --- /dev/null +++ b/dev-libs/libstrophe/files/libstrophe-fix-memory-leak-in-logging.patch @@ -0,0 +1,64 @@ +diff --git a/src/ctx.c b/src/ctx.c +index 48e87ad..5a24687 100644 +--- a/src/ctx.c ++++ b/src/ctx.c +@@ -249,30 +249,38 @@ void xmpp_log(const xmpp_ctx_t * const ctx, + { + int oldret, ret; + char smbuf[1024]; +- char *buf; +- va_list copy; ++ char *bigbuf = NULL; ++ va_list ap_copy; + +- buf = smbuf; +- va_copy(copy, ap); +- ret = xmpp_vsnprintf(buf, 1023, fmt, ap); ++ va_copy(ap_copy, ap); ++ ret = xmpp_vsnprintf(smbuf, 1023, fmt, ap_copy); ++ va_end(ap_copy); + if (ret > 1023) { +- va_copy(ap, copy); +- buf = (char *)xmpp_alloc(ctx, ret + 1); +- if (!buf) { +- buf = NULL; +- xmpp_error(ctx, "log", "Failed allocating memory for log message."); +- return; +- } +- oldret = ret; +- ret = xmpp_vsnprintf(buf, ret + 1, fmt, ap); +- if (ret > oldret) { +- xmpp_error(ctx, "log", "Unexpected error"); +- return; +- } ++ bigbuf = (char *)xmpp_alloc(ctx, ret + 1); ++ if (!bigbuf) { ++ bigbuf = NULL; ++ xmpp_error(ctx, "log", "Failed allocating memory for log message."); ++ return; ++ } ++ oldret = ret; ++ va_copy(ap_copy, ap); ++ ret = xmpp_vsnprintf(bigbuf, ret + 1, fmt, ap_copy); ++ va_end(ap_copy); ++ ++ if (ret > oldret) { ++ xmpp_error(ctx, "log", "Unexpected error"); ++ return; ++ } ++ ++ if (ctx->log->handler) { ++ ctx->log->handler(ctx->log->userdata, level, area, bigbuf); ++ } ++ xmpp_free(ctx, bigbuf); ++ } else { ++ if (ctx->log->handler) { ++ ctx->log->handler(ctx->log->userdata, level, area, smbuf); ++ } + } +- +- if (ctx->log->handler) +- ctx->log->handler(ctx->log->userdata, level, area, buf); + } + + /** Write to the log at the ERROR level. diff --git a/dev-libs/libstrophe/libstrophe-0.8-r1.ebuild b/dev-libs/libstrophe/libstrophe-0.8-r1.ebuild index e7174bd..bffbf10 100644 --- a/dev-libs/libstrophe/libstrophe-0.8-r1.ebuild +++ b/dev-libs/libstrophe/libstrophe-0.8-r1.ebuild @@ -26,6 +26,7 @@ S="${WORKDIR}/${P}-snapshot" src_prepare() { epatch "${FILESDIR}"/${PN}-xmpp-conn-disable-tls.patch epatch "${FILESDIR}"/${PN}-fix-memory-leaks.patch + epatch "${FILESDIR}"/${PN}-fix-memory-leak-in-logging.patch epatch "${FILESDIR}"/${PN}-fix-crash-on-non-latin1.patch epatch "${FILESDIR}"/${PN}-xml-escape.patch } -- cgit v1.2.1