From 9910185a803079304b57b585f70f654ed24e83e4 Mon Sep 17 00:00:00 2001 From: Christian Brauner Date: Fri, 30 Jul 2021 13:02:01 +0200 Subject: [PATCH] file_utils: add open_at_same() Signed-off-by: Christian Brauner --- src/lxc/file_utils.c | 15 +++++++++++++++ src/lxc/file_utils.h | 3 +++ 2 files changed, 18 insertions(+) diff --git a/src/lxc/file_utils.c b/src/lxc/file_utils.c index 13a870552..a361d188e 100644 --- a/src/lxc/file_utils.c +++ b/src/lxc/file_utils.c @@ -670,6 +670,21 @@ int open_at(int dfd, const char *path, unsigned int o_flags, return move_fd(fd); } +int open_at_same(int fd_same, int dfd, const char *path, unsigned int o_flags, + unsigned int resolve_flags, mode_t mode) +{ + __do_close int fd = -EBADF; + + fd = open_at(dfd, path, o_flags, resolve_flags, mode); + if (fd < 0) + return -errno; + + if (!same_file_lax(fd_same, fd)) + return ret_errno(EINVAL); + + return move_fd(fd); +} + int fd_make_nonblocking(int fd) { int flags; diff --git a/src/lxc/file_utils.h b/src/lxc/file_utils.h index cd9f447ff..faf7454dd 100644 --- a/src/lxc/file_utils.h +++ b/src/lxc/file_utils.h @@ -87,6 +87,9 @@ __hidden extern bool exists_dir_at(int dir_fd, const char *path); __hidden extern bool exists_file_at(int dir_fd, const char *path); __hidden extern int open_at(int dfd, const char *path, unsigned int o_flags, unsigned int resolve_flags, mode_t mode); +__hidden extern int open_at_same(int fd_same, int dfd, const char *path, + unsigned int o_flags, + unsigned int resolve_flags, mode_t mode); static inline int open_beneath(int dfd, const char *path, unsigned int flags) { return open_at(dfd, path, flags, PROTECT_LOOKUP_BENEATH, 0); -- 2.39.2