Hello community,
here is the log from the commit of package rsyslog for openSUSE:Factory checked in at 2013-11-04 07:09:08
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/rsyslog (Old)
and /work/SRC/openSUSE:Factory/.rsyslog.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "rsyslog"
Changes:
--------
--- /work/SRC/openSUSE:Factory/rsyslog/rsyslog.changes 2013-10-29 11:04:24.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.rsyslog.new/rsyslog.changes 2013-11-04 07:09:09.000000000 +0100
@@ -1,0 +2,14 @@
+Thu Oct 31 20:20:51 UTC 2013 - andreas.stieger@gmx.de
+
+- update to 7.4.6 [v7.4-stable] [bnc#848574]
+- bugfix: potential abort during HUP
+- bugfix: imtcp flowControl parameter incorrectly defaulted to "off"
+- now requires libestr 0.1.9 for number handling in RainerScript
+- bugfix: memory leak in strlen() RainerScript function
+- bugfix: buffer overrun if re_extract function was called for submatch 50
+- bugfix: memleak in re_extract() function
+- bugfix: potential abort in RainerScript optimizer
+- bugfix: memory leak in omhiredis
+- bugfix: segfault if variable was assigned to non-container subtree
+
+-------------------------------------------------------------------
@@ -4 +18 @@
-- update to 7.4.5 [v7.5-stable]
+- update to 7.4.5 [v7.4-stable]
Old:
----
rsyslog-7.4.5.tar.gz
New:
----
rsyslog-7.4.6.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ rsyslog.spec ++++++
--- /var/tmp/diff_new_pack.55Yw8D/_old 2013-11-04 07:09:10.000000000 +0100
+++ /var/tmp/diff_new_pack.55Yw8D/_new 2013-11-04 07:09:10.000000000 +0100
@@ -20,7 +20,7 @@
Summary: The enhanced syslogd for Linux and Unix
License: (GPL-3.0+ and Apache-2.0)
Group: System/Daemons
-Version: 7.4.5
+Version: 7.4.6
Release: 0
%if 0%{?suse_version} >= 1210
%bcond_without systemd
@@ -152,10 +152,10 @@
# but json check is unconditional
%if 0%{?suse_version} >= 1210
BuildRequires: pkgconfig(json) >= 0.9
-BuildRequires: pkgconfig(libestr) >= 0.1.8
+BuildRequires: pkgconfig(libestr) >= 0.1.9
%else
BuildRequires: libee-devel
-BuildRequires: libestr-devel >= 0.1.8
+BuildRequires: libestr-devel >= 0.1.9
BuildRequires: libjson-devel
%endif
%if 0%{?suse_version} >= 1220
++++++ rsyslog-7.4.5.tar.gz -> rsyslog-7.4.6.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rsyslog-7.4.5/ChangeLog new/rsyslog-7.4.6/ChangeLog
--- old/rsyslog-7.4.5/ChangeLog 2013-10-16 12:43:18.000000000 +0200
+++ new/rsyslog-7.4.6/ChangeLog 2013-10-29 16:09:36.000000000 +0100
@@ -1,4 +1,34 @@
---------------------------------------------------------------------------
+Version 7.4.6 [v7.4-stable] 2013-10-31
+- bugfix: potential abort during HUP
+ This could happen when one of imklog, imzmq3, imkmsg, impstats,
+ imjournal, or imuxsock were under heavy load during a HUP.
+ closes: http://bugzilla.adiscon.com/show_bug.cgi?id=489
+ Thanks to Guy Rozendorn for reporting the problem and Peval Levhshin for
+ his analysis.
+- bugfix: imtcp flowControl parameter incorrectly defaulted to "off"
+ This could cause message loss on systems under heavy load and was
+ a change-of-behaviour to previous version. This is a regression
+ most probably introduced in 5.9.0 (but did not try hard to find the
+ exact point of its introduction).
+- now requires libestr 0.1.9 as earlier versions lead to problems with
+ number handling in RainerScript
+- bugfix: memory leak in strlen() RainerScript function
+ Thanks to Gregoire Seux for reportig this bug.
+ closes: http://bugzilla.adiscon.com/show_bug.cgi?id=486
+- bugfix: buffer overrun if re_extract function was called for submatch 50
+ Thanks to Pavel Levshin for reporting the problem and its location.
+- bugfix: memleak in re_extract() function
+ Thanks to Pavel Levshin for reporting this problem.
+- bugfix: potential abort in RainerScript optimizer
+ closes: http://bugzilla.adiscon.com/show_bug.cgi?id=488
+ Thanks to Thomas Doll for reporting the problem and Pavel Levshin for
+ fixing it.
+- bugfix: memory leak in omhiredis
+ Thanks to Pavel Levshin for the fix
+- bugfix: segfault if variable was assigned to non-container subtree
+ Thanks to Pavel Levshin for the fix
+---------------------------------------------------------------------------
Version 7.4.5 [v7.4-stable] 2013-10-22
- mmanon: removed the check for specific "terminator characters" after
last octet. As it turned out, this didn't work in practice as there
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rsyslog-7.4.5/configure new/rsyslog-7.4.6/configure
--- old/rsyslog-7.4.5/configure 2013-10-16 12:46:04.000000000 +0200
+++ new/rsyslog-7.4.6/configure 2013-10-29 16:10:20.000000000 +0100
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.68 for rsyslog 7.4.5.
+# Generated by GNU Autoconf 2.68 for rsyslog 7.4.6.
#
# Report bugs to .
#
@@ -570,8 +570,8 @@
# Identity of this package.
PACKAGE_NAME='rsyslog'
PACKAGE_TARNAME='rsyslog'
-PACKAGE_VERSION='7.4.5'
-PACKAGE_STRING='rsyslog 7.4.5'
+PACKAGE_VERSION='7.4.6'
+PACKAGE_STRING='rsyslog 7.4.6'
PACKAGE_BUGREPORT='rsyslog@lists.adiscon.com'
PACKAGE_URL=''
@@ -1594,7 +1594,7 @@
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures rsyslog 7.4.5 to adapt to many kinds of systems.
+\`configure' configures rsyslog 7.4.6 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1664,7 +1664,7 @@
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of rsyslog 7.4.5:";;
+ short | recursive ) echo "Configuration of rsyslog 7.4.6:";;
esac
cat <<\_ACEOF
@@ -1909,7 +1909,7 @@
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-rsyslog configure 7.4.5
+rsyslog configure 7.4.6
generated by GNU Autoconf 2.68
Copyright (C) 2010 Free Software Foundation, Inc.
@@ -2488,7 +2488,7 @@
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by rsyslog $as_me 7.4.5, which was
+It was created by rsyslog $as_me 7.4.6, which was
generated by GNU Autoconf 2.68. Invocation command line was
$ $0 $@
@@ -3303,7 +3303,7 @@
# Define the identity of the package.
PACKAGE='rsyslog'
- VERSION='7.4.5'
+ VERSION='7.4.6'
cat >>confdefs.h <<_ACEOF
@@ -13211,12 +13211,12 @@
pkg_cv_LIBESTR_CFLAGS="$LIBESTR_CFLAGS"
elif test -n "$PKG_CONFIG"; then
if test -n "$PKG_CONFIG" && \
- { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libestr >= 0.1.8\""; } >&5
- ($PKG_CONFIG --exists --print-errors "libestr >= 0.1.8") 2>&5
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libestr >= 0.1.9\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "libestr >= 0.1.9") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
- pkg_cv_LIBESTR_CFLAGS=`$PKG_CONFIG --cflags "libestr >= 0.1.8" 2>/dev/null`
+ pkg_cv_LIBESTR_CFLAGS=`$PKG_CONFIG --cflags "libestr >= 0.1.9" 2>/dev/null`
test "x$?" != "x0" && pkg_failed=yes
else
pkg_failed=yes
@@ -13228,12 +13228,12 @@
pkg_cv_LIBESTR_LIBS="$LIBESTR_LIBS"
elif test -n "$PKG_CONFIG"; then
if test -n "$PKG_CONFIG" && \
- { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libestr >= 0.1.8\""; } >&5
- ($PKG_CONFIG --exists --print-errors "libestr >= 0.1.8") 2>&5
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libestr >= 0.1.9\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "libestr >= 0.1.9") 2>&5
ac_status=$?
$as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
test $ac_status = 0; }; then
- pkg_cv_LIBESTR_LIBS=`$PKG_CONFIG --libs "libestr >= 0.1.8" 2>/dev/null`
+ pkg_cv_LIBESTR_LIBS=`$PKG_CONFIG --libs "libestr >= 0.1.9" 2>/dev/null`
test "x$?" != "x0" && pkg_failed=yes
else
pkg_failed=yes
@@ -13254,14 +13254,14 @@
_pkg_short_errors_supported=no
fi
if test $_pkg_short_errors_supported = yes; then
- LIBESTR_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libestr >= 0.1.8" 2>&1`
+ LIBESTR_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libestr >= 0.1.9" 2>&1`
else
- LIBESTR_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libestr >= 0.1.8" 2>&1`
+ LIBESTR_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libestr >= 0.1.9" 2>&1`
fi
# Put the nasty error message in config.log where it belongs
echo "$LIBESTR_PKG_ERRORS" >&5
- as_fn_error $? "Package requirements (libestr >= 0.1.8) were not met:
+ as_fn_error $? "Package requirements (libestr >= 0.1.9) were not met:
$LIBESTR_PKG_ERRORS
@@ -20766,7 +20766,7 @@
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by rsyslog $as_me 7.4.5, which was
+This file was extended by rsyslog $as_me 7.4.6, which was
generated by GNU Autoconf 2.68. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -20832,7 +20832,7 @@
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
-rsyslog config.status 7.4.5
+rsyslog config.status 7.4.6
configured by $0, generated by GNU Autoconf 2.68,
with options \\"\$ac_cs_config\\"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rsyslog-7.4.5/configure.ac new/rsyslog-7.4.6/configure.ac
--- old/rsyslog-7.4.5/configure.ac 2013-10-16 12:44:10.000000000 +0200
+++ new/rsyslog-7.4.6/configure.ac 2013-10-29 16:09:47.000000000 +0100
@@ -2,7 +2,7 @@
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.61)
-AC_INIT([rsyslog],[7.4.5],[rsyslog@lists.adiscon.com])
+AC_INIT([rsyslog],[7.4.6],[rsyslog@lists.adiscon.com])
AM_INIT_AUTOMAKE
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
@@ -32,7 +32,7 @@
PKG_PROG_PKG_CONFIG
# modules we require
-PKG_CHECK_MODULES(LIBESTR, libestr >= 0.1.8)
+PKG_CHECK_MODULES(LIBESTR, libestr >= 0.1.9)
PKG_CHECK_MODULES([JSON_C], [json],, [
PKG_CHECK_MODULES([JSON_C], [json-c])
])
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rsyslog-7.4.5/doc/manual.html new/rsyslog-7.4.6/doc/manual.html
--- old/rsyslog-7.4.5/doc/manual.html 2013-10-16 12:44:29.000000000 +0200
+++ new/rsyslog-7.4.6/doc/manual.html 2013-10-29 16:09:54.000000000 +0100
@@ -19,7 +19,7 @@
<p><b>Please visit the <a href="http://www.rsyslog.com/sponsors">rsyslog sponsor's page</a>
to honor the project sponsors or become one yourself!</b> We are very grateful for any help towards the
project goals.</p>
-<p><b>This documentation is for version 7.4.5 (v7.4-stable branch) of rsyslog.</b>
+<p><b>This documentation is for version 7.4.6 (v7.4-stable branch) of rsyslog.</b>
Visit the <i><a href="http://www.rsyslog.com/status">rsyslog status page</a></i></b>
to obtain current version information and project status.
</p><p><b>If you like rsyslog, you might
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rsyslog-7.4.5/grammar/rainerscript.c new/rsyslog-7.4.6/grammar/rainerscript.c
--- old/rsyslog-7.4.5/grammar/rainerscript.c 2013-10-16 12:41:54.000000000 +0200
+++ new/rsyslog-7.4.6/grammar/rainerscript.c 2013-10-29 16:08:48.000000000 +0100
@@ -1259,7 +1259,7 @@
str = (char*) var2CString(&r[0], &bMustFree);
matchnbr = (short) var2Number(&r[2], NULL);
submatchnbr = (size_t) var2Number(&r[3], NULL);
- if(submatchnbr > sizeof(pmatch)/sizeof(regmatch_t)) {
+ if(submatchnbr >= sizeof(pmatch)/sizeof(regmatch_t)) {
DBGPRINTF("re_extract() submatch %d is too large\n", submatchnbr);
bHadNoMatch = 1;
goto finalize_it;
@@ -1307,11 +1307,12 @@
iLenBuf);
}
+finalize_it:
if(bMustFree) free(str);
if(r[0].datatype == 'S') es_deleteStr(r[0].d.estr);
if(r[2].datatype == 'S') es_deleteStr(r[2].d.estr);
if(r[3].datatype == 'S') es_deleteStr(r[3].d.estr);
-finalize_it:
+
if(bHadNoMatch) {
cnfexprEval(func->expr[4], &r[4], usrptr);
estr = var2String(&r[4], &bMustFree);
@@ -1358,6 +1359,7 @@
estr = var2String(&r[0], &bMustFree);
ret->d.n = es_strlen(estr);
if(bMustFree) es_deleteStr(estr);
+ if(r[0].datatype == 'S') es_deleteStr(r[0].d.estr);
}
ret->datatype = 'N';
break;
@@ -2924,12 +2926,15 @@
expr->r = exprswap;
}
}
- if(expr->l->nodetype == 'V') {
- expr = cnfexprOptimize_CMP_var(expr);
- }
if(expr->r->nodetype == 'A') {
cnfexprOptimize_CMPEQ_arr((struct cnfarray *)expr->r);
}
+ /* This should be evaluated last because it may change expr
+ * to a function.
+ */
+ if(expr->l->nodetype == 'V') {
+ expr = cnfexprOptimize_CMP_var(expr);
+ }
break;
case CMP_LE:
case CMP_GE:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rsyslog-7.4.5/plugins/imtcp/imtcp.c new/rsyslog-7.4.6/plugins/imtcp/imtcp.c
--- old/rsyslog-7.4.5/plugins/imtcp/imtcp.c 2013-10-16 12:41:49.000000000 +0200
+++ new/rsyslog-7.4.6/plugins/imtcp/imtcp.c 2013-10-29 16:08:48.000000000 +0100
@@ -408,7 +408,7 @@
loadModConf->iTCPLstnMax = 20;
loadModConf->bSuppOctetFram = 1;
loadModConf->iStrmDrvrMode = 0;
- loadModConf->bUseFlowControl = 0;
+ loadModConf->bUseFlowControl = 1;
loadModConf->bKeepAlive = 0;
loadModConf->bEmitMsgOnClose = 0;
loadModConf->iAddtlFrameDelim = TCPSRV_NO_ADDTL_DELIMITER;
@@ -631,7 +631,7 @@
cs.iTCPLstnMax = 20;
cs.bSuppOctetFram = 1;
cs.iStrmDrvrMode = 0;
- cs.bUseFlowControl = 0;
+ cs.bUseFlowControl = 1;
cs.bKeepAlive = 0;
cs.bEmitMsgOnClose = 0;
cs.iAddtlFrameDelim = TCPSRV_NO_ADDTL_DELIMITER;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rsyslog-7.4.5/plugins/omhiredis/omhiredis.c new/rsyslog-7.4.6/plugins/omhiredis/omhiredis.c
--- old/rsyslog-7.4.5/plugins/omhiredis/omhiredis.c 2013-09-18 10:54:18.000000000 +0200
+++ new/rsyslog-7.4.6/plugins/omhiredis/omhiredis.c 2013-10-16 13:30:36.000000000 +0200
@@ -198,7 +198,7 @@
/* TODO: add error checking here! */
free ( pData->replies[i] );
}
- free ( pData->replies );
+ freeReplyObject ( pData->replies );
pData->count = 0;
ENDendTransaction
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rsyslog-7.4.5/runtime/glbl.c new/rsyslog-7.4.6/runtime/glbl.c
--- old/rsyslog-7.4.5/runtime/glbl.c 2013-10-16 12:41:49.000000000 +0200
+++ new/rsyslog-7.4.6/runtime/glbl.c 2013-10-29 16:08:48.000000000 +0100
@@ -32,6 +32,7 @@
#include
#include
#include
+#include
#include
#include "rsyslog.h"
@@ -71,6 +72,7 @@
static int bDisableDNS = 0; /* don't look up IP addresses of remote messages */
static prop_t *propLocalIPIF = NULL;/* IP address to report for the local host (default is 127.0.0.1) */
static prop_t *propLocalHostName = NULL;/* our hostname as FQDN - read-only after startup */
+static prop_t *propLocalHostNameToDelete = NULL;/* see GenerateLocalHostName function hdr comment! */
static uchar *LocalHostName = NULL;/* our hostname - read-only after startup, except HUP */
static uchar *LocalHostNameOverride = NULL;/* user-overridden hostname - read-only after startup */
static uchar *LocalFQDNName = NULL;/* our hostname as FQDN - read-only after startup, except HUP */
@@ -379,17 +381,31 @@
/* generate the local hostname property. This must be done after the hostname info
* has been set as well as PreserveFQDN.
* rgerhards, 2009-06-30
+ * NOTE: This function tries to avoid locking by not destructing the previous value
+ * immediately. This is so that current readers can continue to use the previous name.
+ * Otherwise, we would need to use read/write locks to protect the update process.
+ * In order to do so, we save the previous value and delete it when we are called again
+ * the next time. Note that this in theory is racy and can lead to a double-free.
+ * In practice, however, the window of exposure to trigger this is extremely short
+ * and as this functions is very infrequently being called (on HUP), the trigger
+ * condition for this bug is so highly unlikely that it never occurs in practice.
+ * Probably if you HUP rsyslog every few milliseconds, but who does that...
+ * To further reduce risk potential, we do only update the property when there
+ * actually is a hostname change, which makes it even less likely.
+ * rgerhards, 2013-10-28
*/
static rsRetVal
GenerateLocalHostNameProperty(void)
{
- DEFiRet;
+ uchar *pszPrev;
+ int lenPrev;
+ prop_t *hostnameNew;
uchar *pszName;
+ DEFiRet;
- if(propLocalHostName != NULL)
- prop.Destruct(&propLocalHostName);
+ if(propLocalHostNameToDelete != NULL)
+ prop.Destruct(&propLocalHostNameToDelete);
- CHKiRet(prop.Construct(&propLocalHostName));
if(LocalHostNameOverride == NULL) {
if(LocalHostName == NULL)
pszName = (uchar*) "[localhost]";
@@ -403,8 +419,20 @@
pszName = LocalHostNameOverride;
}
DBGPRINTF("GenerateLocalHostName uses '%s'\n", pszName);
- CHKiRet(prop.SetString(propLocalHostName, pszName, ustrlen(pszName)));
- CHKiRet(prop.ConstructFinalize(propLocalHostName));
+
+ if(propLocalHostName == NULL)
+ pszPrev = (uchar*)""; /* make sure strcmp() below does not match */
+ else
+ prop.GetString(propLocalHostName, &pszPrev, &lenPrev);
+
+ if(ustrcmp(pszPrev, pszName)) {
+ /* we need to update */
+ CHKiRet(prop.Construct(&hostnameNew));
+ CHKiRet(prop.SetString(hostnameNew, pszName, ustrlen(pszName)));
+ CHKiRet(prop.ConstructFinalize(hostnameNew));
+ propLocalHostNameToDelete = propLocalHostName;
+ propLocalHostName = hostnameNew;
+ }
finalize_it:
RETiRet;
@@ -667,6 +695,8 @@
free(LocalHostNameOverride);
free(LocalFQDNName);
objRelease(prop, CORE_COMPONENT);
+ if(propLocalHostNameToDelete != NULL)
+ prop.Destruct(&propLocalHostNameToDelete);
DESTROY_ATOMIC_HELPER_MUT(mutTerminateInputs);
ENDObjClassExit(glbl)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/rsyslog-7.4.5/runtime/msg.c new/rsyslog-7.4.6/runtime/msg.c
--- old/rsyslog-7.4.5/runtime/msg.c 2013-10-16 12:41:49.000000000 +0200
+++ new/rsyslog-7.4.6/runtime/msg.c 2013-10-29 16:08:48.000000000 +0100
@@ -3934,6 +3934,12 @@
}
leaf = jsonPathGetLeaf(name, ustrlen(name));
CHKiRet(jsonPathFindParent(pM, name, leaf, &parent, 1));
+ if (json_object_get_type(parent) != json_type_object) {
+ DBGPRINTF("msgAddJSON: not a container in json path,"
+ "name is '%s'\n", name);
+ json_object_put(json);
+ ABORT_FINALIZE(RS_RET_INVLD_SETOP);
+ }
leafnode = json_object_object_get(parent, (char*)leaf);
if(leafnode == NULL) {
json_object_object_add(parent, (char*)leaf, json);
--
To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org
For additional commands, e-mail: opensuse-commit+help@opensuse.org