Adjust all struct dirent creations (again), this time to use offsetof().

The dirent struct is not packed, so offsetof(dirent, d_name) != sizeof(dirent).
Thus in order not to waste the alignment bytes (which are significant,
on x86_64 at least, sizeof(dirent)==32, but offsetof(...)=26.)

This is also the most portable way to handle things, and should
work just fine in cross-platform code that has a non-zero-sized d_name.
This commit is contained in:
Augustin Cavalier
2021-12-01 17:05:40 -05:00
parent ba0e4a83e5
commit 711e2dc05b
31 changed files with 66 additions and 66 deletions
@@ -667,7 +667,7 @@ Equation::GetNextMatching(Volume* volume, TreeIterator* iterator,
dirent->d_ino = offset;
dirent->d_pdev = volume->ID();
dirent->d_pino = volume->ToVnode(inode->Parent());
dirent->d_reclen = sizeof(struct dirent);
dirent->d_reclen = offsetof(struct dirent, d_name);
if (inode->GetName(dirent->d_name) < B_OK) {
FATAL(("inode %" B_PRIdOFF " in query has no name!\n",
@@ -1737,7 +1737,7 @@ bfs_read_dir(fs_volume* _volume, fs_vnode* _node, void* _cookie,
while (count < maxCount && bufferSize > sizeof(struct dirent)) {
ino_t id;
uint16 length;
size_t nameBufferSize = bufferSize - sizeof(struct dirent);
size_t nameBufferSize = bufferSize - offsetof(struct dirent, d_name);
status_t status = iterator->GetNextEntry(dirent->d_name, &length,
nameBufferSize, &id);
@@ -1759,7 +1759,7 @@ bfs_read_dir(fs_volume* _volume, fs_vnode* _node, void* _cookie,
dirent->d_dev = volume->ID();
dirent->d_ino = id;
dirent->d_reclen = sizeof(struct dirent) + length + 1;
dirent->d_reclen = offsetof(struct dirent, d_name) + length + 1;
bufferSize -= dirent->d_reclen;
dirent = (struct dirent*)((uint8*)dirent + dirent->d_reclen);
@@ -1867,7 +1867,7 @@ bfs_read_attr_dir(fs_volume* _volume, fs_vnode* node, void* _cookie,
Volume* volume = (Volume*)_volume->private_volume;
dirent->d_dev = volume->ID();
dirent->d_reclen = sizeof(struct dirent) + length + 1;
dirent->d_reclen = offsetof(struct dirent, d_name) + length + 1;
*_num = 1;
return B_OK;
@@ -814,7 +814,7 @@ btrfs_read_dir(fs_volume* _volume, fs_vnode* _node, void* _cookie,
while (count < maxCount && bufferSize > sizeof(struct dirent)) {
ino_t id;
size_t length = bufferSize - sizeof(struct dirent);
size_t length = bufferSize - offsetof(struct dirent, d_name);
status_t status = iterator->GetNext(dirent->d_name, &length,
&id);
@@ -834,7 +834,7 @@ btrfs_read_dir(fs_volume* _volume, fs_vnode* _node, void* _cookie,
dirent->d_dev = volume->ID();
dirent->d_ino = id;
dirent->d_reclen = sizeof(struct dirent) + length + 1;
dirent->d_reclen = offsetof(struct dirent, d_name) + length + 1;
bufferSize -= dirent->d_reclen;
dirent = (struct dirent*)((uint8*)dirent + dirent->d_reclen);
@@ -928,7 +928,7 @@ btrfs_read_attr_dir(fs_volume* _volume, fs_vnode* _node,
Volume* volume = (Volume*)_volume->private_volume;
dirent->d_dev = volume->ID();
dirent->d_reclen = sizeof(struct dirent) + length + 1;
dirent->d_reclen = offsetof(struct dirent, d_name) + length + 1;
*_num = 1;
return B_OK;
@@ -1907,7 +1907,7 @@ cdda_read_dir(fs_volume* _volume, fs_vnode* _node, void* _cookie,
buffer->d_dev = volume->FSVolume()->id;
buffer->d_ino = childNode->ID();
buffer->d_reclen = sizeof(struct dirent) + strlen(name) + 1;
buffer->d_reclen = offsetof(struct dirent, d_name) + strlen(name) + 1;
if (buffer->d_reclen > bufferSize) {
if (count == 0)
@@ -2041,7 +2041,7 @@ cdda_read_attr_dir(fs_volume* _volume, fs_vnode* _node, void* _cookie,
size_t length = strlcpy(dirent->d_name, attribute->Name(), bufferSize);
dirent->d_dev = volume->FSVolume()->id;
dirent->d_ino = inode->ID();
dirent->d_reclen = sizeof(struct dirent) + length + 1;
dirent->d_reclen = offsetof(struct dirent, d_name) + length + 1;
cookie->current = attribute->GetDoublyLinkedListLink()->next;
*_num = 1;
@@ -587,7 +587,7 @@ exfat_read_dir(fs_volume *_volume, fs_vnode *_node, void *_cookie,
while (count < maxCount && bufferSize > sizeof(struct dirent)) {
ino_t id;
size_t length = bufferSize - sizeof(struct dirent);
size_t length = bufferSize - offsetof(struct dirent, d_name);
status_t status = iterator->GetNext(dirent->d_name, &length, &id);
if (status == B_ENTRY_NOT_FOUND)
@@ -605,7 +605,7 @@ exfat_read_dir(fs_volume *_volume, fs_vnode *_node, void *_cookie,
dirent->d_dev = volume->ID();
dirent->d_ino = id;
dirent->d_reclen = sizeof(struct dirent) + length + 1;
dirent->d_reclen = offsetof(struct dirent, d_name) + length + 1;
bufferSize -= dirent->d_reclen;
dirent = (struct dirent*)((uint8*)dirent + dirent->d_reclen);
@@ -1442,7 +1442,7 @@ ext2_read_dir(fs_volume *_volume, fs_vnode *_node, void *_cookie,
while (count < maxCount && bufferSize > sizeof(struct dirent)) {
size_t length = bufferSize - sizeof(struct dirent);
size_t length = bufferSize - offsetof(struct dirent, d_name);
ino_t id;
status_t status = iterator->GetNext(dirent->d_name, &length, &id);
@@ -1465,7 +1465,7 @@ ext2_read_dir(fs_volume *_volume, fs_vnode *_node, void *_cookie,
dirent->d_dev = volume->ID();
dirent->d_ino = id;
dirent->d_reclen = sizeof(struct dirent) + length + 1;
dirent->d_reclen = offsetof(struct dirent, d_name) + length + 1;
bufferSize -= dirent->d_reclen;
dirent = (struct dirent*)((uint8*)dirent + dirent->d_reclen);
@@ -1565,7 +1565,7 @@ ext2_read_attr_dir(fs_volume* _volume, fs_vnode* _node,
dirent->d_dev = volume->ID();
dirent->d_ino = inode->ID();
dirent->d_reclen = sizeof(struct dirent) + length + 1;
dirent->d_reclen = offsetof(struct dirent, d_name) + length + 1;
*_num = 1;
*(int32*)_cookie = index + 1;
+1 -1
View File
@@ -116,7 +116,7 @@ dosfs_read_attrdir(fs_volume *_vol, fs_vnode *_node, void *_cookie,
entry->d_ino = node->vnid;
entry->d_dev = vol->id;
strcpy(entry->d_name, "BEOS:TYPE");
entry->d_reclen = sizeof(struct dirent) + strlen(entry->d_name) + 1;
entry->d_reclen = offsetof(struct dirent, d_name) + strlen(entry->d_name) + 1;
}
*cookie = 1;
+4 -4
View File
@@ -1139,10 +1139,10 @@ dosfs_readdir(fs_volume *_vol, fs_vnode *_dir, void *_cookie,
} else {
if (cookie->current_index++ == 0) {
strcpy(entry->d_name, ".");
entry->d_reclen = sizeof(struct dirent) + 2;
entry->d_reclen = offsetof(struct dirent, d_name) + 2;
} else {
strcpy(entry->d_name, "..");
entry->d_reclen = sizeof(struct dirent) + 3;
entry->d_reclen = offsetof(struct dirent, d_name) + 3;
}
*num = 1;
entry->d_ino = vol->root_vnode.vnid;
@@ -1160,7 +1160,7 @@ dosfs_readdir(fs_volume *_vol, fs_vnode *_dir, void *_cookie,
}
result = get_next_dirent(vol, dir, &diri, &entry->d_ino, entry->d_name,
bufsize - sizeof(struct dirent) - 1);
bufsize - offsetof(struct dirent, d_name) - 1);
cookie->current_index = diri.current_index;
@@ -1170,7 +1170,7 @@ dosfs_readdir(fs_volume *_vol, fs_vnode *_dir, void *_cookie,
if (result == B_NO_ERROR) {
*num = 1;
entry->d_dev = vol->id;
entry->d_reclen = sizeof(struct dirent) + strlen(entry->d_name) + 1;
entry->d_reclen = offsetof(struct dirent, d_name) + strlen(entry->d_name) + 1;
DPRINTF(0, ("dosfs_readdir: found file %s\n", entry->d_name));
} else if (result == ENOENT) {
// When you get to the end, don't return an error, just return 0
@@ -438,7 +438,7 @@ static status_t googlefs_readdir(fs_volume *_volume, fs_vnode *_node, void *_coo
buf->d_ino = parent?parent->vnid:ns->rootid;
buf->d_pino = (parent && parent->parent)?parent->parent->vnid:ns->rootid;
strcpy(buf->d_name, "..");
buf->d_reclen = 2*(sizeof(dev_t)+sizeof(ino_t))+sizeof(unsigned short)+strlen(buf->d_name)+1;
buf->d_reclen = offsetof(struct dirent, d_name)+strlen(buf->d_name)+1;
cookie->dir_current++;
*num = 1;
} else if (cookie->dir_current == 1) { /* . */
@@ -449,7 +449,7 @@ static status_t googlefs_readdir(fs_volume *_volume, fs_vnode *_node, void *_coo
buf->d_ino = node->vnid;
buf->d_pino = parent?parent->vnid:ns->rootid;
strcpy(buf->d_name, ".");
buf->d_reclen = 2*(sizeof(dev_t)+sizeof(ino_t))+sizeof(unsigned short)+strlen(buf->d_name)+1;
buf->d_reclen = offsetof(struct dirent, d_name)+strlen(buf->d_name)+1;
cookie->dir_current++;
*num = 1;
} else {
@@ -462,7 +462,7 @@ static status_t googlefs_readdir(fs_volume *_volume, fs_vnode *_node, void *_coo
buf->d_ino = n->vnid;
buf->d_pino = node->vnid;
strcpy(buf->d_name, n->name);
buf->d_reclen = 2*(sizeof(dev_t)+sizeof(ino_t))+sizeof(unsigned short)+strlen(buf->d_name)+1;
buf->d_reclen = offsetof(struct dirent, d_name)+strlen(buf->d_name)+1;
cookie->dir_current++;
*num = 1;
} else {
@@ -1089,7 +1089,7 @@ static status_t googlefs_read_attrdir(fs_volume *_volume, fs_vnode *_node, void
buf->d_ino = node->vnid;
buf->d_pino = node->parent?node->parent->vnid:ns->rootid;
strcpy(buf->d_name, ae->name);
buf->d_reclen = 2*(sizeof(dev_t)+sizeof(ino_t))+sizeof(unsigned short)+strlen(buf->d_name)+1;
buf->d_reclen = offsetof(struct dirent, d_name)+strlen(buf->d_name)+1;
cookie->dir_current++;
*num = 1;
} else
@@ -1504,7 +1504,7 @@ static status_t googlefs_read_query(fs_volume *_volume, void *_cookie, struct di
buf->d_ino = n->vnid;
buf->d_pino = node->vnid;
strcpy(buf->d_name, n->name);
buf->d_reclen = 2*(sizeof(dev_t)+sizeof(ino_t))+sizeof(unsigned short)+strlen(buf->d_name)+1;
buf->d_reclen = offsetof(struct dirent, d_name)+strlen(buf->d_name)+1;
cookie->dir_current++;
*num = 1;
} else {
@@ -792,12 +792,12 @@ ISOReadDirEnt(iso9660_volume *volume, dircookie *cookie, struct dirent *dirent,
break;
if (result == B_OK && (node.flags & ISO_IS_ASSOCIATED_FILE) == 0) {
size_t nameBufferSize = bufferSize - sizeof(struct dirent);
size_t nameBufferSize = bufferSize - offsetof(struct dirent, d_name);
dirent->d_dev = volume->id;
dirent->d_ino = ((ino_t)cookie->block << 30)
+ (cookie->pos & 0x3fffffff);
dirent->d_reclen = sizeof(struct dirent) + node.name_length + 1;
dirent->d_reclen = offsetof(struct dirent, d_name) + node.name_length + 1;
if (node.name_length <= nameBufferSize) {
// need to do some size checking here.
@@ -199,7 +199,7 @@ private:
type_code type;
uint32 size;
uint8 name_length; // including 0 byte
char name[1]; // 0 terminated, followed by data
char name[]; // 0 terminated, followed by data
} _PACKED;
AttributeFile * fParent;
@@ -1005,14 +1005,14 @@ AttributeEntry::SetName(const char *name)
if (!fAllocatedEntry || fEntry->name_length < nameLength) {
attribute_entry *newEntry = (attribute_entry *)malloc(
sizeof(attribute_entry) - 1 + nameLength);
sizeof(attribute_entry) + nameLength);
if (newEntry == NULL) {
fStatus = B_NO_MEMORY;
return fStatus;
}
if (fEntry != NULL)
memcpy(newEntry, fEntry, sizeof(attribute_entry) - 1);
memcpy(newEntry, fEntry, sizeof(attribute_entry));
if (fAllocatedEntry)
free(fEntry);
@@ -1033,7 +1033,7 @@ AttributeEntry::FillDirent(struct dirent *dirent, size_t bufferSize,
dirent->d_dev = dirent->d_pdev = fParent->VolumeID();
dirent->d_ino = (ino_t)this;
dirent->d_pino = fParent->FileInode();
dirent->d_reclen = sizeof(struct dirent) + fEntry->name_length;
dirent->d_reclen = offsetof(struct dirent, d_name) + fEntry->name_length;
if (bufferSize < dirent->d_reclen) {
*numEntries = 0;
return B_BAD_VALUE;
@@ -1015,13 +1015,13 @@ OverlayInode::ReadDir(void *cookie, struct dirent *buffer, size_t bufferSize,
overlay_dirent *dirent = dirents[dirCookie->index++];
size_t nameLength = MIN(strlen(dirent->name),
bufferSize - sizeof(struct dirent)) + 1;
bufferSize - offsetof(struct dirent, d_name)) + 1;
buffer->d_dev = SuperVolume()->id;
buffer->d_pdev = 0;
buffer->d_ino = dirent->inode_number;
buffer->d_pino = 0;
buffer->d_reclen = sizeof(struct dirent) + nameLength;
buffer->d_reclen = offsetof(struct dirent, d_name) + nameLength;
strlcpy(buffer->d_name, dirent->name, nameLength);
*num = 1;
@@ -1295,7 +1295,7 @@ OverlayInode::_PopulateDirents()
if (result != B_OK)
return B_OK;
size_t bufferSize = sizeof(struct dirent) + B_FILE_NAME_LENGTH;
size_t bufferSize = offsetof(struct dirent, d_name) + B_FILE_NAME_LENGTH;
struct dirent *buffer = (struct dirent *)malloc(bufferSize);
if (buffer == NULL)
goto close_dir;
@@ -1318,7 +1318,7 @@ OverlayInode::_PopulateDirents()
struct dirent *dirent = buffer;
for (uint32 i = 0; i < num; i++) {
if (strcmp(dirent->d_name, ".") != 0
&& strcmp(dirent->d_name, "..") != 0) {
&& strcmp(dirent->d_name, "..") != 0) {
overlay_dirent *entry = (overlay_dirent *)malloc(
sizeof(overlay_dirent));
if (entry == NULL) {
@@ -1374,7 +1374,7 @@ OverlayInode::_PopulateAttributeDirents()
if (result != B_OK)
return B_OK;
size_t bufferSize = sizeof(struct dirent) + B_FILE_NAME_LENGTH;
size_t bufferSize = offsetof(struct dirent, d_name) + B_FILE_NAME_LENGTH;
struct dirent *buffer = (struct dirent *)malloc(bufferSize);
if (buffer == NULL)
goto close_attr_dir;
@@ -1979,7 +1979,7 @@ ClientConnection::VisitReadAttrDirRequest(ReadAttrDirRequest* request)
managerLocker.Unlock();
// read the attribute directory
uint8 buffer[sizeof(struct dirent) + B_FILE_NAME_LENGTH];
uint8 buffer[offsetof(struct dirent, d_name) + B_FILE_NAME_LENGTH];
struct dirent* dirEntry = (struct dirent*)buffer;
int32 countRead = 0;
bool done = true;
@@ -2430,7 +2430,7 @@ ClientConnection::VisitReadQueryRequest(ReadQueryRequest* request)
ReadQueryReply reply;
int32 countRead = 0;
while (result == B_OK) {
uint8 buffer[sizeof(struct dirent) + B_FILE_NAME_LENGTH];
uint8 buffer[offsetof(struct dirent, d_name) + B_FILE_NAME_LENGTH];
struct dirent* dirEntry = (struct dirent*)buffer;
result = queryHandle->ReadDir(dirEntry, 1, &countRead);
@@ -472,7 +472,7 @@ QueryHandle::ReadDir(dirent* entry, int32 count, int32* countRead)
}
while (fCurrentQuery) {
int32 readEntries = fCurrentQuery->GetNextDirents(entry,
sizeof(struct dirent) + B_FILE_NAME_LENGTH, 1);
offsetof(struct dirent, d_name) + B_FILE_NAME_LENGTH, 1);
if (readEntries < 0)
return readEntries;
if (readEntries > 0) {
@@ -1048,8 +1048,8 @@ fs_readdir(fs_volume *_volume, fs_vnode *_node, void *_cookie,
buf->d_pdev = ns->nsid;
buf->d_ino = vnid;
buf->d_pino = node->vnid;
buf->d_reclen = sizeof(struct dirent) + strlen(filename) + 1;
strcpy (buf->d_name,filename);
buf->d_reclen = offsetof(struct dirent, d_name) + strlen(filename) + 1;
strcpy(buf->d_name,filename);
// if ((ns->rootid == node->vnid))//XXX:mmu_man:test
// dprintf("nfs: dirent %d {d:%ld pd:%ld i:%lld pi:%lld '%s'}\n", *num, buf->d_dev, buf->d_pdev, buf->d_ino, buf->d_pino, buf->d_name);
@@ -122,7 +122,7 @@ Inode::FillDirEntry(struct dirent* de, ino_t id, const char* name, uint32 pos,
ASSERT(name != NULL);
uint32 nameSize = strlen(name) + 1;
const uint32 entSize = sizeof(struct dirent);
const uint32 entSize = offsetof(struct dirent, d_name);
if (pos + entSize + nameSize > size)
return B_BUFFER_OVERFLOW;
@@ -1221,7 +1221,7 @@ fs_read_dir(fs_volume* _volume, fs_vnode* _node, void* _cookie,
uint32 maxCount = *_num;
uint32 count = 0;
while (count < maxCount && bufferSize > sizeof(struct dirent)) {
size_t length = bufferSize - sizeof(struct dirent);
size_t length = bufferSize - offsetof(struct dirent, d_name);
if (length < cookie->current->name_length) {
// the remaining name buffer length is too small
if (count == 0)
@@ -1233,7 +1233,7 @@ fs_read_dir(fs_volume* _volume, fs_vnode* _node, void* _cookie,
dirent->d_dev = _volume->id;
dirent->d_ino = cookie->current->inode;
strlcpy(dirent->d_name, cookie->current->name, length + 1);
dirent->d_reclen = sizeof(struct dirent) + length + 1;
dirent->d_reclen = offsetof(struct dirent, d_name) + length + 1;
bufferSize -= dirent->d_reclen;
dirent = (struct dirent*)((uint8*)dirent + dirent->d_reclen);
@@ -463,7 +463,7 @@ udf_read_dir(fs_volume *_volume, fs_vnode *vnode, void *cookie,
return B_BAD_VALUE;
}
uint32 nameLength = bufferSize - sizeof(struct dirent);
uint32 nameLength = bufferSize - offsetof(struct dirent, d_name);
ino_t id;
status_t status = iterator->GetNextEntry(dirent->d_name, &nameLength, &id);
if (!status) {
@@ -471,7 +471,7 @@ udf_read_dir(fs_volume *_volume, fs_vnode *vnode, void *cookie,
*_num = 1;
dirent->d_dev = volume->ID();
dirent->d_ino = id;
dirent->d_reclen = sizeof(struct dirent) + nameLength + 1;
dirent->d_reclen = offsetof(struct dirent, d_name) + nameLength + 1;
} else {
*_num = 0;
// Clear the status for end of directory
@@ -381,7 +381,7 @@ ufs2_read_dir(fs_volume *_volume, fs_vnode *_node, void *_cookie,
while (count < maxCount
&& (bufferSize >= sizeof(struct dirent) + B_FILE_NAME_LENGTH)) {
size_t length = bufferSize - sizeof(struct dirent);
size_t length = bufferSize - offsetof(struct dirent, d_name);
ino_t iNodeNo;
status_t status = iterator->GetNext(dirent->d_name, &length, &iNodeNo);
@@ -397,7 +397,7 @@ ufs2_read_dir(fs_volume *_volume, fs_vnode *_node, void *_cookie,
dirent->d_dev = volume->ID();
dirent->d_ino = iNodeNo;
dirent->d_reclen = sizeof(struct dirent) + length + 1;
dirent->d_reclen = offsetof(struct dirent, d_name) + length + 1;
bufferSize -= dirent->d_reclen;
dirent = (struct dirent*)((uint8*)dirent + dirent->d_reclen);
count++;
@@ -106,7 +106,7 @@ struct FUSEVolume::DirEntryCache {
const Entry& entry = fEntries[index];
// get and check the size
size_t size = sizeof(dirent) + entry.nameSize;
size_t size = offsetof(struct dirent, d_name) + entry.nameSize;
if (size > bufferSize)
return false;
@@ -250,7 +250,7 @@ struct FUSEVolume::AttrDirCookie : RWLockable {
size_t nameLen = strlen(name);
// get and check the size
size_t size = sizeof(dirent) + nameLen + 1;
size_t size = offsetof(struct dirent, d_name) + nameLen + 1;
if (size > bufferSize)
return false;
@@ -2991,7 +2991,7 @@ FUSEVolume::_AddReadDirEntry(ReadDirBuffer* buffer, const char* name, int type,
return 1;
// compute the entry length and check whether the entry still fits
entryLen = sizeof(dirent) + strlen(name) + 1;
entryLen = offsetof(struct dirent, d_name) + strlen(name) + 1;
if (buffer->usedSize + entryLen > buffer->bufferSize)
return 1;
}
@@ -444,7 +444,7 @@ xfs_read_dir(fs_volume *_volume, fs_vnode *_node, void *_cookie,
buffer->d_dev = volume->ID();
buffer->d_ino = ino;
buffer->d_reclen = sizeof(struct dirent) + length + 1;
buffer->d_reclen = offsetof(struct dirent, d_name) + length + 1;
bufferSize -= buffer->d_reclen;
buffer = (struct dirent*)((uint8*)buffer + buffer->d_reclen);
count++;
+1 -1
View File
@@ -465,7 +465,7 @@ copy_entry(const char *sourcePath, const char *destPath,
// recurse
if (parameters.recursive && S_ISDIR(sourceStat.st_mode)) {
char buffer[sizeof(dirent) + B_FILE_NAME_LENGTH];
char buffer[offsetof(struct dirent, d_name) + B_FILE_NAME_LENGTH];
dirent *entry = (dirent*)buffer;
while (sourceDir.GetNextDirents(entry, sizeof(buffer), 1) == 1) {
if (strcmp(entry->d_name, ".") == 0
+1 -1
View File
@@ -201,7 +201,7 @@ int32
BMergedDirectory::CountEntries()
{
int32 count = 0;
char buffer[sizeof(dirent) + B_FILE_NAME_LENGTH];
char buffer[offsetof(struct dirent, d_name) + B_FILE_NAME_LENGTH];
while (GetNextDirents((dirent*)&buffer, sizeof(buffer), 1) == 1)
count++;
return count;
+1 -1
View File
@@ -291,7 +291,7 @@ BCopyEngine::_CopyEntry(const char* sourcePath, const char* destPath)
// recurse
if ((fFlags & COPY_RECURSIVELY) != 0 && S_ISDIR(sourceStat.st_mode)) {
char buffer[sizeof(dirent) + B_FILE_NAME_LENGTH];
char buffer[offsetof(struct dirent, d_name) + B_FILE_NAME_LENGTH];
dirent *entry = (dirent*)buffer;
while (sourceDir.GetNextDirents(entry, sizeof(buffer), 1) == 1) {
if (strcmp(entry->d_name, ".") == 0
+1 -1
View File
@@ -84,7 +84,7 @@ BRemoveEngine::_RemoveEntry(const char* path)
"Failed to open directory \"%s\": %s\n", path, strerror(error));
}
char buffer[sizeof(dirent) + B_FILE_NAME_LENGTH];
char buffer[offsetof(struct dirent, d_name) + B_FILE_NAME_LENGTH];
dirent *entry = (dirent*)buffer;
while (directory.GetNextDirents(entry, sizeof(buffer), 1) == 1) {
if (strcmp(entry->d_name, ".") == 0
+2 -2
View File
@@ -254,7 +254,7 @@ CachedEntryIterator::GetNextDirents(struct dirent* ent, size_t size,
if (fDirentBuffer == NULL) {
fDirentBuffer = (dirent*)malloc(kDirentBufferSize);
ASSERT(fIndex == 0 && fNumEntries == 0);
ASSERT(size > sizeof(dirent) + B_FILE_NAME_LENGTH);
ASSERT(size > offsetof(struct dirent, d_name) + B_FILE_NAME_LENGTH);
}
if (count == 0)
@@ -278,7 +278,7 @@ CachedEntryIterator::GetNextDirents(struct dirent* ent, size_t size,
ASSERT(bufferRemain >= 0);
if ((size_t)bufferRemain
< (sizeof(dirent) + B_FILE_NAME_LENGTH)) {
< (offsetof(struct dirent, d_name) + B_FILE_NAME_LENGTH)) {
// cant fit a big entryRef in the buffer, just bail
// and start from scratch
break;
+1 -1
View File
@@ -397,7 +397,7 @@ build_dirent(const BEntry* source, struct dirent* ent,
entry_ref ref;
source->GetRef(&ref);
size_t recordLength = strlen(ref.name) + 1 + sizeof(dirent);
size_t recordLength = offsetof(struct dirent, d_name) + strlen(ref.name) + 1;
if (recordLength > size || count <= 0) {
// can't fit in buffer, bail
return 0;
@@ -1937,7 +1937,7 @@ CommitTransactionHandler::_GetPath(const FSUtils::Entry& entry,
CommitTransactionHandler::_TagPackageEntriesRecursively(BDirectory& directory,
const BString& value, bool nonDirectoriesOnly)
{
char buffer[sizeof(dirent) + B_FILE_NAME_LENGTH];
char buffer[offsetof(struct dirent, d_name) + B_FILE_NAME_LENGTH];
dirent *entry = (dirent*)buffer;
while (directory.GetNextDirents(entry, sizeof(buffer), 1) == 1) {
if (strcmp(entry->d_name, ".") == 0
+2 -2
View File
@@ -1417,13 +1417,13 @@ devfs_read_dir(fs_volume* _volume, fs_vnode* _vnode, void* _cookie,
dirent->d_dev = fs->id;
dirent->d_ino = childNode->id;
dirent->d_reclen = strlen(name) + 1 + sizeof(struct dirent);
dirent->d_reclen = offsetof(struct dirent, d_name) + strlen(name) + 1;
if (dirent->d_reclen > bufferSize)
return ENOBUFS;
status = user_strlcpy(dirent->d_name, name,
bufferSize - sizeof(struct dirent));
bufferSize - offsetof(struct dirent, d_name));
if (status < B_OK)
return status;
+2 -2
View File
@@ -790,13 +790,13 @@ rootfs_read_dir(fs_volume* _volume, fs_vnode* _vnode, void* _cookie,
dirent->d_dev = fs->id;
dirent->d_ino = childNode->id;
dirent->d_reclen = strlen(name) + 1 + sizeof(struct dirent);
dirent->d_reclen = offsetof(struct dirent, d_name) + strlen(name) + 1;
if (dirent->d_reclen > bufferSize)
return ENOBUFS;
int nameLength = user_strlcpy(dirent->d_name, name,
bufferSize - sizeof(struct dirent));
bufferSize - offsetof(struct dirent, d_name));
if (nameLength < B_OK)
return nameLength;
+3 -3
View File
@@ -2554,7 +2554,7 @@ static status_t
get_vnode_name(struct vnode* vnode, struct vnode* parent, char* name,
size_t nameSize, bool kernel)
{
char buffer[sizeof(struct dirent) + B_FILE_NAME_LENGTH];
char buffer[offsetof(struct dirent, d_name) + B_FILE_NAME_LENGTH + 1];
struct dirent* dirent = (struct dirent*)buffer;
status_t status = get_vnode_name(vnode, parent, dirent, sizeof(buffer),
@@ -2635,7 +2635,7 @@ dir_vnode_to_path(struct vnode* vnode, char* buffer, size_t bufferSize,
}
// get the node's name
char nameBuffer[sizeof(struct dirent) + B_FILE_NAME_LENGTH];
char nameBuffer[offsetof(struct dirent, d_name) + B_FILE_NAME_LENGTH + 1];
// also used for fs_read_dir()
char* name = &((struct dirent*)nameBuffer)->d_name[0];
status = get_vnode_name(vnode, parentVnode, (struct dirent*)nameBuffer,
@@ -9294,7 +9294,7 @@ _user_open_parent_dir(int fd, char* userName, size_t nameLength)
return B_FILE_ERROR;
// get the vnode name
char _buffer[sizeof(struct dirent) + B_FILE_NAME_LENGTH];
char _buffer[offsetof(struct dirent, d_name) + B_FILE_NAME_LENGTH + 1];
struct dirent* buffer = (struct dirent*)_buffer;
status_t status = get_vnode_name(dirVNode, parentVNode, buffer,
sizeof(_buffer), get_current_io_context(false));