Skip to content

Commit 722b0e3

Browse files
cuonglmmdempsky
authored andcommitted
syscall: make convertFromDirents11 checkptr safe
Fixes #35092 Change-Id: I8f1ee2b79d42b2291548fd5645940a61f6d67582 Reviewed-on: https://go-review.googlesource.com/c/go/+/202878 Run-TryBot: Cuong Manh Le <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Matthew Dempsky <[email protected]>
1 parent 68981bf commit 722b0e3

File tree

1 file changed

+7
-2
lines changed

1 file changed

+7
-2
lines changed

src/syscall/syscall_freebsd.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -381,8 +381,12 @@ func convertFromDirents11(buf []byte, old []byte) int {
381381
dstPos := 0
382382
srcPos := 0
383383
for dstPos+fixedSize < len(buf) && srcPos+oldFixedSize < len(old) {
384-
dstDirent := (*Dirent)(unsafe.Pointer(&buf[dstPos]))
385-
srcDirent := (*dirent_freebsd11)(unsafe.Pointer(&old[srcPos]))
384+
var dstDirent Dirent
385+
var srcDirent dirent_freebsd11
386+
387+
// If multiple direntries are written, sometimes when we reach the final one,
388+
// we may have cap of old less than size of dirent_freebsd11.
389+
copy((*[unsafe.Sizeof(srcDirent)]byte)(unsafe.Pointer(&srcDirent))[:], old[srcPos:])
386390

387391
reclen := roundup(fixedSize+int(srcDirent.Namlen)+1, 8)
388392
if dstPos+reclen > len(buf) {
@@ -398,6 +402,7 @@ func convertFromDirents11(buf []byte, old []byte) int {
398402
dstDirent.Pad1 = 0
399403

400404
copy(dstDirent.Name[:], srcDirent.Name[:srcDirent.Namlen])
405+
copy(buf[dstPos:], (*[unsafe.Sizeof(dstDirent)]byte)(unsafe.Pointer(&dstDirent))[:])
401406
padding := buf[dstPos+fixedSize+int(dstDirent.Namlen) : dstPos+reclen]
402407
for i := range padding {
403408
padding[i] = 0

0 commit comments

Comments
 (0)