diff --git a/0002-do-not-finish-applydeltarpm-jobs-when-in-the-middle-.patch b/0002-do-not-finish-applydeltarpm-jobs-when-in-the-middle-.patch new file mode 100644 index 0000000..7b1a803 --- /dev/null +++ b/0002-do-not-finish-applydeltarpm-jobs-when-in-the-middle-.patch @@ -0,0 +1,98 @@ +From 9e0e8bf226112195c93fa2493086353bd46bd001 Mon Sep 17 00:00:00 2001 +From: Michael Schroeder +Date: Wed, 17 Dec 2014 18:07:11 +0100 +Subject: [PATCH 2/4] do not finish applydeltarpm jobs when in the middle of a + request + +If applydeltarpm failed we start another request, this does not +mix well if re're in the middle of receiving another request... +--- + drpmsync | 39 +++++++++++++++++++++++++++------------ + 1 file changed, 27 insertions(+), 12 deletions(-) + +diff --git a/drpmsync b/drpmsync +index f629aad..2265b7e 100755 +--- a/drpmsync ++++ b/drpmsync +@@ -2686,6 +2686,7 @@ sub opensock { + return if $sock_isopen; + my $tcpproto = getprotobyname('tcp'); + socket(S, PF_INET, SOCK_STREAM, $tcpproto) || die("socket: $!\n"); ++ setsockopt(S, SOL_SOCKET, SO_KEEPALIVE, pack("l",1)) || die("setsockopt: $!\n"); + connect(S, sockaddr_in($syncport, $syncaddr)) || die("connect: $!\n"); + $sock_isopen = 1; + } +@@ -2974,7 +2975,8 @@ sub drpmsync_get_update { + } elsif ($type eq 'FISO') { + $ans = copytofile(*S, "$tmpnam.fiso", $ans, $anssize, $ctx); + $ans = finishreq(*S, $ans, $ctx, $id); +- return 'FISO', [ $tmpnam, undef, substr($extra, 0, 12) ]; ++ $d = [ $tmpnam, undef, substr($extra, 0, 12) ]; ++ return ('FISO', $d); + } elsif ($type eq 'RPM ') { + $sabytes -= $anssize; + my $delta; +@@ -2982,36 +2984,49 @@ sub drpmsync_get_update { + die("nothing to do?\n") if $nrpm == 0 && $ndrpm == 0; + my @deltas; + my $dextra = substr($extra, 12 + 16); ++ my @renames; + while ($ndrpm > 0) { + $delta = $tmpnam; + $delta =~ s/[^\/]*$//; + $delta .= substr($dextra, 12, 32 * 3); +- # end old job if we have a delta conflict +- checkjob() if $runningjob && -e $delta; + my $size = hex(substr($dextra, 12 + 3 * 32, 8)); + die("delta rpm bigger than answer? $size > $anssize\n") if $size > $anssize; ++ push @deltas, $delta; ++ # conflict with running job? ++ if ($runningjob && -e $delta) { ++ push @renames, $delta; ++ $delta .= ".tmp"; ++ } + $ans = copytofile(*S, $delta, $ans, $size, $ctx); + $anssize -= $size; + fixmodetime($delta, substr($dextra, 0, 12)); + $dextra = substr($dextra, 12 + 32 * 3 + 8); +- push @deltas, $delta; + $ndrpm--; + } +- if ($nrpm == 1) { ++ if ($nrpm) { + $ans = copytofile_seek(*S, $tmpnam, $extractoff, $ans, $anssize, $ctx); +- $ans = finishreq(*S, $ans, $ctx, $id); +- return 'RPM ', [ $dto->[0] ], @deltas if $rextract; ++ } else { ++ die("junk at end of answer\n") if $anssize; ++ } ++ $ans = finishreq(*S, $ans, $ctx, $id); ++ if (@renames) { ++ checkjob(); ++ for (@renames) { ++ rename("$_.tmp", $_) || die("rename $_.tmp $_: $!\n"); ++ } ++ } ++ if (!$nrpm) { ++ $d = [ undef, undef, substr($extra, 0, 12) ]; ++ } elsif ($rextract) { ++ $d = [ $dto->[0] ]; ++ } else { + fixmodetime($tmpnam, substr($extra, 0, 12)); + my @s = stat($tmpnam); + die("$tmpnam: $!\n") unless @s; + $sabytes += $s[7]; + $d = [ $dto->[0], "$s[9]/$s[7]/$s[1]", sprintf("1%03x%08x", ($s[2] & 07777), $s[9]), rpminfo($tmpnam) ]; +- } else { +- die("junk at end of answer\n") if $anssize; +- $ans = finishreq(*S, $ans, $ctx, $id); +- $d = [ undef, undef, substr($extra, 0, 12) ]; + } +- return 'RPM ', $d, @deltas; ++ return ('RPM ', $d, @deltas); + } else { + die("received strange answer type: $type\n"); + } +-- +2.1.0 + diff --git a/0003-add-newline-in-missing-prelink-error.patch b/0003-add-newline-in-missing-prelink-error.patch new file mode 100644 index 0000000..8137fc2 --- /dev/null +++ b/0003-add-newline-in-missing-prelink-error.patch @@ -0,0 +1,25 @@ +From 6b13095e1ae5b3ba2f2631ce750ac1d3d3d3e152 Mon Sep 17 00:00:00 2001 +From: Michael Schroeder +Date: Fri, 9 Jan 2015 12:39:39 +0100 +Subject: [PATCH 3/4] add newline in missing prelink error + +--- + prelink.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/prelink.c b/prelink.c +index 07516f8..e74fbc5 100644 +--- a/prelink.c ++++ b/prelink.c +@@ -130,7 +130,7 @@ prelinked_open(char *name) + if (stat("/usr/sbin/prelink", &stb)) + { + perror("/usr/sbin/prelink"); +- fprintf(stderr, "prelink not installed, cannot undo prelinking"); ++ fprintf(stderr, "prelink not installed, cannot undo prelinking\n"); + exit(1); + } + strcpy(template, "/tmp/deltarpm.XXXXXX"); +-- +2.1.0 + diff --git a/0004-Return-error-rather-than-crashing-if-we-can-t-alloca.patch b/0004-Return-error-rather-than-crashing-if-we-can-t-alloca.patch new file mode 100644 index 0000000..061a7dd --- /dev/null +++ b/0004-Return-error-rather-than-crashing-if-we-can-t-alloca.patch @@ -0,0 +1,41 @@ +From 1d0657b29ee72e842e0d1ada61ea0177b3159a8e Mon Sep 17 00:00:00 2001 +From: Jonathan Dieter +Date: Mon, 12 Jan 2015 13:47:51 +0200 +Subject: [PATCH 4/4] Return error rather than crashing if we can't allocate + memory + +Signed-off-by: Jonathan Dieter +--- + deltarpmmodule.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/deltarpmmodule.c b/deltarpmmodule.c +index cf333b6..40ea60f 100644 +--- a/deltarpmmodule.c ++++ b/deltarpmmodule.c +@@ -46,6 +46,11 @@ PyObject *createDict(struct deltarpm d) + if (d.seq) { + char *tmp = calloc(d.seql * 2 + 1, sizeof(char)); + int i; ++ ++ if(tmp == NULL) { ++ PyErr_SetFromErrno(PyExc_SystemError); ++ return NULL; ++ } + for (i = 0; i < d.seql; i++) { + char buf[3]; + +@@ -54,6 +59,10 @@ PyObject *createDict(struct deltarpm d) + } + o = PyString_FromString(tmp); + free(tmp); ++ if(o == NULL) { ++ PyErr_SetFromErrno(PyExc_SystemError); ++ return NULL; ++ } + PyDict_SetItemString(dict, "seq", o); + Py_DECREF(o); + } else { +-- +2.1.0 + diff --git a/deltarpm.spec b/deltarpm.spec index 9a24a94..7fa743e 100644 --- a/deltarpm.spec +++ b/deltarpm.spec @@ -7,11 +7,14 @@ Summary: Create deltas between rpms Name: deltarpm Version: 3.6 -Release: 6%{?dist} +Release: 7%{?dist} License: BSD Group: System Environment/Base URL: http://gitorious.org/deltarpm/deltarpm Source: ftp://ftp.suse.com/pub/projects/deltarpm/%{name}-%{version}.tar.bz2 +Patch1: 0002-do-not-finish-applydeltarpm-jobs-when-in-the-middle-.patch +Patch2: 0003-add-newline-in-missing-prelink-error.patch +Patch3: 0004-Return-error-rather-than-crashing-if-we-can-t-alloca.patch BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: bzip2-devel, xz-devel, rpm-devel, popt-devel @@ -68,6 +71,9 @@ This package contains python bindings for deltarpm. %prep %setup -q +%patch1 -p1 +%patch2 -p1 +%patch3 -p1 %build %{__make} %{?_smp_mflags} CFLAGS="$RPM_OPT_FLAGS" \ @@ -134,6 +140,10 @@ rm -rf %{buildroot}%{_libdir}/python3* %endif %changelog +* Mon Jan 12 2015 Jonathan Dieter - 3.6-7 +- Add upstream patches to fix a few small bugs +- Do better error check in low memory situations (#791359) + * Sat Aug 16 2014 Fedora Release Engineering - 3.6-6 - Rebuilt for https://fedoraproject.org/wiki/Fedora_21_22_Mass_Rebuild