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:
parent
4641bc1c55
commit
3cccf0a910
@ -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;
|
||||||
|
29
src/sysdep.c
29
src/sysdep.c
@ -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. */
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user