Fix dirent handling. The d_reclen field contains the size of the whole record,
so it includes sizeof(dirent). git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@33689 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -124,7 +124,7 @@ EntryListBase::InitCheck() const
|
|||||||
dirent *
|
dirent *
|
||||||
EntryListBase::Next(dirent *ent)
|
EntryListBase::Next(dirent *ent)
|
||||||
{
|
{
|
||||||
return (dirent *)((char *)ent + ent->d_reclen + sizeof(dirent));
|
return (dirent *)((char *)ent + ent->d_reclen);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -251,7 +251,7 @@ CachedEntryIterator::GetNextDirents(struct dirent *ent, size_t size,
|
|||||||
if (fIndex >= fNumEntries) {
|
if (fIndex >= fNumEntries) {
|
||||||
// we are out of stock, cache em up
|
// we are out of stock, cache em up
|
||||||
fCurrentDirent = fDirentBuffer;
|
fCurrentDirent = fDirentBuffer;
|
||||||
uint32 bufferRemain = kDirentBufferSize;
|
int32 bufferRemain = kDirentBufferSize;
|
||||||
for (fNumEntries = 0; fNumEntries < fCacheSize; ) {
|
for (fNumEntries = 0; fNumEntries < fCacheSize; ) {
|
||||||
int32 count = fIterator->GetNextDirents(fCurrentDirent,
|
int32 count = fIterator->GetNextDirents(fCurrentDirent,
|
||||||
bufferRemain, 1);
|
bufferRemain, 1);
|
||||||
@@ -261,10 +261,11 @@ CachedEntryIterator::GetNextDirents(struct dirent *ent, size_t size,
|
|||||||
|
|
||||||
fNumEntries += count;
|
fNumEntries += count;
|
||||||
|
|
||||||
int32 currentDirentSize = fCurrentDirent->d_reclen
|
int32 currentDirentSize = fCurrentDirent->d_reclen;
|
||||||
+ (ssize_t)sizeof(dirent);
|
|
||||||
bufferRemain -= currentDirentSize;
|
bufferRemain -= currentDirentSize;
|
||||||
if (bufferRemain < (sizeof(dirent) + B_FILE_NAME_LENGTH)) {
|
ASSERT(bufferRemain >= 0);
|
||||||
|
|
||||||
|
if ((size_t)bufferRemain < (sizeof(dirent) + B_FILE_NAME_LENGTH)) {
|
||||||
// cant fit a big entryRef in the buffer, just bail
|
// cant fit a big entryRef in the buffer, just bail
|
||||||
// and start from scratch
|
// and start from scratch
|
||||||
break;
|
break;
|
||||||
@@ -298,7 +299,7 @@ CachedEntryIterator::GetNextDirents(struct dirent *ent, size_t size,
|
|||||||
fCurrentDirent = fSortedList->ItemAt(fIndex);
|
fCurrentDirent = fSortedList->ItemAt(fIndex);
|
||||||
|
|
||||||
fIndex++;
|
fIndex++;
|
||||||
uint32 currentDirentSize = fCurrentDirent->d_reclen + sizeof(dirent);
|
uint32 currentDirentSize = fCurrentDirent->d_reclen;
|
||||||
ASSERT(currentDirentSize <= size);
|
ASSERT(currentDirentSize <= size);
|
||||||
if (currentDirentSize > size)
|
if (currentDirentSize > size)
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user