summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--main/apk-tools/0001-io-fix-corruption-of-big-files-on-mmap-write.patch76
-rw-r--r--main/apk-tools/APKBUILD8
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"