diff options
-rw-r--r-- | main/apk-tools/0001-io-fix-corruption-of-big-files-on-mmap-write.patch | 76 | ||||
-rw-r--r-- | main/apk-tools/APKBUILD | 8 |
2 files changed, 82 insertions, 2 deletions
diff --git a/main/apk-tools/0001-io-fix-corruption-of-big-files-on-mmap-write.patch b/main/apk-tools/0001-io-fix-corruption-of-big-files-on-mmap-write.patch new file mode 100644 index 00000000..4261ce52 --- /dev/null +++ b/main/apk-tools/0001-io-fix-corruption-of-big-files-on-mmap-write.patch @@ -0,0 +1,76 @@ +From 67108bf07a67811ea91fc965f3f1592a4a70044e Mon Sep 17 00:00:00 2001 +From: Timo Teras <timo.teras@iki.fi> +Date: Fri, 31 Jul 2009 10:50:15 +0300 +Subject: [PATCH] io: fix corruption of big files on mmap write + +remember to increment destination pointer; and munmap the proper +base address. +--- + src/io.c | 27 +++++++++++++-------------- + 1 files changed, 13 insertions(+), 14 deletions(-) + +diff --git a/src/io.c b/src/io.c +index 18e89d3..3929ba1 100644 +--- a/src/io.c ++++ b/src/io.c +@@ -114,21 +114,19 @@ size_t apk_istream_splice(void *stream, int fd, size_t size, + { + static void *splice_buffer = NULL; + struct apk_istream *is = (struct apk_istream *) stream; +- unsigned char *buf = MAP_FAILED; +- size_t bufsz, done = 0, r, togo, mmapped = 0; ++ unsigned char *buf, *mmapbase = MAP_FAILED; ++ size_t bufsz, done = 0, r, togo; + + bufsz = size; + if (size > 128 * 1024) { + if (ftruncate(fd, size) == 0) +- buf = mmap(NULL, size, PROT_READ | PROT_WRITE, +- MAP_SHARED, fd, 0); +- if (buf != MAP_FAILED) { +- mmapped = 1; +- if (bufsz > 2*1024*1024) +- bufsz = 2*1024*1024; +- } ++ mmapbase = mmap(NULL, size, PROT_READ | PROT_WRITE, ++ MAP_SHARED, fd, 0); ++ if (bufsz > 2*1024*1024) ++ bufsz = 2*1024*1024; ++ buf = mmapbase; + } +- if (!mmapped) { ++ if (mmapbase == MAP_FAILED) { + if (splice_buffer == NULL) + splice_buffer = malloc(256*1024); + buf = splice_buffer; +@@ -149,13 +147,14 @@ size_t apk_istream_splice(void *stream, int fd, size_t size, + if (r < 0) + goto err; + +- if (!mmapped) { ++ if (mmapbase == MAP_FAILED) { + if (write(fd, buf, r) != r) { + if (r < 0) + r = -errno; + goto err; + } +- } ++ } else ++ buf += r; + + done += r; + if (r != togo) +@@ -163,8 +162,8 @@ size_t apk_istream_splice(void *stream, int fd, size_t size, + } + r = done; + err: +- if (mmapped) +- munmap(buf, size); ++ if (mmapbase != MAP_FAILED) ++ munmap(mmapbase, size); + return r; + } + +-- +1.6.3.3 + diff --git a/main/apk-tools/APKBUILD b/main/apk-tools/APKBUILD index 96d7d35b..7db8f8a3 100644 --- a/main/apk-tools/APKBUILD +++ b/main/apk-tools/APKBUILD @@ -1,12 +1,13 @@ # Maintainer: Natanael Copa <ncopa@alpinelinux.org> pkgname=apk-tools pkgver=2.0_pre17 -pkgrel=1 +pkgrel=2 pkgdesc="Alpine Package Keeper - package manager for alpine" depends= makedepends="zlib-dev openssl-dev pkgconfig" source="http://git.alpinelinux.org/cgit/$pkgname/snapshot/$pkgname-$pkgver.tar.bz2 0001-db-fix-checksum-storing-to-db.patch + 0001-io-fix-corruption-of-big-files-on-mmap-write.patch " @@ -17,6 +18,8 @@ build() { cd "$srcdir/$pkgname-$pkgver" sed -i -e 's:-Werror::' Make.rules patch -p1 -i ../0001-db-fix-checksum-storing-to-db.patch || return 1 + patch -p1 -i ../0001-io-fix-corruption-of-big-files-on-mmap-write.patch\ + || return 1 make || return 1 make DESTDIR="$pkgdir" install @@ -30,4 +33,5 @@ build() { } md5sums="4d31c9ae51b357a8514e99a8750af0b6 apk-tools-2.0_pre17.tar.bz2 -d7944308cefe6f5fc45a24e1840d087e 0001-db-fix-checksum-storing-to-db.patch" +d7944308cefe6f5fc45a24e1840d087e 0001-db-fix-checksum-storing-to-db.patch +57693255bb36abe74423578b83ff2cf4 0001-io-fix-corruption-of-big-files-on-mmap-write.patch" |