diff options
author | Glenn Strauss <gstrauss@gluelogic.com> | 2017-12-09 20:22:29 -0500 |
---|---|---|
committer | Glenn Strauss <gstrauss@gluelogic.com> | 2017-12-09 20:22:29 -0500 |
commit | e4ed2ed4aeb3a0afe9f5bc51559c0c0c2ac11a72 (patch) | |
tree | d8660c319e44590107064f1b78ce3ff6b259b7cf | |
parent | bed37796179686e13eb2c05bcd8d4bb14d85d4e0 (diff) | |
download | lighttpd-git-e4ed2ed4aeb3a0afe9f5bc51559c0c0c2ac11a72.tar.gz |
[mod_compress,mod_deflate] try mmap MAP_PRIVATE
try mmap MAP_PRIVATE if mmap MAP_SHARED fails with errno == EINVAL
Some file systems such as jffs2 and btrfs might not support MAP_SHARED
-rw-r--r-- | src/mod_compress.c | 6 | ||||
-rw-r--r-- | src/mod_deflate.c | 5 |
2 files changed, 6 insertions, 5 deletions
diff --git a/src/mod_compress.c b/src/mod_compress.c index 41ad68d1..2d17c10c 100644 --- a/src/mod_compress.c +++ b/src/mod_compress.c @@ -563,7 +563,8 @@ static int deflate_file_to_file(server *srv, connection *con, plugin_data *p, bu } #ifdef USE_MMAP - if (MAP_FAILED != (start = mmap(NULL, sce->st.st_size, PROT_READ, MAP_SHARED, ifd, 0))) { + if (MAP_FAILED != (start = mmap(NULL, sce->st.st_size, PROT_READ, MAP_SHARED, ifd, 0)) + || (errno == EINVAL && MAP_FAILED != (start = mmap(NULL, sce->st.st_size, PROT_READ, MAP_PRIVATE, ifd, 0)))) { mapped = 1; signal(SIGBUS, sigbus_handler); sigbus_jmp_valid = 1; @@ -690,7 +691,8 @@ static int deflate_file_to_buffer(server *srv, connection *con, plugin_data *p, } #ifdef USE_MMAP - if (MAP_FAILED != (start = mmap(NULL, sce->st.st_size, PROT_READ, MAP_SHARED, ifd, 0))) { + if (MAP_FAILED != (start = mmap(NULL, sce->st.st_size, PROT_READ, MAP_SHARED, ifd, 0)) + || (errno == EINVAL && MAP_FAILED != (start = mmap(NULL, sce->st.st_size, PROT_READ, MAP_PRIVATE, ifd, 0)))) { mapped = 1; signal(SIGBUS, sigbus_handler); sigbus_jmp_valid = 1; diff --git a/src/mod_deflate.c b/src/mod_deflate.c index 63cc9e17..ac35694f 100644 --- a/src/mod_deflate.c +++ b/src/mod_deflate.c @@ -792,9 +792,8 @@ static int mod_deflate_file_chunk(server *srv, connection *con, handler_ctx *hct /* we have more to send than we can mmap() at once */ if (we_want_to_send > to_mmap) we_want_to_send = to_mmap; - if (MAP_FAILED == (c->file.mmap.start = mmap(0, (size_t)to_mmap, PROT_READ, MAP_SHARED, c->file.fd, c->file.mmap.offset))) { - /* close it here, otherwise we'd have to set FD_CLOEXEC */ - + if (MAP_FAILED == (c->file.mmap.start = mmap(0, (size_t)to_mmap, PROT_READ, MAP_SHARED, c->file.fd, c->file.mmap.offset)) + && (errno != EINVAL || MAP_FAILED == (c->file.mmap.start = mmap(0, (size_t)to_mmap, PROT_READ, MAP_PRIVATE, c->file.fd, c->file.mmap.offset)))) { log_error_write(srv, __FILE__, __LINE__, "ssbd", "mmap failed:", strerror(errno), c->file.name, c->file.fd); |