From f4b2da6c9da7b422fc4d4a9905faafe156a6fd1b Mon Sep 17 00:00:00 2001 From: Jens Remus Date: Wed, 12 Dec 2018 13:59:56 +0100 Subject: [PATCH] util_path: Add functions to test path is read/write-only MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For root the functions util_path_is_readable() and util_path_is_writable() do not take the path's permissions into account. The function access() succeeds as root is allowed to read/write any file regardless of its permissions. Introduce the functions util_path_is_readonly_file() and util_path_is_writeonly_file() to test whether a path is a regular file and is either read-only (neither user, group, nor other have write permission, but one or more of user, group, and other have read permission) or write-only (neither user, group, nor other have read permission, but one or more of user, group, and other have write permission). Signed-off-by: Jens Remus Reviewed-by: Jan Hoeppner Signed-off-by: Jan Höppner --- include/lib/util_path.h | 4 ++- libutil/util_path.c | 57 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 59 insertions(+), 2 deletions(-) diff --git a/include/lib/util_path.h b/include/lib/util_path.h index c4085af9..21dff64c 100644 --- a/include/lib/util_path.h +++ b/include/lib/util_path.h @@ -3,7 +3,7 @@ * @{ * @brief Work with paths * - * Copyright IBM Corp. 2016, 2017 + * Copyright IBM Corp. 2016, 2019 * * s390-tools is free software; you can redistribute it and/or modify * it under the terms of the MIT license. See LICENSE for details. @@ -21,5 +21,7 @@ bool util_path_is_writable(const char *fmt, ...); bool util_path_is_dir(const char *fmt, ...); bool util_path_is_reg_file(const char *fmt, ...); bool util_path_exists(const char *fmt, ...); +bool util_path_is_readonly_file(const char *fmt, ...); +bool util_path_is_writeonly_file(const char *fmt, ...); #endif /** LIB_UTIL_PATH_H @} */ diff --git a/libutil/util_path.c b/libutil/util_path.c index 400ba28f..a4577e55 100644 --- a/libutil/util_path.c +++ b/libutil/util_path.c @@ -3,7 +3,7 @@ * * Work with paths * - * Copyright IBM Corp. 2016, 2017 + * Copyright IBM Corp. 2016, 2019 * * s390-tools is free software; you can redistribute it and/or modify * it under the terms of the MIT license. See LICENSE for details. @@ -217,3 +217,58 @@ bool util_path_exists(const char *fmt, ...) free(path); return rc; } + +/** + * Test if path exists, is a regular file, and permission is read-only + * + * @param[in] fmt Format string for path to test + * @param[in] ... Variable arguments for format string + * + * @returns true Path exists, is a regular file, and permission does + * not allow any write but allows read + * false Otherwise + */ +bool util_path_is_readonly_file(const char *fmt, ...) +{ + bool rc = false; + struct stat sb; + va_list ap; + char *path; + + UTIL_VASPRINTF(&path, fmt, ap); + if (stat(path, &sb) == 0) { + rc = S_ISREG(sb.st_mode) && + (sb.st_mode & 0222) == 0 && + (sb.st_mode & 0444) != 0; + } + free(path); + return rc; +} + +/** + * Test if path exists, is a regular file, and permission is write-only + * + * @param[in] fmt Format string for path to test + * @param[in] ... Variable arguments for format string + * + * @returns true Path exists, is a regular file, and permission does + * not allow any read but allows write + * false Otherwise + */ +bool util_path_is_writeonly_file(const char *fmt, ...) +{ + bool rc = false; + struct stat sb; + va_list ap; + char *path; + + UTIL_VASPRINTF(&path, fmt, ap); + if (stat(path, &sb) == 0) { + rc = S_ISREG(sb.st_mode) && + (sb.st_mode & 0222) != 0 && + (sb.st_mode & 0444) == 0; + } + free(path); + return rc; +} +