Просмотр исходного кода

FileSys: w->rw permission lift only happens in SDMC archive

wwylele 9 лет назад
Родитель
Сommit
0647f86649

+ 11 - 0
src/core/file_sys/archive_sdmc.cpp

@@ -19,6 +19,17 @@ namespace FileSys {
 
 
 ResultVal<std::unique_ptr<FileBackend>> SDMCArchive::OpenFile(const Path& path,
 ResultVal<std::unique_ptr<FileBackend>> SDMCArchive::OpenFile(const Path& path,
                                                               const Mode& mode) const {
                                                               const Mode& mode) const {
+    Mode modified_mode;
+    modified_mode.hex = mode.hex;
+
+    // SDMC archive always opens a file with at least read permission
+    modified_mode.read_flag.Assign(1);
+
+    return OpenFileBase(path, modified_mode);
+}
+
+ResultVal<std::unique_ptr<FileBackend>> SDMCArchive::OpenFileBase(const Path& path,
+                                                                  const Mode& mode) const {
     LOG_DEBUG(Service_FS, "called path=%s mode=%01X", path.DebugStr().c_str(), mode.hex);
     LOG_DEBUG(Service_FS, "called path=%s mode=%01X", path.DebugStr().c_str(), mode.hex);
 
 
     const PathParser path_parser(path);
     const PathParser path_parser(path);

+ 1 - 0
src/core/file_sys/archive_sdmc.h

@@ -36,6 +36,7 @@ public:
     u64 GetFreeBytes() const override;
     u64 GetFreeBytes() const override;
 
 
 protected:
 protected:
+    ResultVal<std::unique_ptr<FileBackend>> OpenFileBase(const Path& path, const Mode& mode) const;
     std::string mount_point;
     std::string mount_point;
 };
 };
 
 

+ 1 - 1
src/core/file_sys/archive_sdmcwriteonly.cpp

@@ -21,7 +21,7 @@ ResultVal<std::unique_ptr<FileBackend>> SDMCWriteOnlyArchive::OpenFile(const Pat
         LOG_ERROR(Service_FS, "Read flag is not supported");
         LOG_ERROR(Service_FS, "Read flag is not supported");
         return ERROR_INVALID_READ_FLAG;
         return ERROR_INVALID_READ_FLAG;
     }
     }
-    return SDMCArchive::OpenFile(path, mode);
+    return SDMCArchive::OpenFileBase(path, mode);
 }
 }
 
 
 ResultVal<std::unique_ptr<DirectoryBackend>> SDMCWriteOnlyArchive::OpenDirectory(
 ResultVal<std::unique_ptr<DirectoryBackend>> SDMCWriteOnlyArchive::OpenDirectory(

+ 1 - 1
src/core/file_sys/disk_archive.cpp

@@ -163,7 +163,7 @@ u64 DiskArchive::GetFreeBytes() const {
 ////////////////////////////////////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////////////////////////////////////
 
 
 ResultVal<size_t> DiskFile::Read(const u64 offset, const size_t length, u8* buffer) const {
 ResultVal<size_t> DiskFile::Read(const u64 offset, const size_t length, u8* buffer) const {
-    if (!mode.read_flag && !mode.write_flag)
+    if (!mode.read_flag)
         return ResultCode(ErrorDescription::FS_InvalidOpenFlags, ErrorModule::FS,
         return ResultCode(ErrorDescription::FS_InvalidOpenFlags, ErrorModule::FS,
                           ErrorSummary::Canceled, ErrorLevel::Status);
                           ErrorSummary::Canceled, ErrorLevel::Status);