aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Podgorny <pasis.ua@gmail.com>2013-08-13 15:33:09 +0300
committerDmitry Podgorny <pasis.ua@gmail.com>2013-08-13 15:33:09 +0300
commit07b251690a44eef8a573aae6f72f71728b47d9a1 (patch)
tree315b2cdb237fa4a3cf9fa1ec9900d2f696267199
parent51b73c77669cc284c73923f06c732d4a14f91609 (diff)
downloadprofanity-07b251690a44eef8a573aae6f72f71728b47d9a1.tar.gz
profanity-07b251690a44eef8a573aae6f72f71728b47d9a1.tar.xz
dev-libs/libstrophe: added patch to fix memory leak
-rw-r--r--dev-libs/libstrophe/files/libstrophe-fix-memory-leak-in-logging.patch64
-rw-r--r--dev-libs/libstrophe/libstrophe-0.8-r1.ebuild1
2 files changed, 65 insertions, 0 deletions
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
}