return OPEN_ERROR;
}
- int fd = 0;
- if (strcmp(abspath, "/") == 0) {
- fd = open("/", flags | O_DIRECTORY);
- }
- else {
+ bool abspath_is_root = (strcmp(abspath, "/") == 0);
+ int rootflags = flags | O_DIRECTORY;
+ if (!abspath_is_root) {
/* Use O_PATH for some added safety if "/" is not our target */
- fd = open("/", flags | O_DIRECTORY | O_PATH);
+ rootflags |= O_PATH;
}
- if (fd == OPEN_ERROR) {
+ int rootfd = open("/", rootflags);
+ if (rootfd == OPEN_ERROR) {
perror("safe_open (open)");
return OPEN_ERROR;
}
- if (strcmp(abspath, "/") == 0) {
- return fd;
+ if (abspath_is_root) {
+ return rootfd;
}
- int result = safe_open_ex(fd, abspath+1, flags);
- if (close(fd) == CLOSE_ERROR) {
+ int result = safe_open_ex(rootfd, abspath+1, flags);
+ if (close(rootfd) == CLOSE_ERROR) {
perror("safe_open (close)");
return OPEN_ERROR;
}
return ACL_ERROR;
}
- size_t src_size_guess = fgetxattr(src_fd, src_name, NULL, 0);
+ ssize_t src_size_guess = fgetxattr(src_fd, src_name, NULL, 0);
if (src_size_guess == XATTR_ERROR) {
if (errno == ENODATA) {
/* A missing ACL isn't really an error. ENOATTR and ENODATA are
}
char* src_acl_p = alloca(src_size_guess);
/* The actual size may be smaller than our guess? I don't know. */
- size_t src_size = fgetxattr(src_fd, src_name, src_acl_p, (int)src_size_guess);
+ ssize_t src_size = fgetxattr(src_fd, src_name, src_acl_p, src_size_guess);
if (src_size == XATTR_ERROR) {
if (errno == ENODATA) {
/* A missing ACL isn't an error. */