]> gitweb.michael.orlitzky.com - apply-default-acl.git/blobdiff - src/libadacl.c
safe_open_ex: remove redundant (pathname == NULL) check.
[apply-default-acl.git] / src / libadacl.c
index 08b13b82395941b90956129499de8a3450177ace..a1923601669b66efb0ffa45e62a9b73695354ddb 100644 (file)
 #include "libadacl.h"
 
 
+/* Even though most other library functions reliably return -1 for
+ * error, it feels a little wrong to re-use the ACL_ERROR constant.
+ */
+#define CLOSE_ERROR -1
+#define OPEN_ERROR -1
+#define SNPRINTF_ERROR -1
+#define STAT_ERROR -1
+
+
 /**
  * @brief The recursive portion of the @c safe_open function, used to
  *   open a file descriptor in a symlink-safe way when combined with
  *   the @c O_NOFOLLOW flag.
  *
+ * The @c O_PATH flag is not used because we want to fail upon
+ * encountering any symlinks.
+ *
  * @param at_fd
  *   A file descriptor relative to which @c pathname will be opened.
  *
  * @param pathname
  *   The path to the file/directory/whatever whose descriptor you want.
  *
+ * @param flags
+ *   File status flags to be passed to @c openat.
+ *
  * @return a file descriptor for @c pathname if everything goes well,
  *   and @c OPEN_ERROR if not.
  */
 int safe_open_ex(int at_fd, char* pathname, int flags) {
-  if (pathname != NULL && strlen(pathname) == 0) {
+  /* We're only called by safe_open(), so pathname is guaranteed to be
+     non-NULL */
+  if (strlen(pathname) == 0) {
     /* Oops, went one level to deep with nothing to do. */
     return at_fd;
   }
@@ -97,6 +114,9 @@ int safe_open_ex(int at_fd, char* pathname, int flags) {
  * @param pathname
  *   The path to the file/directory/whatever whose descriptor you want.
  *
+ * @param flags
+ *   File status flags to be passed to @c openat.
+ *
  * @return a file descriptor for @c pathname if everything goes well,
  *   and @c OPEN_ERROR if not.
  */
@@ -145,6 +165,11 @@ int safe_open(const char* pathname, int flags) {
   }
 
   int fd = open("/", flags);
+  if (fd == OPEN_ERROR) {
+    perror("safe_open (open)");
+    return OPEN_ERROR;
+  }
+
   if (strcmp(abspath, "/") == 0) {
     return fd;
   }
@@ -600,8 +625,7 @@ int wipe_acls(int fd) {
  *
  * @return
  *   - @c ACL_SUCCESS - The parent default ACL was inherited successfully.
- *   - @c ACL_FAILURE - The target path is not a regular file/directory,
- *     or the parent of @c path is not a directory.
+ *   - @c ACL_FAILURE - If symlinks or hard links are encountered.
  *   - @c ACL_ERROR - Unexpected library error.
  */
 int apply_default_acl_ex(const char* path,
@@ -851,7 +875,7 @@ int apply_default_acl_ex(const char* path,
  *
  * @return
  *   - @c ACL_SUCCESS - The parent default ACL was inherited successfully.
- *   - @c ACL_FAILURE - The target path is not a regular file/directory,
+ *   - @c ACL_FAILURE - If symlinks or hard links are encountered.
  *     or the parent of @c path is not a directory.
  *   - @c ACL_ERROR - Unexpected library error.
  */