Skip to content

Commit

Permalink
Strengthen check on synced file name size
Browse files Browse the repository at this point in the history
  • Loading branch information
jedelbo committed Aug 28, 2024
1 parent 3fdaf2c commit 9bf7d3f
Show file tree
Hide file tree
Showing 6 changed files with 21 additions and 20 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
* Filtering notifications with backlink columns as last element could sometimes give wrong results ([#7530](https://github.com/realm/realm-core/issues/7530), since v11.1.0)
* Fix crash during client app shutdown when Logger log level is set higher than Info. ([#7969](https://github.com/realm/realm-core/issues/7969), since v13.23.3)
* If File::rw_lock() fails to open a file the exception message does not contain the filename ([#7999](https://github.com/realm/realm-core/issues/7999), since v6.0.21)
* Fallback to hashed filename will fail if length of basename is between 240 and 250 ([#8007](https://github.com/realm/realm-core/issues/8007), since v10.0.0)

### Breaking changes
* None.
Expand Down
2 changes: 1 addition & 1 deletion src/realm/object-store/sync/impl/sync_file.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,7 @@ class SyncFileManager {
static constexpr const char c_metadata_realm[] = "sync_metadata.realm";
static constexpr const char c_realm_file_suffix[] = ".realm";
static constexpr const char c_realm_file_test_suffix[] =
".rtest"; // Must have same length as c_realm_file_suffix.
".rtest.management"; // Must have same length as the biggest path name we might use.
static constexpr const char c_legacy_sync_directory[] = "realm-object-server";

std::string get_special_directory(std::string directory_name) const;
Expand Down
2 changes: 1 addition & 1 deletion src/realm/util/file.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,8 @@
#endif

#if REALM_APPLE_DEVICE && !REALM_TVOS && !REALM_MACCATALYST
#define REALM_FILELOCK_EMULATION
#endif
#define REALM_FILELOCK_EMULATION

namespace realm::util {

Expand Down
18 changes: 12 additions & 6 deletions test/object-store/sync/file.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -162,7 +162,7 @@ TEST_CASE("sync_file: SyncFileManager APIs", "[sync][file]") {
SECTION("deleting a Realm for a valid user") {
manager.realm_file_path(identity, legacy_identities, relative_path, partition);
// Create the required files
REQUIRE(create_dummy_realm(expected_paths.current_preferred_path));
REQUIRE_NOTHROW(create_dummy_realm(expected_paths.current_preferred_path));
REQUIRE(File::exists(expected_paths.current_preferred_path));
REQUIRE(File::exists(expected_paths.current_preferred_path + ".lock"));
REQUIRE_DIR_EXISTS(expected_paths.current_preferred_path + ".management");
Expand All @@ -183,7 +183,7 @@ TEST_CASE("sync_file: SyncFileManager APIs", "[sync][file]") {

REQUIRE(!File::exists(expected_paths.fallback_hashed_path));
REQUIRE(!File::exists(expected_paths.current_preferred_path));
REQUIRE(create_dummy_realm(expected_paths.fallback_hashed_path));
REQUIRE_NOTHROW(create_dummy_realm(expected_paths.fallback_hashed_path));
REQUIRE(File::exists(expected_paths.fallback_hashed_path));
REQUIRE(!File::exists(expected_paths.current_preferred_path));
auto actual = manager.realm_file_path(identity, legacy_identities, relative_path, partition);
Expand All @@ -197,7 +197,7 @@ TEST_CASE("sync_file: SyncFileManager APIs", "[sync][file]") {
util::try_make_dir((manager_path / local_identity).string());
REQUIRE(!File::exists(expected_paths.legacy_local_id_path));
REQUIRE(!File::exists(expected_paths.current_preferred_path));
REQUIRE(create_dummy_realm(expected_paths.legacy_local_id_path));
REQUIRE_NOTHROW(create_dummy_realm(expected_paths.legacy_local_id_path));
REQUIRE(File::exists(expected_paths.legacy_local_id_path));
REQUIRE(!File::exists(expected_paths.current_preferred_path));

Expand All @@ -217,7 +217,7 @@ TEST_CASE("sync_file: SyncFileManager APIs", "[sync][file]") {

util::try_make_dir(manager_path.string());
util::try_make_dir((manager_path / local_identity_2).string());
REQUIRE(create_dummy_realm(expected_paths_2.legacy_local_id_path));
REQUIRE_NOTHROW(create_dummy_realm(expected_paths_2.legacy_local_id_path));

// Note: intentionally not legacy_identities_2. We're passing both
// in and validating that it'll open the second one.
Expand All @@ -233,7 +233,7 @@ TEST_CASE("sync_file: SyncFileManager APIs", "[sync][file]") {
for (auto& dir : expected_paths.legacy_sync_directories_to_make) {
util::try_make_dir(dir);
}
REQUIRE(create_dummy_realm(expected_paths.legacy_sync_path));
REQUIRE_NOTHROW(create_dummy_realm(expected_paths.legacy_sync_path));
REQUIRE(File::exists(expected_paths.legacy_sync_path));
REQUIRE(!File::exists(expected_paths.current_preferred_path));
auto actual = manager.realm_file_path(identity, legacy_identities, relative_path, partition);
Expand All @@ -247,7 +247,13 @@ TEST_CASE("sync_file: SyncFileManager APIs", "[sync][file]") {
REQUIRE(long_path_name.length() > 255); // linux name length limit
auto actual = manager.realm_file_path(identity, legacy_identities, long_path_name, partition);
REQUIRE(actual.length() < 500);
REQUIRE(create_dummy_realm(actual));
REQUIRE_NOTHROW(create_dummy_realm(actual));
}

SECTION("paths have a fallbach hashed location if the preferred length is 240 > length < 255") {
const std::string long_path_name = std::string(241, 'a');
auto actual = manager.realm_file_path(identity, legacy_identities, long_path_name, partition);
REQUIRE_NOTHROW(create_dummy_realm(actual));
REQUIRE(File::exists(actual));
}
}
Expand Down
16 changes: 5 additions & 11 deletions test/object-store/util/test_utils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -78,20 +78,14 @@ std::ostream& operator<<(std::ostream& os, const Exception& e)
return os;
}

bool create_dummy_realm(std::string path, std::shared_ptr<Realm>* out)
void create_dummy_realm(std::string path, std::shared_ptr<Realm>* out)
{
Realm::Config config;
config.path = path;
try {
auto realm = _impl::RealmCoordinator::get_coordinator(path)->get_realm(config, none);
REQUIRE_REALM_EXISTS(path);
if (out) {
*out = std::move(realm);
}
return true;
}
catch (std::exception&) {
return false;
auto realm = _impl::RealmCoordinator::get_coordinator(path)->get_realm(config, none);
REQUIRE_REALM_EXISTS(path);
if (out) {
*out = std::move(realm);
}
}

Expand Down
2 changes: 1 addition & 1 deletion test/object-store/util/test_utils.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,7 @@ std::ostream& operator<<(std::ostream&, const Exception&);

class Realm;
/// Open a Realm at a given path, creating its files.
bool create_dummy_realm(std::string path, std::shared_ptr<Realm>* out = nullptr);
void create_dummy_realm(std::string path, std::shared_ptr<Realm>* out = nullptr);
std::vector<char> make_test_encryption_key(const char start = 0);
void catch2_ensure_section_run_workaround(bool did_run_a_section, std::string section_name,
util::FunctionRef<void()> func);
Expand Down

0 comments on commit 9bf7d3f

Please sign in to comment.