ISO9660のルートディレクトリ読み込みのバグ
確かにルートディレクトリにファイルがたくさんあると /SERVERS ディレクトリの open 時に正しく情報がとれない。
テストが通らなくなる。
monapi_cmemoryinfo* mi = monapi_file_read_directory("/SERVERS"); CPPUNIT_ASSERT_MESSAGE("readdir /SERVERS mi != NULL", mi != NULL); monapi_directoryinfo* p = (monapi_directoryinfo*)&mi->Data[sizeof(int)]; int size = *(int*)mi->Data; CPPUNIT_ASSERT_EQUAL_MESSAGE("entry count", 8, size); // ここ
色々調べたところ neri さんの予想通り、1セクタを越えたところの2セクタ目以降が読まれていない。
コードを見るとバッファには読まれているが、セクタ境界の中途半端な部分で break してしまっていた。
ディレクトリエントリはセクタ境界をまたがないようになっているので、セクタ境界にうまく合わせて処理を続けるようにした。
ついでに以前から指摘のあった大文字に統一もした。
Index: ISO9660/ISO9660FileSystem.cpp =================================================================== --- ISO9660/ISO9660FileSystem.cpp (リビジョン 4705) +++ ISO9660/ISO9660FileSystem.cpp (作業コピー) @@ -397,7 +397,7 @@ } else { - entry->name = string((const char*)pathEntry->name, pathEntry->length); + entry->name = upperCase(string((const char*)pathEntry->name, pathEntry->length)); } list->push_back(entry); @@ -446,7 +446,7 @@ { result = result.substr(0, result.size() - 1); } - return result; + return upperCase(result); } void ISO9660FileSystem::setDirectoryRelation(EntryList* list, Entry* directory) @@ -606,11 +606,14 @@ DirectoryEntry* iEntry = (DirectoryEntry*)(buffer + position); string name = string(iEntry->name, iEntry->name_len); - if (iEntry->length == 0) break; + if (iEntry->length == 0) + { + position = ((position + SECTOR_SIZE - 1) / SECTOR_SIZE) * SECTOR_SIZE; + continue; + } for (EntryList::iterator i = children->begin(); i != children->end(); ++i) { Entry* child = *i; - if (name != child->name) continue; + if (upperCase(name) != child->name) continue; setDetailInformation(child, iEntry); }
テストも全て通ったので、コミットしました。
neri さんご指摘ありがとうございました。