61 lines
2.2 KiB
Diff
61 lines
2.2 KiB
Diff
From ba9820a0020d06c7a37b34e771020cef8e9651a2 Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Christian=20G=C3=B6ttsche?= <cgzones@googlemail.com>
|
|
Date: Wed, 6 Jul 2022 13:38:04 +0200
|
|
Subject: [PATCH] libselinux: set errno to EBADF on O_PATH emulation ENOENT
|
|
failure
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
Content-type: text/plain
|
|
|
|
When the O_PATH emulation fails due to getxattr(2)/setxattr(2) failing
|
|
with ENOENT, e.g. because no procfs being available, override the errno
|
|
value to EBADF. This avoids confusion to the caller as it would suggest
|
|
the target of the operation does not exist, which is not the case:
|
|
|
|
setfiles: Could not set context for /: No such file or directory
|
|
|
|
Fixes: a782abf2 ("libselinux: emulate O_PATH support in fgetfilecon/fsetfilecon")
|
|
Signed-off-by: Christian Göttsche <cgzones@googlemail.com>
|
|
Acked-by: James Carter <jwcart2@gmail.com>
|
|
---
|
|
libselinux/src/fgetfilecon.c | 5 ++++-
|
|
libselinux/src/fsetfilecon.c | 5 ++++-
|
|
2 files changed, 8 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/libselinux/src/fgetfilecon.c b/libselinux/src/fgetfilecon.c
|
|
index baf38ec1221f..d7051171cf0d 100644
|
|
--- a/libselinux/src/fgetfilecon.c
|
|
+++ b/libselinux/src/fgetfilecon.c
|
|
@@ -26,7 +26,10 @@ static ssize_t fgetxattr_wrapper(int fd, const char *name, void *value, size_t s
|
|
|
|
snprintf(buf, sizeof(buf), "/proc/self/fd/%d", fd);
|
|
errno = saved_errno;
|
|
- return getxattr(buf, name, value, size);
|
|
+ ret = getxattr(buf, name, value, size);
|
|
+ if (ret < 0 && errno == ENOENT)
|
|
+ errno = EBADF;
|
|
+ return ret;
|
|
}
|
|
|
|
int fgetfilecon_raw(int fd, char ** context)
|
|
diff --git a/libselinux/src/fsetfilecon.c b/libselinux/src/fsetfilecon.c
|
|
index be821c7a6be2..19ea15b711cc 100644
|
|
--- a/libselinux/src/fsetfilecon.c
|
|
+++ b/libselinux/src/fsetfilecon.c
|
|
@@ -25,7 +25,10 @@ static int fsetxattr_wrapper(int fd, const char* name, const void* value, size_t
|
|
|
|
snprintf(buf, sizeof(buf), "/proc/self/fd/%d", fd);
|
|
errno = saved_errno;
|
|
- return setxattr(buf, name, value, size, flags);
|
|
+ rc = setxattr(buf, name, value, size, flags);
|
|
+ if (rc < 0 && errno == ENOENT)
|
|
+ errno = EBADF;
|
|
+ return rc;
|
|
}
|
|
|
|
int fsetfilecon_raw(int fd, const char * context)
|
|
--
|
|
2.38.1
|
|
|