diff options
author | Thierry Vignaud <tv@mageia.org> | 2012-09-05 17:23:59 +0000 |
---|---|---|
committer | Thierry Vignaud <tv@mageia.org> | 2012-09-05 17:23:59 +0000 |
commit | d3d0c0d8f99ab9947c9b4ac20a90dcb9e48fb2b1 (patch) | |
tree | 85bd7e119b3f42097165abb53fa92cba2a362c3d | |
parent | 67079ebff7a5a6d43d70df1c1a574c10172d0129 (diff) | |
download | perl-URPM-d3d0c0d8f99ab9947c9b4ac20a90dcb9e48fb2b1.tar perl-URPM-d3d0c0d8f99ab9947c9b4ac20a90dcb9e48fb2b1.tar.gz perl-URPM-d3d0c0d8f99ab9947c9b4ac20a90dcb9e48fb2b1.tar.bz2 perl-URPM-d3d0c0d8f99ab9947c9b4ac20a90dcb9e48fb2b1.tar.xz perl-URPM-d3d0c0d8f99ab9947c9b4ac20a90dcb9e48fb2b1.zip |
(parse_synthesis__XS) enable to read xz & bzip2 compressed synthesis
(backported from trunk)
Including "Do not try to parse current pointer when the line is invalid
or empgty" commit which fixes a "Conditional jump or move depends on
uninitialised value" during empty synthesis parsing
-rw-r--r-- | NEWS | 1 | ||||
-rw-r--r-- | URPM.xs | 34 | ||||
-rw-r--r-- | t/synthesis.t | 18 |
3 files changed, 38 insertions, 15 deletions
@@ -1,5 +1,6 @@ - don't read/write after the string when the synthesis is slightly malformed +- enable to read xz & bzip2 compressed synthesis Version 3.38.1.1 - 29 February 2012 @@ -20,7 +20,6 @@ #include <sys/wait.h> #include <fcntl.h> #include <unistd.h> -#include <zlib.h> #include <libintl.h> #undef Fflush @@ -3312,12 +3311,13 @@ Urpm_parse_synthesis__XS(urpm, filename, ...) if (depslist != NULL) { char buff[65536]; - char *p, *eol; + char *p, *eol, *t; int buff_len; struct s_Package pkg; - gzFile f; + FD_t f = NULL; int start_id = 1 + av_len(depslist); SV *callback = NULL; + rpmCompressedMagic compressed = COMPRESSED_OTHER; if (items > 2) { int i; @@ -3332,12 +3332,25 @@ Urpm_parse_synthesis__XS(urpm, filename, ...) } PUTBACK; - if ((f = gzopen(filename, "rb")) != NULL) { + int rc = rpmFileIsCompressed(filename, &compressed); + + switch (compressed) { + case COMPRESSED_BZIP2: t = "r.bzip2"; break; + case COMPRESSED_LZMA: + case COMPRESSED_XZ: + t = "r.xz"; break; + case COMPRESSED_OTHER: + default: + t = "r.gzip"; break; + } + f = Fopen(filename, "r.fdio"); + + if (!rc && (f = Fdopen(f, t)) != NULL && !Ferror(f)) { memset(&pkg, 0, sizeof(struct s_Package)); buff[sizeof(buff)-1] = 0; p = buff; int ok = 1; - while ((buff_len = gzread(f, p, sizeof(buff)-1-(p-buff))) >= 0 && + while ((buff_len = Fread(p, sizeof(buff)-1-(p-buff), 1, f)) >= 0 && (buff_len += p-buff)) { buff[buff_len] = 0; p = buff; @@ -3353,17 +3366,16 @@ Urpm_parse_synthesis__XS(urpm, filename, ...) ok = 0; break; } - if (gzeof(f)) { - if (!parse_line(depslist, provides, obsoletes, &pkg, p, urpm, callback)) ok = 0; - break; - } else { /* move the remaining non-complete-line at beginning */ memmove(buff, p, buff_len-(p-buff)); /* point to the end of the non-complete-line */ p = &buff[buff_len-(p-buff)]; - } } - if (gzclose(f) != 0) ok = 0; + // EOF: + if (ok && buff_len > 0 + && !parse_line(depslist, provides, obsoletes, &pkg, p, urpm, callback)) + ok = 0; + if (Fclose(f) != 0) ok = 0; SPAGAIN; if (ok) { XPUSHs(sv_2mortal(newSViv(start_id))); diff --git a/t/synthesis.t b/t/synthesis.t index 6729b3b..8961e2a 100644 --- a/t/synthesis.t +++ b/t/synthesis.t @@ -2,29 +2,39 @@ use strict ; use warnings ; -use Test::More tests => 94; +use Test::More tests => 95; use URPM; chdir 't' if -d 't'; my $file1 = 'synthesis.sample.cz'; +my $file2 = 'synthesis.sample-xz.cz'; -open my $f, "| gzip -9 >$file1"; -print $f <<'EOF'; +my $s = <<'EOF'; @provides@glibc-devel == 6:2.2.4-25mdk @requires@/sbin/install-info@glibc == 2.2.4@kernel-headers@kernel-headers >= 2.2.1@/bin/sh@/bin/sh@/bin/sh@rpmlib(PayloadFilesHavePrefix) <= 4.0-1@rpmlib(CompressedFileNames) <= 3.0.4-1 @conflicts@texinfo < 3.11@gcc < 2.96-0.50mdk @obsoletes@libc-debug@libc-headers@libc-devel@linuxthreads-devel@glibc-debug @info@glibc-devel-2.2.4-25mdk.i586@6@45692097@Development/C EOF +open my $f, "| gzip -9 >$file1"; +print $f $s; +close $f; +open my $f, "| xz -9 >$file2"; +print $f $s; +$s =~ s/-devel//g; +print $f $s; close $f; -END { unlink $file1 } +END { unlink $file1, $file2 } my $a = new URPM; ok($a); my ($first, $end); +($first, $end) = URPM->new->parse_synthesis($file2); +ok($first == 0 && $end == 1, 'parse XZ synthesis'); + ($first, $end) = URPM->new->parse_synthesis('empty_synthesis.cz'); is("$first $end", "0 -1", 'parse empty synthesis'); |