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:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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++;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user