Skip to content

Commit f329bdf

Browse files
committed
Add support for F_GETFD in order to support go1.22+
1 parent 25feabf commit f329bdf

File tree

4 files changed

+79
-0
lines changed

4 files changed

+79
-0
lines changed

rvgo/fast/vm.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,26 @@ func (inst *InstrumentedState) riscvStep() (outErr error) {
486486
var out U64
487487
var errCode U64
488488
switch cmd {
489+
case 0x1: // F_GETFD: get file descriptor flags
490+
switch fd {
491+
case 0: // stdin
492+
out = toU64(0) // no flag set
493+
case 1: // stdout
494+
out = toU64(0) // no flag set
495+
case 2: // stderr
496+
out = toU64(0) // no flag set
497+
case 3: // hint-read
498+
out = toU64(0) // no flag set
499+
case 4: // hint-write
500+
out = toU64(0) // no flag set
501+
case 5: // pre-image read
502+
out = toU64(0) // no flag set
503+
case 6: // pre-image write
504+
out = toU64(0) // no flag set
505+
default:
506+
out = u64Mask()
507+
errCode = toU64(0x4d) //EBADF
508+
}
489509
case 0x3: // F_GETFL: get file descriptor flags
490510
switch fd {
491511
case 0: // stdin

rvgo/slow/vm.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -666,6 +666,26 @@ func Step(calldata []byte, po PreimageOracle) (stateHash common.Hash, outErr err
666666
var out U64
667667
var errCode U64
668668
switch cmd.val() {
669+
case 0x1: // F_GETFD: get file descriptor flags
670+
switch fd.val() {
671+
case 0: // stdin
672+
out = toU64(0) // no flag set
673+
case 1: // stdout
674+
out = toU64(0) // no flag set
675+
case 2: // stderr
676+
out = toU64(0) // no flag set
677+
case 3: // hint-read
678+
out = toU64(0) // no flag set
679+
case 4: // hint-write
680+
out = toU64(0) // no flag set
681+
case 5: // pre-image read
682+
out = toU64(0) // no flag set
683+
case 6: // pre-image write
684+
out = toU64(0) // no flag set
685+
default:
686+
out = u64Mask()
687+
errCode = toU64(0x4d) //EBADF
688+
}
669689
case 0x3: // F_GETFL: get file descriptor flags
670690
switch fd.val() {
671691
case 0: // stdin

rvgo/test/syscall_test.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -483,6 +483,17 @@ func FuzzStateSyscallFcntl(f *testing.F) {
483483
}
484484
testFcntl(t, fd, cmd, pc, step, 0xFFFF_FFFF_FFFF_FFFF, 0x16)
485485
})
486+
487+
f.Fuzz(func(t *testing.T, fd uint64, cmd uint64, pc uint64, step uint64) {
488+
// Test F_GETFD
489+
for _, fd := range []uint64{0, 1, 2, 3, 4, 5, 6} {
490+
testFcntl(t, fd, 1, pc, step, 0, 0)
491+
}
492+
493+
// Test F_GETFD for unsupported fds
494+
// Add 7 to fd to ensure fd > 6
495+
testFcntl(t, fd+7, 1, pc, step, 0xFFFF_FFFF_FFFF_FFFF, 0x4d)
496+
})
486497
}
487498

488499
func FuzzStateSyscallOpenat(f *testing.F) {

rvsol/src/RISCV.sol

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -994,6 +994,34 @@ contract RISCV {
994994
let out := 0
995995
let errCode := 0
996996
switch cmd
997+
case 0x1 { // F_GETFD: get file descriptor flags
998+
switch fd
999+
case 0 { // stdin
1000+
out := toU64(0) // no flag set
1001+
}
1002+
case 1 { // stdout
1003+
out := toU64(0) // no flag set
1004+
}
1005+
case 2 { // stderr
1006+
out := toU64(0) // no flag set
1007+
}
1008+
case 3 { // hint-read
1009+
out := toU64(0) // no flag set
1010+
}
1011+
case 4 { // hint-write
1012+
out := toU64(0) // no flag set
1013+
}
1014+
case 5 {// pre-image read
1015+
out := toU64(0) // no flag set
1016+
}
1017+
case 6 { // pre-image write
1018+
out := toU64(0) // no flag set
1019+
}
1020+
default {
1021+
out := u64Mask()
1022+
errCode := toU64(0x4d) //EBADF
1023+
}
1024+
}
9971025
case 0x3 {
9981026
// F_GETFL: get file descriptor flags
9991027
switch fd

0 commit comments

Comments
 (0)