diff options
author | Keith Packard <keithp@keithp.com> | 2013-11-13 14:16:33 +0900 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2013-12-02 12:57:05 -0800 |
commit | cc63204926c6da83d9221c5f8c0dc8f5e2f2481d (patch) | |
tree | a7b9ce6e21fc1d84afa226b38d21427d3ff07c8e /Xext/shm.c | |
parent | 5a969f0928b84da5cfe0777dfb542caaacc915ad (diff) |
Xext: Use SHMDIR and O_TMPFILE when creating mapping files
ShmCreateSegment asks for a file descriptor for a memory mapped file
created by the X server. This patch uses O_TMPFILE where available,
and also uses the SHMDIR directory to store the files, both for the
O_TMPFILE and mkstemp cases.
Signed-off-by: Keith Packard <keithp@keithp.com>
Reviewed-by: Julien Cristau <jcristau@debian.org>
Diffstat (limited to 'Xext/shm.c')
-rw-r--r-- | Xext/shm.c | 34 |
1 files changed, 31 insertions, 3 deletions
diff --git a/Xext/shm.c b/Xext/shm.c index d014b9194..1957a9525 100644 --- a/Xext/shm.c +++ b/Xext/shm.c @@ -37,6 +37,7 @@ in this Software without prior written authorization from The Open Group. #include <sys/shm.h> #include <unistd.h> #include <sys/stat.h> +#include <fcntl.h> #include <X11/X.h> #include <X11/Xproto.h> #include "misc.h" @@ -1177,6 +1178,35 @@ ProcShmAttachFd(ClientPtr client) } static int +shm_tmpfile(void) +{ +#ifdef SHMDIR + int fd; + int flags; + char template[] = SHMDIR "/shmfd-XXXXXX"; +#ifdef O_TMPFILE + fd = open(SHMDIR, O_TMPFILE|O_RDWR|O_CLOEXEC|O_EXCL, 0666); + if (fd >= 0) { + ErrorF ("Using O_TMPFILE\n"); + return fd; + } + ErrorF ("Not using O_TMPFILE\n"); +#endif + fd = mkstemp(template); + if (fd < 0) + return -1; + unlink(template); + if (fcntl(fd, F_GETFD, &flags) >= 0) { + flags |= FD_CLOEXEC; + (void) fcntl(fd, F_SETFD, &flags); + } + return fd; +#else + return -1; +#endif +} + +static int ProcShmCreateSegment(ClientPtr client) { int fd; @@ -1188,17 +1218,15 @@ ProcShmCreateSegment(ClientPtr client) .sequenceNumber = client->sequence, .length = 0, }; - char template[] = "/tmp/shm-XXXXXX"; REQUEST_SIZE_MATCH(xShmCreateSegmentReq); if ((stuff->readOnly != xTrue) && (stuff->readOnly != xFalse)) { client->errorValue = stuff->readOnly; return BadValue; } - fd = mkstemp(template); + fd = shm_tmpfile(); if (fd < 0) return BadAlloc; - unlink(template); if (ftruncate(fd, stuff->size) < 0) { close(fd); return BadAlloc; |