Commit 8e4075e6 authored by Timo Teräs's avatar Timo Teräs
Browse files

io: fix mmap writing to actually work

apparently it needs to have both PROT_READ and PROT_WRITE. and
it needs to be MAP_SHARED for the writing to be effective. oh,
and the data needs to be preallocated with ftruncate; otherwise,
one gets SIGBUS.
parent 49420239
...@@ -331,7 +331,7 @@ int apk_archive_entry_extract(const struct apk_file_info *ae, ...@@ -331,7 +331,7 @@ int apk_archive_entry_extract(const struct apk_file_info *ae,
break; break;
case S_IFREG: case S_IFREG:
if (ae->link_target == NULL) { if (ae->link_target == NULL) {
fd = open(fn, O_WRONLY | O_CREAT, ae->mode & 07777); fd = open(fn, O_RDWR | O_CREAT, ae->mode & 07777);
if (fd < 0) { if (fd < 0) {
r = -1; r = -1;
break; break;
......
...@@ -113,13 +113,15 @@ size_t apk_istream_splice(void *stream, int fd, size_t size, ...@@ -113,13 +113,15 @@ size_t apk_istream_splice(void *stream, int fd, size_t size,
apk_progress_cb cb, void *cb_ctx) apk_progress_cb cb, void *cb_ctx)
{ {
struct apk_istream *is = (struct apk_istream *) stream; struct apk_istream *is = (struct apk_istream *) stream;
unsigned char *buf; unsigned char *buf = MAP_FAILED;
size_t bufsz, done = 0, r, togo, mmapped = 0; size_t bufsz, done = 0, r, togo, mmapped = 0;
bufsz = size; bufsz = size;
if (size > 256 * 1024) { if (size > 128 * 1024) {
buf = mmap(NULL, size, PROT_WRITE, 0, fd, 0); if (ftruncate(fd, size) == 0)
if (buf != NULL) { buf = mmap(NULL, size, PROT_READ | PROT_WRITE,
MAP_SHARED, fd, 0);
if (buf != MAP_FAILED) {
mmapped = 1; mmapped = 1;
if (bufsz > 2*1024*1024) if (bufsz > 2*1024*1024)
bufsz = 2*1024*1024; bufsz = 2*1024*1024;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment