1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2024-11-22 07:09:54 +00:00

Don’t assume openat

Use openat only on platforms with O_PATH.
This ports to OS X 10.9 and earlier.
Problem reported by Keith David Bershatsky in:
https://lists.gnu.org/r/emacs-devel/2022-04/msg00805.html
* lib-src/emacsclient.c (local_sockname): Use open, not openat.
* src/sysdep.c (sys_openat): New static function,
which uses openat only if O_PATH is defined.
(emacs_openat): Use it instead of openat.
(emacs_openat_noquit): Remove.
(emacs_open_noquit): Reimplement as per the old emacs_openat_noquit,
but use plain 'open'.
This commit is contained in:
Paul Eggert 2022-04-17 10:41:17 -07:00
parent 4641bc1c55
commit 3cccf0a910
2 changed files with 19 additions and 13 deletions

View File

@ -1412,8 +1412,7 @@ local_sockname (int s, char sockname[socknamesize], int tmpdirlen,
char *emacsdirend = sockname + tmpdirlen + suffixlen - char *emacsdirend = sockname + tmpdirlen + suffixlen -
strlen(server_name) - 1; strlen(server_name) - 1;
*emacsdirend = '\0'; *emacsdirend = '\0';
int dir = openat (AT_FDCWD, sockname, int dir = open (sockname, O_PATH | O_DIRECTORY | O_NOFOLLOW | O_CLOEXEC);
O_PATH | O_DIRECTORY | O_NOFOLLOW | O_CLOEXEC);
*emacsdirend = '/'; *emacsdirend = '/';
if (dir < 0) if (dir < 0)
return errno; return errno;

View File

@ -2302,6 +2302,20 @@ emacs_fstatat (int dirfd, char const *filename, void *st, int flags)
return r; return r;
} }
static int
sys_openat (int dirfd, char const *file, int oflags, int mode)
{
#ifdef O_PATH
return openat (dirfd, file, oflags, mode);
#else
/* On platforms without O_PATH, emacs_openat's callers arrange for
DIRFD to be AT_FDCWD, so it should be safe to just call 'open'.
This ports to old platforms like OS X 10.9 that lack openat. */
eassert (dirfd == AT_FDCWD);
return open (file, oflags, mode);
#endif
}
/* Assuming the directory DIRFD, open FILE for Emacs use, /* Assuming the directory DIRFD, open FILE for Emacs use,
using open flags OFLAGS and mode MODE. using open flags OFLAGS and mode MODE.
Use binary I/O on systems that care about text vs binary I/O. Use binary I/O on systems that care about text vs binary I/O.
@ -2317,7 +2331,7 @@ emacs_openat (int dirfd, char const *file, int oflags, int mode)
if (! (oflags & O_TEXT)) if (! (oflags & O_TEXT))
oflags |= O_BINARY; oflags |= O_BINARY;
oflags |= O_CLOEXEC; oflags |= O_CLOEXEC;
while ((fd = openat (dirfd, file, oflags, mode)) < 0 && errno == EINTR) while ((fd = sys_openat (dirfd, file, oflags, mode)) < 0 && errno == EINTR)
maybe_quit (); maybe_quit ();
return fd; return fd;
} }
@ -2330,26 +2344,19 @@ emacs_open (char const *file, int oflags, int mode)
/* Same as above, but doesn't allow the user to quit. */ /* Same as above, but doesn't allow the user to quit. */
static int int
emacs_openat_noquit (int dirfd, const char *file, int oflags, emacs_open_noquit (char const *file, int oflags, int mode)
int mode)
{ {
int fd; int fd;
if (! (oflags & O_TEXT)) if (! (oflags & O_TEXT))
oflags |= O_BINARY; oflags |= O_BINARY;
oflags |= O_CLOEXEC; oflags |= O_CLOEXEC;
do do
fd = openat (dirfd, file, oflags, mode); fd = open (file, oflags, mode);
while (fd < 0 && errno == EINTR); while (fd < 0 && errno == EINTR);
return fd; return fd;
} }
int
emacs_open_noquit (char const *file, int oflags, int mode)
{
return emacs_openat_noquit (AT_FDCWD, file, oflags, mode);
}
/* Open FILE as a stream for Emacs use, with mode MODE. /* Open FILE as a stream for Emacs use, with mode MODE.
Act like emacs_open with respect to threads, signals, and quits. */ Act like emacs_open with respect to threads, signals, and quits. */