diff --git a/src/add-ons/kernel/file_systems/bfs/Query.cpp b/src/add-ons/kernel/file_systems/bfs/Query.cpp index 2d07a83a39..7e509efa5d 100644 --- a/src/add-ons/kernel/file_systems/bfs/Query.cpp +++ b/src/add-ons/kernel/file_systems/bfs/Query.cpp @@ -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", diff --git a/src/add-ons/kernel/file_systems/bfs/kernel_interface.cpp b/src/add-ons/kernel/file_systems/bfs/kernel_interface.cpp index 0ccc89e42f..8d120de691 100644 --- a/src/add-ons/kernel/file_systems/bfs/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/bfs/kernel_interface.cpp @@ -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; diff --git a/src/add-ons/kernel/file_systems/btrfs/kernel_interface.cpp b/src/add-ons/kernel/file_systems/btrfs/kernel_interface.cpp index 1ac679141a..7b904accf5 100644 --- a/src/add-ons/kernel/file_systems/btrfs/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/btrfs/kernel_interface.cpp @@ -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; diff --git a/src/add-ons/kernel/file_systems/cdda/kernel_interface.cpp b/src/add-ons/kernel/file_systems/cdda/kernel_interface.cpp index b9c876b6ff..ad10380e89 100644 --- a/src/add-ons/kernel/file_systems/cdda/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/cdda/kernel_interface.cpp @@ -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; diff --git a/src/add-ons/kernel/file_systems/exfat/kernel_interface.cpp b/src/add-ons/kernel/file_systems/exfat/kernel_interface.cpp index f643db9068..94a73fbe6f 100644 --- a/src/add-ons/kernel/file_systems/exfat/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/exfat/kernel_interface.cpp @@ -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); diff --git a/src/add-ons/kernel/file_systems/ext2/kernel_interface.cpp b/src/add-ons/kernel/file_systems/ext2/kernel_interface.cpp index b0400558f6..7b18382afa 100644 --- a/src/add-ons/kernel/file_systems/ext2/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/ext2/kernel_interface.cpp @@ -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; diff --git a/src/add-ons/kernel/file_systems/fat/attr.cpp b/src/add-ons/kernel/file_systems/fat/attr.cpp index 5b915f727c..aa2ac400aa 100644 --- a/src/add-ons/kernel/file_systems/fat/attr.cpp +++ b/src/add-ons/kernel/file_systems/fat/attr.cpp @@ -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; diff --git a/src/add-ons/kernel/file_systems/fat/dir.cpp b/src/add-ons/kernel/file_systems/fat/dir.cpp index 0f2d0218dc..0576222762 100644 --- a/src/add-ons/kernel/file_systems/fat/dir.cpp +++ b/src/add-ons/kernel/file_systems/fat/dir.cpp @@ -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 diff --git a/src/add-ons/kernel/file_systems/googlefs/googlefs.c b/src/add-ons/kernel/file_systems/googlefs/googlefs.c index b66f29997a..15c82a6f39 100644 --- a/src/add-ons/kernel/file_systems/googlefs/googlefs.c +++ b/src/add-ons/kernel/file_systems/googlefs/googlefs.c @@ -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 { diff --git a/src/add-ons/kernel/file_systems/iso9660/iso9660.cpp b/src/add-ons/kernel/file_systems/iso9660/iso9660.cpp index f88fa71b88..38ba4fbeec 100644 --- a/src/add-ons/kernel/file_systems/iso9660/iso9660.cpp +++ b/src/add-ons/kernel/file_systems/iso9660/iso9660.cpp @@ -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. diff --git a/src/add-ons/kernel/file_systems/layers/attribute_overlay/attribute_overlay.cpp b/src/add-ons/kernel/file_systems/layers/attribute_overlay/attribute_overlay.cpp index d12fd46143..5d6d0fcfc8 100644 --- a/src/add-ons/kernel/file_systems/layers/attribute_overlay/attribute_overlay.cpp +++ b/src/add-ons/kernel/file_systems/layers/attribute_overlay/attribute_overlay.cpp @@ -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; diff --git a/src/add-ons/kernel/file_systems/layers/write_overlay/write_overlay.cpp b/src/add-ons/kernel/file_systems/layers/write_overlay/write_overlay.cpp index 070558fd51..1835f67170 100644 --- a/src/add-ons/kernel/file_systems/layers/write_overlay/write_overlay.cpp +++ b/src/add-ons/kernel/file_systems/layers/write_overlay/write_overlay.cpp @@ -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; diff --git a/src/add-ons/kernel/file_systems/netfs/server/ClientConnection.cpp b/src/add-ons/kernel/file_systems/netfs/server/ClientConnection.cpp index f53edf54ab..292f23bb90 100644 --- a/src/add-ons/kernel/file_systems/netfs/server/ClientConnection.cpp +++ b/src/add-ons/kernel/file_systems/netfs/server/ClientConnection.cpp @@ -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); diff --git a/src/add-ons/kernel/file_systems/netfs/server/NodeHandle.cpp b/src/add-ons/kernel/file_systems/netfs/server/NodeHandle.cpp index fcf3ba2e0c..78268a9dbf 100644 --- a/src/add-ons/kernel/file_systems/netfs/server/NodeHandle.cpp +++ b/src/add-ons/kernel/file_systems/netfs/server/NodeHandle.cpp @@ -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) { diff --git a/src/add-ons/kernel/file_systems/nfs/nfs_add_on.c b/src/add-ons/kernel/file_systems/nfs/nfs_add_on.c index 22117868d4..48d429f164 100644 --- a/src/add-ons/kernel/file_systems/nfs/nfs_add_on.c +++ b/src/add-ons/kernel/file_systems/nfs/nfs_add_on.c @@ -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); diff --git a/src/add-ons/kernel/file_systems/nfs4/InodeDir.cpp b/src/add-ons/kernel/file_systems/nfs4/InodeDir.cpp index 4d78e096fe..9a74cd1d40 100644 --- a/src/add-ons/kernel/file_systems/nfs4/InodeDir.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/InodeDir.cpp @@ -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; diff --git a/src/add-ons/kernel/file_systems/ntfs/kernel_interface.cpp b/src/add-ons/kernel/file_systems/ntfs/kernel_interface.cpp index 17c5f1dd89..3ffd8ed346 100644 --- a/src/add-ons/kernel/file_systems/ntfs/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/ntfs/kernel_interface.cpp @@ -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); diff --git a/src/add-ons/kernel/file_systems/udf/kernel_interface.cpp b/src/add-ons/kernel/file_systems/udf/kernel_interface.cpp index f9bf23d915..95114f51eb 100644 --- a/src/add-ons/kernel/file_systems/udf/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/udf/kernel_interface.cpp @@ -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 diff --git a/src/add-ons/kernel/file_systems/ufs2/kernel_interface.cpp b/src/add-ons/kernel/file_systems/ufs2/kernel_interface.cpp index 69af701dba..1be3c6114c 100644 --- a/src/add-ons/kernel/file_systems/ufs2/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/ufs2/kernel_interface.cpp @@ -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++; diff --git a/src/add-ons/kernel/file_systems/userlandfs/server/fuse/FUSEVolume.cpp b/src/add-ons/kernel/file_systems/userlandfs/server/fuse/FUSEVolume.cpp index 6fe9c4ac5c..c7787d4358 100644 --- a/src/add-ons/kernel/file_systems/userlandfs/server/fuse/FUSEVolume.cpp +++ b/src/add-ons/kernel/file_systems/userlandfs/server/fuse/FUSEVolume.cpp @@ -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; } diff --git a/src/add-ons/kernel/file_systems/xfs/kernel_interface.cpp b/src/add-ons/kernel/file_systems/xfs/kernel_interface.cpp index e0fdbd8cfe..9300619367 100644 --- a/src/add-ons/kernel/file_systems/xfs/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/xfs/kernel_interface.cpp @@ -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++; diff --git a/src/bin/copyattr.cpp b/src/bin/copyattr.cpp index e54e984d19..490c60cd32 100644 --- a/src/bin/copyattr.cpp +++ b/src/bin/copyattr.cpp @@ -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 diff --git a/src/build/libbe/storage/MergedDirectory.cpp b/src/build/libbe/storage/MergedDirectory.cpp index a13c4a96f8..75a173d665 100644 --- a/src/build/libbe/storage/MergedDirectory.cpp +++ b/src/build/libbe/storage/MergedDirectory.cpp @@ -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; diff --git a/src/kits/storage/CopyEngine.cpp b/src/kits/storage/CopyEngine.cpp index dea733fb7e..d9960988b0 100644 --- a/src/kits/storage/CopyEngine.cpp +++ b/src/kits/storage/CopyEngine.cpp @@ -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 diff --git a/src/kits/storage/RemoveEngine.cpp b/src/kits/storage/RemoveEngine.cpp index 63626be045..0fb49c3ee0 100644 --- a/src/kits/storage/RemoveEngine.cpp +++ b/src/kits/storage/RemoveEngine.cpp @@ -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 diff --git a/src/kits/tracker/EntryIterator.cpp b/src/kits/tracker/EntryIterator.cpp index 70f88de632..2ae9d6f315 100644 --- a/src/kits/tracker/EntryIterator.cpp +++ b/src/kits/tracker/EntryIterator.cpp @@ -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; diff --git a/src/kits/tracker/NodeWalker.cpp b/src/kits/tracker/NodeWalker.cpp index d06df80f2d..1685582d9b 100644 --- a/src/kits/tracker/NodeWalker.cpp +++ b/src/kits/tracker/NodeWalker.cpp @@ -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; diff --git a/src/servers/package/CommitTransactionHandler.cpp b/src/servers/package/CommitTransactionHandler.cpp index aa3dbfb66b..3b1537f469 100644 --- a/src/servers/package/CommitTransactionHandler.cpp +++ b/src/servers/package/CommitTransactionHandler.cpp @@ -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 diff --git a/src/system/kernel/device_manager/devfs.cpp b/src/system/kernel/device_manager/devfs.cpp index 341ea839ab..0cf66faaa0 100644 --- a/src/system/kernel/device_manager/devfs.cpp +++ b/src/system/kernel/device_manager/devfs.cpp @@ -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; diff --git a/src/system/kernel/fs/rootfs.cpp b/src/system/kernel/fs/rootfs.cpp index 73388165ab..f89e145e33 100644 --- a/src/system/kernel/fs/rootfs.cpp +++ b/src/system/kernel/fs/rootfs.cpp @@ -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; diff --git a/src/system/kernel/fs/vfs.cpp b/src/system/kernel/fs/vfs.cpp index 440f5fbfb3..af2df9a3f1 100644 --- a/src/system/kernel/fs/vfs.cpp +++ b/src/system/kernel/fs/vfs.cpp @@ -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));