diff --git a/.gitignore b/.gitignore index b3cba2a..f906829 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1 @@ -/xmlrpc-c-1.24.4.tar.xz -/xmlrpc-c-1.25.0.tar.xz -/xmlrpc-c-1.25.1.tar.xz -/xmlrpc-c-1.26.0.tar.xz -/xmlrpc-c-1.26.3.tar.xz -/xmlrpc-c-1.27.0.tar.xz -/xmlrpc-c-1.27.3.tar.xz -/xmlrpc-c-1.27.4.tar.xz -/xmlrpc-c-1.27.5.tar.xz +/xmlrpc-c-1.27.7.tar.xz diff --git a/fix-double-free.patch b/fix-double-free.patch new file mode 100644 index 0000000..e0f8ab0 --- /dev/null +++ b/fix-double-free.patch @@ -0,0 +1,105 @@ +commit dc129ae656085855cf126e81183001a5c50fdd77 +Author: giraffedata +Date: Sat May 26 21:00:19 2012 +0000 + + Fix double free of memory with failed xmlrpc_parse_value() + + git-svn-id: https://xmlrpc-c.svn.sourceforge.net/svnroot/xmlrpc-c/trunk@2327 adbb7d4b-a73a-0410-a071-c5f57c452bd4 + +diff --git a/src/xmlrpc_decompose.c b/src/xmlrpc_decompose.c +index 6323a26..4a77426 100644 +--- a/src/xmlrpc_decompose.c ++++ b/src/xmlrpc_decompose.c +@@ -165,37 +165,33 @@ struct decompTreeNode { + + /* prototype for recursive calls */ + static void +-releaseDecomposition(const struct decompTreeNode * const decompRootP, +- bool const oldstyleMemMgmt); ++releaseDecomposition(const struct decompTreeNode * const decompRootP); + + + static void +-releaseDecompArray(struct arrayDecomp const arrayDecomp, +- bool const oldstyleMemMgmt) { ++releaseDecompArray(struct arrayDecomp const arrayDecomp) { + + unsigned int i; + for (i = 0; i < arrayDecomp.itemCnt; ++i) { +- releaseDecomposition(arrayDecomp.itemArray[i], oldstyleMemMgmt); ++ releaseDecomposition(arrayDecomp.itemArray[i]); + } + } + + ++ + static void +-releaseDecompStruct(struct structDecomp const structDecomp, +- bool const oldstyleMemMgmt) { ++releaseDecompStruct(struct structDecomp const structDecomp) { + + unsigned int i; + for (i = 0; i < structDecomp.mbrCnt; ++i) { +- releaseDecomposition(structDecomp.mbrArray[i].decompTreeP, +- oldstyleMemMgmt); ++ releaseDecomposition(structDecomp.mbrArray[i].decompTreeP); + } + } + + + + static void +-releaseDecomposition(const struct decompTreeNode * const decompRootP, +- bool const oldstyleMemMgmt) { ++releaseDecomposition(const struct decompTreeNode * const decompRootP) { + /*---------------------------------------------------------------------------- + Assuming that Caller has decomposed something according to 'decompRootP', + release whatever resources the decomposed information occupies. +@@ -236,10 +232,10 @@ releaseDecomposition(const struct decompTreeNode * const decompRootP, + xmlrpc_DECREF(*decompRootP->store.TstructVal.valueP); + break; + case '(': +- releaseDecompArray(decompRootP->store.Tarray, oldstyleMemMgmt); ++ releaseDecompArray(decompRootP->store.Tarray); + break; + case '{': +- releaseDecompStruct(decompRootP->store.Tstruct, oldstyleMemMgmt); ++ releaseDecompStruct(decompRootP->store.Tstruct); + break; + } + } +@@ -310,11 +306,12 @@ parsearray(xmlrpc_env * const envP, + } + } + if (envP->fault_occurred) { +- /* Release the items we completed before we failed. */ +- unsigned int i; +- for (i = 0; i < doneCnt; ++i) +- releaseDecomposition(arrayDecomp.itemArray[i], +- oldstyleMemMgmt); ++ if (!oldstyleMemMgmt) { ++ /* Release the items we completed before we failed. */ ++ unsigned int i; ++ for (i = 0; i < doneCnt; ++i) ++ releaseDecomposition(arrayDecomp.itemArray[i]); ++ } + } + } + } +@@ -351,10 +348,12 @@ parsestruct(xmlrpc_env * const envP, + } + + if (envP->fault_occurred) { +- unsigned int i; +- for (i = 0; i < doneCount; ++i) +- releaseDecomposition(structDecomp.mbrArray[i].decompTreeP, +- oldstyleMemMgmt); ++ if (!oldstyleMemMgmt) { ++ /* Release the items we completed before we failed. */ ++ unsigned int i; ++ for (i = 0; i < doneCount; ++i) ++ releaseDecomposition(structDecomp.mbrArray[i].decompTreeP); ++ } + } + } + diff --git a/fix-string-exceptions.patch b/fix-string-exceptions.patch new file mode 100644 index 0000000..794505d --- /dev/null +++ b/fix-string-exceptions.patch @@ -0,0 +1,23 @@ +commit e843bfc560ec7baabf9f88421ecdd1826e9fb578 +Author: giraffedata +Date: Wed Aug 22 03:18:22 2012 +0000 + + Release 1.25.19 + + git-svn-id: https://xmlrpc-c.svn.sourceforge.net/svnroot/xmlrpc-c/stable@2385 adbb7d4b-a73a-0410-a071-c5f57c452bd4 + +diff --git a/src/xmlrpc_string.c b/src/xmlrpc_string.c +index ac9a1f5..9496bfa 100644 +--- a/src/xmlrpc_string.c ++++ b/src/xmlrpc_string.c +@@ -673,6 +673,10 @@ stringNew(xmlrpc_env * const envP, + + xmlrpc_value * valP; + ++ // hack to work around old-style exception cleanup in ++ // convert_params() in xmlrpc_parse.c. ++ valP = NULL; ++ + xmlrpc_validate_utf8(envP, value, length); + + if (!envP->fault_occurred) { diff --git a/ipv6-parse.patch b/ipv6-parse.patch new file mode 100644 index 0000000..35e443a --- /dev/null +++ b/ipv6-parse.patch @@ -0,0 +1,22 @@ +commit 2b92ed9855f4decbab5ba46d0cbf491f3fd6044b +Author: giraffedata +Date: Sat May 19 02:06:59 2012 +0000 + + Fix parsing of host/port with colons in host portion + + [backported] + git-svn-id: https://xmlrpc-c.svn.sourceforge.net/svnroot/xmlrpc-c/trunk@2323 adbb7d4b-a73a-0410-a071-c5f57c452bd4 + +diff --git a/lib/abyss/src/http.c b/lib/abyss/src/http.c +index 096d93e..6b03e4c 100644 +--- a/lib/abyss/src/http.c ++++ b/lib/abyss/src/http.c +@@ -527,7 +527,7 @@ parseHostPort(const char * const hostport, + + buffer = strdup(hostport); + +- colonPos = strchr(buffer, ':'); ++ colonPos = strrchr(buffer, ':'); + if (colonPos) { + const char * p; + uint32_t port; diff --git a/lastver b/lastver index 10a3282..f9bef4a 100644 --- a/lastver +++ b/lastver @@ -1 +1 @@ -2182 +2233 diff --git a/release-1.25.20.patch b/release-1.25.20.patch new file mode 100644 index 0000000..315514b --- /dev/null +++ b/release-1.25.20.patch @@ -0,0 +1,69 @@ +From 1c76aa8abeaef8273f637324e43de78677535833 Mon Sep 17 00:00:00 2001 +From: giraffedata +Date: Fri, 19 Oct 2012 19:47:27 +0000 +Subject: Release 1.25.20 + +git-svn-id: https://xmlrpc-c.svn.sourceforge.net/svnroot/xmlrpc-c/stable@2435 adbb7d4b-a73a-0410-a071-c5f57c452bd4 +--- + lib/curl_transport/xmlrpc_curl_transport.c | 23 ++++++++++++++++++++--- + version.mk | 2 +- + 2 Dateien geändert, 21 Zeilen hinzugefügt(+), 4 Zeilen entfernt(-) + +diff --git a/lib/curl_transport/xmlrpc_curl_transport.c b/lib/curl_transport/xmlrpc_curl_transport.c +index c48b927..96a403e 100644 +--- a/lib/curl_transport/xmlrpc_curl_transport.c ++++ b/lib/curl_transport/xmlrpc_curl_transport.c +@@ -1170,6 +1170,16 @@ createRpc(xmlrpc_env * const envP, + if (rpcP == NULL) + xmlrpc_faultf(envP, "Couldn't allocate memory for rpc object"); + else { ++ curlt_progressFn * curlProgressFn; ++ ++ if (progress || clientTransportP->interruptP) ++ curlProgressFn = &curlTransactionProgress; ++ else { ++ /* There's nothing for curlTransactionProgress() to do, so save ++ the time and complexity of calling it. ++ */ ++ curlProgressFn = NULL; ++ } + rpcP->transportP = clientTransportP; + rpcP->curlSessionP = curlSessionP; + rpcP->callInfoP = callInfoP; +@@ -1186,7 +1196,7 @@ createRpc(xmlrpc_env * const envP, + &clientTransportP->curlSetupStuff, + rpcP, + complete ? &finishRpcCurlTransaction : NULL, +- progress ? &curlTransactionProgress : NULL, ++ curlProgressFn, + &rpcP->curlTransactionP); + if (!envP->fault_occurred) { + if (envP->fault_occurred) +@@ -1296,15 +1306,22 @@ curlTransactionProgress(void * const context, + + assert(rpcP); + assert(transportP); +- assert(rpcP->progress); + + progressData.response.total = dlTotal; + progressData.response.now = dlNow; + progressData.call.total = ulTotal; + progressData.call.now = ulNow; + +- rpcP->progress(rpcP->callInfoP, progressData); ++ if (rpcP->progress) { ++ struct xmlrpc_progress_data progressData; ++ ++ progressData.response.total = dlTotal; ++ progressData.response.now = dlNow; ++ progressData.call.total = ulTotal; ++ progressData.call.now = ulNow; + ++ rpcP->progress(rpcP->callInfoP, progressData); ++ } + if (transportP->interruptP) + *abortP = *transportP->interruptP; + else +-- +1.7.11.7 + diff --git a/release-1.25.21.patch b/release-1.25.21.patch new file mode 100644 index 0000000..09eae01 --- /dev/null +++ b/release-1.25.21.patch @@ -0,0 +1,59 @@ +From c880196664ca3902cbf8fd806a58a9e9f362abb0 Mon Sep 17 00:00:00 2001 +From: giraffedata +Date: Thu, 29 Nov 2012 04:37:55 +0000 +Subject: Release 1.25.21 + +git-svn-id: https://xmlrpc-c.svn.sourceforge.net/svnroot/xmlrpc-c/stable@2452 adbb7d4b-a73a-0410-a071-c5f57c452bd4 +--- + lib/abyss/src/channel.c | 2 +- + src/method.c | 1 + + src/xmlrpc_libxml2.c | 6 ++++-- + version.mk | 2 +- + 4 Dateien geändert, 7 Zeilen hinzugefügt(+), 4 Zeilen entfernt(-) + +diff --git a/lib/abyss/src/channel.c b/lib/abyss/src/channel.c +index 5044e23..5454bd0 100644 +--- a/lib/abyss/src/channel.c ++++ b/lib/abyss/src/channel.c +@@ -181,7 +181,7 @@ void + ChannelInterrupt(TChannel * const channelP) { + + if (ChannelTraceIsActive) +- fprintf(stderr, "Interrupting channel waits"); ++ fprintf(stderr, "Interrupting channel waits\n"); + + (*channelP->vtbl.interrupt)(channelP); + } +diff --git a/src/method.c b/src/method.c +index 467bbbe..e375e5f 100644 +--- a/src/method.c ++++ b/src/method.c +@@ -54,6 +54,7 @@ translateTypeSpecifierToName(xmlrpc_env * const envP, + case 'S': *typeNameP = "struct"; break; + case 'A': *typeNameP = "array"; break; + case 'n': *typeNameP = "nil"; break; ++ case 'I': *typeNameP = "i8"; break; + default: + xmlrpc_faultf(envP, + "Method registry contains invalid signature " +diff --git a/src/xmlrpc_libxml2.c b/src/xmlrpc_libxml2.c +index 3df6231..574af86 100644 +--- a/src/xmlrpc_libxml2.c ++++ b/src/xmlrpc_libxml2.c +@@ -422,9 +422,11 @@ xml_parse(xmlrpc_env * const envP, + *resultPP = context.root; + + cleanup: +- if (parser) ++ if (parser) { ++ if (parser->myDoc) ++ xmlFreeDoc(parser->myDoc); + xmlFreeParserCtxt(parser); +- ++ } + if (envP->fault_occurred) { + if (context.root) + xml_element_free(context.root); +-- +1.7.11.7 + diff --git a/sources b/sources index 3f8f8cb..a5209ff 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -0c22580e707bd91be2478e93ea8bce72 xmlrpc-c-1.27.5.tar.xz +2805f07ba44ceb0d66eacd948884d2f4 xmlrpc-c-1.27.7.tar.xz diff --git a/xmlrpc-boolean-meaning.patch b/xmlrpc-boolean-meaning.patch new file mode 100644 index 0000000..abb581b --- /dev/null +++ b/xmlrpc-boolean-meaning.patch @@ -0,0 +1,21 @@ +commit 2764e9684ec9284cf86ad602505cb03ea77a2ad2 +Author: giraffedata +Date: Sat Dec 10 21:13:10 2011 +0000 + + Fix bug: doesn't accept 'b/f' to mean boolean false + + git-svn-id: https://xmlrpc-c.svn.sourceforge.net/svnroot/xmlrpc-c/trunk@2224 adbb7d4b-a73a-0410-a071-c5f57c452bd4 + +diff --git a/tools/xmlrpc/xmlrpc.c b/tools/xmlrpc/xmlrpc.c +index 06da3e5..3f24431 100644 +--- a/tools/xmlrpc/xmlrpc.c ++++ b/tools/xmlrpc/xmlrpc.c +@@ -352,7 +352,7 @@ buildBool(xmlrpc_env * const envP, + + if (streq(valueString, "t") || streq(valueString, "true")) + *paramPP = xmlrpc_bool_new(envP, true); +- else if (streq(valueString, "f") == 0 || streq(valueString, "false")) ++ else if (streq(valueString, "f") || streq(valueString, "false")) + *paramPP = xmlrpc_bool_new(envP, false); + else + setError(envP, "Boolean argument has unrecognized value '%s'. " diff --git a/xmlrpc-c-struct-serialize.patch b/xmlrpc-c-struct-serialize.patch new file mode 100644 index 0000000..cba3b50 --- /dev/null +++ b/xmlrpc-c-struct-serialize.patch @@ -0,0 +1,29 @@ +From 9b65c6488a51d36513b9315c11dfb42f319079ac Mon Sep 17 00:00:00 2001 +From: Enrico Scholz +Date: Mon, 3 Oct 2011 20:49:57 +0200 +Subject: [PATCH] xmlrpc_serialize: check for faults before appending + + +fixes https://bugzilla.redhat.com/show_bug.cgi?id=741980 which was +caused by transmitting too large files within a structure. +--- + src/xmlrpc_serialize.c | 3 ++- + 1 files changed, 2 insertions(+), 1 deletions(-) + +diff --git a/src/xmlrpc_serialize.c b/src/xmlrpc_serialize.c +index 78bbc10..e0d9376 100644 +--- a/src/xmlrpc_serialize.c ++++ b/src/xmlrpc_serialize.c +@@ -370,7 +370,8 @@ serializeStruct(xmlrpc_env * const envP, + memberKeyP, memberValueP, dialect); + } + } +- addString(envP, outputP, ""); ++ if (!envP->fault_occurred) ++ addString(envP, outputP, ""); + } + } + } +-- +1.7.6 + diff --git a/xmlrpc-c.spec b/xmlrpc-c.spec index 7c0d4f6..c7ff7cb 100644 --- a/xmlrpc-c.spec +++ b/xmlrpc-c.spec @@ -5,8 +5,8 @@ Summary: A lightweight RPC library based on XML and HTTP Name: xmlrpc-c -Version: 1.27.5 -Release: %release_func 1700.svn%svnrev +Version: 1.27.7 +Release: %release_func 1604.svn%svnrev # See COPYING for details. # The Python 1.5.2 license used by a few files is just BSD. License: BSD and MIT @@ -21,6 +21,13 @@ URL: http://xmlrpc-c.sourceforge.net/ Source100: dfs.cc Source101: dso-fixup +Patch0: xmlrpc-boolean-meaning.patch +Patch2: ipv6-parse.patch +Patch3: fix-double-free.patch +Patch4: fix-string-exceptions.patch +Patch5: release-1.25.20.patch +Patch6: release-1.25.21.patch + Patch100: xmlrpc-c-cmake.patch Patch102: xmlrpc-c-printf-size_t.patch Patch105: xmlrpc-c-longlong.patch @@ -28,6 +35,7 @@ Patch107: xmlrpc-c-uninit-curl.patch Patch108: xmlrpc-c-30x-redirect.patch Patch109: xmlrpc-c-check-vasprintf-return-value.patch Patch110: xmlrpc-c-include-string_int.h.patch +Patch111: xmlrpc-c-struct-serialize.patch BuildRoot: %_tmppath/%name-%version-%release-root @@ -43,6 +51,8 @@ Requires: %name%{?_isa} = %version-%release Summary: C client libraries for xmlrpc-c Group: System Environment/Libraries Requires: %name%{?_isa} = %version-%release +# we need a CURLOPT_GSSAPI_DELEGATION patched libcurl +BuildConflicts: libcurl-devel < 7.21.7-2 %package client++ Summary: C++ client libraries for xmlrpc-c @@ -110,6 +120,14 @@ This package contains some handy XML-RPC demo applications. %prep %setup -q + +%patch0 -p1 +%patch2 -p1 +%patch3 -p1 +%patch4 -p1 +%patch5 -p1 +%patch6 -p1 + %patch100 -p1 %patch102 -p1 %patch105 -p1 @@ -117,6 +135,7 @@ This package contains some handy XML-RPC demo applications. %patch108 -p1 %patch109 -p1 %patch110 -p1 +%patch111 -p1 ## not needed... rm doc/{INSTALL,configure_doc} @@ -235,13 +254,40 @@ rm -rf $RPM_BUILD_ROOT %changelog -* Sat Aug 27 2011 Enrico Scholz - 1.27.5-1700.svn2185 +* Sun Dec 9 2012 Enrico Scholz - 1.27.7-1604.svn2185 +- forward ported two patches from stable branch +- fixes interruption with libcurl transport +- fixes parsing error of 64 bit integers +- fixes libxml2 related memory leak + +* Sun Aug 26 2012 Enrico Scholz - 1.27.7-1603.svn2185 +- forward-ported patch from stable branch which fixes exception + handling on invalid utf-8 strings + +* Wed Jun 6 2012 Enrico Scholz - 1.27.7-1602.svn2185 +- backported "Fix double free of memory with failed xmlrpc_parse_value()" + patch + +* Sat May 26 2012 Enrico Scholz - 1.27.7-1601.svn2185 +- backported IPv6 server related patch + +* Wed Jan 4 2012 Enrico Scholz - 1.27.7-1600.svn2185 +- updated to 1.27.7; only build fixes not affecting us +- backported fix for "doesn't accept 'b/f' to mean boolean false" + +* Mon Oct 3 2011 Enrico Scholz - 1.27.5-1601.svn2185 +- fixed error handling when transfering too large files (#741980) + +* Sat Aug 27 2011 Enrico Scholz - 1.27.5-1600.svn2185 - updated to 1.27.5 -* Sun Aug 7 2011 Enrico Scholz - 1.27.4-1700.svn2171 +* Mon Aug 8 2011 Enrico Scholz - 1.27.4-1601.svn2171 +- rebuilt with correct check for libcurl-devel + +* Sun Aug 7 2011 Enrico Scholz - 1.27.4-1600.svn2171 - updated to 1.27.4 -* Sun Aug 7 2011 Enrico Scholz - 1.27.3-1700.svn2145 +* Sun Aug 7 2011 Enrico Scholz - 1.27.3-1600.svn2145 - updated to 1.27.3 * Mon Jun 27 2011 Enrico Scholz - 1.27.0-1600.svn2145