Browse Source

LibCore: Improve handling of parsing errors in FilePermissionsMask

Xavier Defrang 3 years ago
parent
commit
070d70848f

+ 4 - 0
Tests/LibCore/TestLibCoreFilePermissionsMask.cpp

@@ -74,15 +74,19 @@ TEST_CASE(file_permission_mask_from_symbolic_notation)
 
     mask = Core::FilePermissionsMask::from_symbolic_notation("z+rw"sv);
     EXPECT(mask.is_error());
+    EXPECT(mask.error().string_literal().starts_with("invalid class"));
 
     mask = Core::FilePermissionsMask::from_symbolic_notation("u*rw"sv);
     EXPECT(mask.is_error());
+    EXPECT(mask.error().string_literal().starts_with("invalid operation"));
 
     mask = Core::FilePermissionsMask::from_symbolic_notation("u+rz"sv);
     EXPECT(mask.is_error());
+    EXPECT(mask.error().string_literal().starts_with("invalid symbolic permission"));
 
     mask = Core::FilePermissionsMask::from_symbolic_notation("u+rw;g+rw"sv);
     EXPECT(mask.is_error());
+    EXPECT(mask.error().string_literal().starts_with("invalid symbolic permission"));
 }
 
 TEST_CASE(file_permission_mask_parse)

+ 3 - 1
Userland/Libraries/LibCore/FilePermissionsMask.cpp

@@ -72,6 +72,8 @@ ErrorOr<FilePermissionsMask> FilePermissionsMask::from_symbolic_notation(StringV
                     operation = Operation::Remove;
                 else if (ch == '=')
                     operation = Operation::Assign;
+                else if (classes == 0)
+                    return Error::from_string_literal("invalid class: expected 'u', 'g', 'o' or 'a'"sv);
                 else
                     return Error::from_string_literal("invalid operation: expected '+', '-' or '='"sv);
 
@@ -104,7 +106,7 @@ ErrorOr<FilePermissionsMask> FilePermissionsMask::from_symbolic_notation(StringV
             else if (ch == 'x')
                 write_bits = 1;
             else
-                return Error::from_string_literal("invalid symbolic permission"sv);
+                return Error::from_string_literal("invalid symbolic permission: expected 'r', 'w' or 'x'"sv);
 
             mode_t clear_bits = operation == Operation::Assign ? 7 : write_bits;