summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPekka Paalanen <pekka.paalanen@collabora.co.uk>2013-11-29 17:47:08 +0200
committerKristian Høgsberg <krh@bitplanet.net>2013-12-02 16:18:59 -0800
commit011b6954031a25de8d9eb39631b6837553bb3cfb (patch)
treed20824a09b5d09a3ba4b7909837761d19fbe6dc3
parent5a019e38a1316a31072a9cb6de8da4377f3cfad5 (diff)
os: use posix_fallocate in creating sharable buffers
If posix_fallocate is available, use it instead of ftruncate. Unlike ftruncate, when posix_fallocate succeeds, it guarantees that you cannot run out of disk space, when later writing to the mmap()'ed file. With posix_fallocate, if os_create_anonymous_file() succeeds, the program cannot get a SIGBUS later from accessing this file via mmap. If there is insufficient disk space, the function fails and errno is set to ENOSPC. This is useful on systems, that limit the available buffer space by having XDG_RUNTIME_DIR on a small tmpfs. Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.co.uk>
-rw-r--r--configure.ac2
-rw-r--r--cursor/os-compatibility.c19
2 files changed, 19 insertions, 2 deletions
diff --git a/configure.ac b/configure.ac
index f8be456..b289567 100644
--- a/configure.ac
+++ b/configure.ac
@@ -39,7 +39,7 @@ if test "x$GCC" = "xyes"; then
fi
AC_SUBST(GCC_CFLAGS)
-AC_CHECK_FUNCS([accept4 mkostemp])
+AC_CHECK_FUNCS([accept4 mkostemp posix_fallocate])
AC_CHECK_DECL(SFD_CLOEXEC,[],
[AC_MSG_ERROR("SFD_CLOEXEC is needed to compile wayland")],
diff --git a/cursor/os-compatibility.c b/cursor/os-compatibility.c
index 418b0d3..0c41242 100644
--- a/cursor/os-compatibility.c
+++ b/cursor/os-compatibility.c
@@ -90,6 +90,12 @@ create_tmpfile_cloexec(char *tmpname)
* The file is suitable for buffer sharing between processes by
* transmitting the file descriptor over Unix sockets using the
* SCM_RIGHTS methods.
+ *
+ * If the C library implements posix_fallocate(), it is used to
+ * guarantee that disk space is available for the file at the
+ * given size. If disk space is insufficent, errno is set to ENOSPC.
+ * If posix_fallocate() is not supported, program may receive
+ * SIGBUS on accessing mmap()'ed file contents instead.
*/
int
os_create_anonymous_file(off_t size)
@@ -98,6 +104,7 @@ os_create_anonymous_file(off_t size)
const char *path;
char *name;
int fd;
+ int ret;
path = getenv("XDG_RUNTIME_DIR");
if (!path) {
@@ -119,10 +126,20 @@ os_create_anonymous_file(off_t size)
if (fd < 0)
return -1;
- if (ftruncate(fd, size) < 0) {
+#ifdef HAVE_POSIX_FALLOCATE
+ ret = posix_fallocate(fd, 0, size);
+ if (ret != 0) {
+ close(fd);
+ errno = ret;
+ return -1;
+ }
+#else
+ ret = ftruncate(fd, size);
+ if (ret < 0) {
close(fd);
return -1;
}
+#endif
return fd;
}