Skip to content

Commit 6c3a3bf

Browse files
tklauserbradfitz
authored andcommitted
unix: make convertFromDirents11 checkptr safe
Follow CL 202878 which did the same for package syscall. Updates golang/go#35092 Change-Id: Id53d2cde0333581c98d13b096a48f2a602b2425f Reviewed-on: https://go-review.googlesource.com/c/sys/+/202959 Run-TryBot: Tobias Klauser <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Cuong Manh Le <[email protected]> Reviewed-by: Ian Lance Taylor <[email protected]>
1 parent b4ff53e commit 6c3a3bf

File tree

1 file changed

+7
-2
lines changed

1 file changed

+7
-2
lines changed

unix/syscall_freebsd.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -462,8 +462,12 @@ func convertFromDirents11(buf []byte, old []byte) int {
462462
dstPos := 0
463463
srcPos := 0
464464
for dstPos+fixedSize < len(buf) && srcPos+oldFixedSize < len(old) {
465-
dstDirent := (*Dirent)(unsafe.Pointer(&buf[dstPos]))
466-
srcDirent := (*dirent_freebsd11)(unsafe.Pointer(&old[srcPos]))
465+
var dstDirent Dirent
466+
var srcDirent dirent_freebsd11
467+
468+
// If multiple direntries are written, sometimes when we reach the final one,
469+
// we may have cap of old less than size of dirent_freebsd11.
470+
copy((*[unsafe.Sizeof(srcDirent)]byte)(unsafe.Pointer(&srcDirent))[:], old[srcPos:])
467471

468472
reclen := roundup(fixedSize+int(srcDirent.Namlen)+1, 8)
469473
if dstPos+reclen > len(buf) {
@@ -479,6 +483,7 @@ func convertFromDirents11(buf []byte, old []byte) int {
479483
dstDirent.Pad1 = 0
480484

481485
copy(dstDirent.Name[:], srcDirent.Name[:srcDirent.Namlen])
486+
copy(buf[dstPos:], (*[unsafe.Sizeof(dstDirent)]byte)(unsafe.Pointer(&dstDirent))[:])
482487
padding := buf[dstPos+fixedSize+int(dstDirent.Namlen) : dstPos+reclen]
483488
for i := range padding {
484489
padding[i] = 0

0 commit comments

Comments
 (0)