Procházet zdrojové kódy

Userland: Allow our access check to pass flags to faccessat syscall

Fabian Dellwing před 2 roky
rodič
revize
059904371f

+ 3 - 2
Userland/Libraries/LibCore/System.cpp

@@ -1549,7 +1549,7 @@ ErrorOr<void> unlockpt(int fildes)
     return {};
 }
 
-ErrorOr<void> access(StringView pathname, int mode)
+ErrorOr<void> access(StringView pathname, int mode, int flags)
 {
     if (pathname.is_null())
         return Error::from_syscall("access"sv, -EFAULT);
@@ -1559,12 +1559,13 @@ ErrorOr<void> access(StringView pathname, int mode)
         .dirfd = AT_FDCWD,
         .pathname = { pathname.characters_without_null_termination(), pathname.length() },
         .mode = mode,
-        .flags = 0,
+        .flags = flags,
     };
     int rc = ::syscall(Syscall::SC_faccessat, &params);
     HANDLE_SYSCALL_RETURN_VALUE("access", rc, {});
 #else
     DeprecatedString path_string = pathname;
+    (void)flags;
     if (::access(path_string.characters(), mode) < 0)
         return Error::from_syscall("access"sv, -errno);
     return {};

+ 1 - 1
Userland/Libraries/LibCore/System.h

@@ -228,7 +228,7 @@ ErrorOr<void> putenv(StringView);
 ErrorOr<int> posix_openpt(int flags);
 ErrorOr<void> grantpt(int fildes);
 ErrorOr<void> unlockpt(int fildes);
-ErrorOr<void> access(StringView pathname, int mode);
+ErrorOr<void> access(StringView pathname, int mode, int flags = 0);
 ErrorOr<DeprecatedString> readlink(StringView pathname);
 ErrorOr<int> poll(Span<struct pollfd>, int timeout);
 

+ 3 - 3
Userland/Libraries/LibFileSystem/FileSystem.cpp

@@ -359,14 +359,14 @@ ErrorOr<void> link_file(StringView destination_path, StringView source_path)
     return TRY(Core::System::symlink(source_path, TRY(get_duplicate_file_name(destination_path))));
 }
 
-ErrorOr<String> resolve_executable_from_environment(StringView filename)
+ErrorOr<String> resolve_executable_from_environment(StringView filename, int flags)
 {
     if (filename.is_empty())
         return Error::from_errno(ENOENT);
 
     // Paths that aren't just a file name generally count as already resolved.
     if (filename.contains('/')) {
-        TRY(Core::System::access(filename, X_OK));
+        TRY(Core::System::access(filename, X_OK, flags));
         return TRY(String::from_utf8(filename));
     }
 
@@ -382,7 +382,7 @@ ErrorOr<String> resolve_executable_from_environment(StringView filename)
     for (auto directory : directories) {
         auto file = TRY(String::formatted("{}/{}", directory, filename));
 
-        if (!Core::System::access(file, X_OK).is_error())
+        if (!Core::System::access(file, X_OK, flags).is_error())
             return file;
     }
 

+ 1 - 1
Userland/Libraries/LibFileSystem/FileSystem.h

@@ -73,7 +73,7 @@ bool can_delete_or_move(StringView path);
 ErrorOr<String> read_link(StringView link_path);
 ErrorOr<void> link_file(StringView destination_path, StringView source_path);
 
-ErrorOr<String> resolve_executable_from_environment(StringView filename);
+ErrorOr<String> resolve_executable_from_environment(StringView filename, int flags = 0);
 bool looks_like_shared_library(StringView path);
 
 }