mirror of
https://github.com/netbirdio/gvisor.git
synced 2026-05-22 17:12:49 -07:00
Fix VFS2 getdents()/getdents64() alignment.
PiperOrigin-RevId: 306263615
This commit is contained in:
@@ -97,6 +97,7 @@ func (cb *getdentsCallback) Handle(dirent vfs.Dirent) error {
|
||||
// char d_name[]; /* Filename (null-terminated) */
|
||||
// };
|
||||
size := 8 + 8 + 2 + 1 + 1 + len(dirent.Name)
|
||||
size = (size + 7) &^ 7 // round up to multiple of 8
|
||||
if size > cb.remaining {
|
||||
return syserror.EINVAL
|
||||
}
|
||||
@@ -106,7 +107,12 @@ func (cb *getdentsCallback) Handle(dirent vfs.Dirent) error {
|
||||
usermem.ByteOrder.PutUint16(buf[16:18], uint16(size))
|
||||
buf[18] = dirent.Type
|
||||
copy(buf[19:], dirent.Name)
|
||||
buf[size-1] = 0 // NUL terminator
|
||||
// Zero out all remaining bytes in buf, including the NUL terminator
|
||||
// after dirent.Name.
|
||||
bufTail := buf[19+len(dirent.Name):]
|
||||
for i := range bufTail {
|
||||
bufTail[i] = 0
|
||||
}
|
||||
} else {
|
||||
// struct linux_dirent {
|
||||
// unsigned long d_ino; /* Inode number */
|
||||
@@ -125,6 +131,7 @@ func (cb *getdentsCallback) Handle(dirent vfs.Dirent) error {
|
||||
panic(fmt.Sprintf("unsupported sizeof(unsigned long): %d", cb.t.Arch().Width()))
|
||||
}
|
||||
size := 8 + 8 + 2 + 1 + 1 + 1 + len(dirent.Name)
|
||||
size = (size + 7) &^ 7 // round up to multiple of sizeof(long)
|
||||
if size > cb.remaining {
|
||||
return syserror.EINVAL
|
||||
}
|
||||
@@ -133,9 +140,14 @@ func (cb *getdentsCallback) Handle(dirent vfs.Dirent) error {
|
||||
usermem.ByteOrder.PutUint64(buf[8:16], uint64(dirent.NextOff))
|
||||
usermem.ByteOrder.PutUint16(buf[16:18], uint16(size))
|
||||
copy(buf[18:], dirent.Name)
|
||||
buf[size-3] = 0 // NUL terminator
|
||||
buf[size-2] = 0 // zero padding byte
|
||||
buf[size-1] = dirent.Type
|
||||
// Zero out all remaining bytes in buf, including the NUL terminator
|
||||
// after dirent.Name and the zero padding byte between the name and
|
||||
// dirent type.
|
||||
bufTail := buf[18+len(dirent.Name):]
|
||||
for i := range bufTail {
|
||||
bufTail[i] = 0
|
||||
}
|
||||
bufTail[2] = dirent.Type
|
||||
}
|
||||
n, err := cb.t.CopyOutBytes(cb.addr, buf)
|
||||
if err != nil {
|
||||
|
||||
Reference in New Issue
Block a user