diff --git a/src/tests/add-ons/kernel/file_systems/userlandfs/r5/src/test/ramfs/NameIndex.cpp b/src/tests/add-ons/kernel/file_systems/userlandfs/r5/src/test/ramfs/NameIndex.cpp index 72b12969be..5cec5ef519 100644 --- a/src/tests/add-ons/kernel/file_systems/userlandfs/r5/src/test/ramfs/NameIndex.cpp +++ b/src/tests/add-ons/kernel/file_systems/userlandfs/r5/src/test/ramfs/NameIndex.cpp @@ -189,8 +189,21 @@ NameIndex::InternalGetIterator() AbstractIndexEntryIterator * NameIndex::InternalFind(const uint8 *key, size_t length) { - if (!key || length == 0 || key[length - 1] != '\0') + if (!key || length == 0) return NULL; + + // if the key is not null-terminated, copy it + uint8 clonedKey[kMaxIndexKeyLength]; + if (key[length - 1] != '\0') { + if (length >= kMaxIndexKeyLength) + length = kMaxIndexKeyLength - 1; + + memcpy(clonedKey, key, length); + clonedKey[length] = '\0'; + length++; + key = clonedKey; + } + NameIndexEntryIterator *iterator = new(nothrow) NameIndexEntryIterator; if (iterator) { if (!iterator->SetTo(this, (const char *)key)) { diff --git a/src/tests/add-ons/kernel/file_systems/userlandfs/r5/src/test/ramfs/Query.cpp b/src/tests/add-ons/kernel/file_systems/userlandfs/r5/src/test/ramfs/Query.cpp index 72c6881acc..0acde066c6 100644 --- a/src/tests/add-ons/kernel/file_systems/userlandfs/r5/src/test/ramfs/Query.cpp +++ b/src/tests/add-ons/kernel/file_systems/userlandfs/r5/src/test/ramfs/Query.cpp @@ -96,6 +96,8 @@ IndexIterator::Find(const uint8 *const key, size_t keyLength) { status_t error = B_ENTRY_NOT_FOUND; if (fIndexWrapper && fIndexWrapper->fIndex) { + // TODO: We actually don't want an exact Find() here, but rather a + // FindClose(). fInitialized = fIndexWrapper->fIndex->Find(key, keyLength, &fIterator); if (fInitialized) error = B_OK; @@ -110,20 +112,22 @@ IndexIterator::GetNextEntry(uint8 *buffer, uint16 *_keyLength, { status_t error = B_ENTRY_NOT_FOUND; if (fIndexWrapper && fIndexWrapper->fIndex) { - // get next entry - size_t keyLength; - if (fInitialized) - fIterator.GetNext(); - else { + // init iterator, if not done yet + if (!fInitialized) { fIndexWrapper->fIndex->GetIterator(&fIterator); fInitialized = true; } + // get key + size_t keyLength; if (Entry *entry = fIterator.GetCurrent(buffer, &keyLength)) { *_keyLength = keyLength; *_entry = entry; error = B_OK; } + + // get next entry + fIterator.GetNext(); } return error; }