var Maxstring = &maxstring
type Uintreg uintreg
+
+var Open = open
+var Close = close
+var Read = read
+var Write = write
func raiseproc(sig int32) {
}
+
+// Stubs so tests can link correctly. These should never be called.
+func open(name *byte, mode, perm int32) int32
+func close(fd int32) int32
+func read(fd int32, p unsafe.Pointer, n int32) int32
package runtime
-import _ "unsafe" // for go:linkname
+import "unsafe"
type stdFunction *byte
}
throw("fault")
}
+
+// Stubs so tests can link correctly. These should never be called.
+func open(name *byte, mode, perm int32) int32 {
+ throw("unimplemented")
+ return -1
+}
+func close(fd int32) int32 {
+ throw("unimplemented")
+ return -1
+}
+func read(fd int32, p unsafe.Pointer, n int32) int32 {
+ throw("unimplemented")
+ return -1
+}
t.Errorf("sizeof(%#v)==%d, want 0", T5{}, unsafe.Sizeof(T5{}))
}
}
+
+func TestBadOpen(t *testing.T) {
+ if GOOS == "windows" || GOOS == "nacl" {
+ t.Skip("skipping OS that doesn't have open/read/write/close")
+ }
+ // make sure we get the correct error code if open fails. Same for
+ // read/write/close on the resulting -1 fd. See issue 10052.
+ nonfile := []byte("/notreallyafile")
+ fd := Open(&nonfile[0], 0, 0)
+ if fd != -1 {
+ t.Errorf("open(\"%s\")=%d, want -1", string(nonfile), fd)
+ }
+ var buf [32]byte
+ r := Read(-1, unsafe.Pointer(&buf[0]), int32(len(buf)))
+ if r != -1 {
+ t.Errorf("read()=%d, want -1", r)
+ }
+ w := Write(^uintptr(0), unsafe.Pointer(&buf[0]), int32(len(buf)))
+ if w != -1 {
+ t.Errorf("write()=%d, want -1", w)
+ }
+ c := Close(-1)
+ if c != -1 {
+ t.Errorf("close()=%d, want -1", c)
+ }
+}
TEXT runtime·open(SB),NOSPLIT,$0
MOVL $5, AX
INT $0x80
+ JAE 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+12(FP)
RET
TEXT runtime·close(SB),NOSPLIT,$0
MOVL $6, AX
INT $0x80
+ JAE 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+4(FP)
RET
TEXT runtime·read(SB),NOSPLIT,$0
MOVL $3, AX
INT $0x80
+ JAE 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+12(FP)
RET
TEXT runtime·write(SB),NOSPLIT,$0
MOVL $4, AX
INT $0x80
+ JAE 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+12(FP)
RET
MOVL perm+12(FP), DX // arg 3 mode
MOVL $(0x2000000+5), AX // syscall entry
SYSCALL
+ JCC 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+16(FP)
RET
MOVL fd+0(FP), DI // arg 1 fd
MOVL $(0x2000000+6), AX // syscall entry
SYSCALL
+ JCC 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+8(FP)
RET
MOVL n+16(FP), DX // arg 3 count
MOVL $(0x2000000+3), AX // syscall entry
SYSCALL
+ JCC 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+24(FP)
RET
MOVL n+16(FP), DX // arg 3 count
MOVL $(0x2000000+4), AX // syscall entry
SYSCALL
+ JCC 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+24(FP)
RET
MOVW perm+8(FP), R2
MOVW $SYS_open, R12
SWI $0x80
+ MOVW.CS $-1, R0
MOVW R0, ret+12(FP)
RET
MOVW fd+0(FP), R0
MOVW $SYS_close, R12
SWI $0x80
+ MOVW.CS $-1, R0
MOVW R0, ret+4(FP)
RET
MOVW n+8(FP), R2
MOVW $SYS_write, R12
SWI $0x80
+ MOVW.CS $-1, R0
MOVW R0, ret+12(FP)
RET
MOVW n+8(FP), R2
MOVW $SYS_read, R12
SWI $0x80
+ MOVW.CS $-1, R0
MOVW R0, ret+12(FP)
RET
TEXT runtime·open(SB),NOSPLIT,$-4
MOVL $5, AX
INT $0x80
+ JAE 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+12(FP)
RET
TEXT runtime·close(SB),NOSPLIT,$-4
MOVL $6, AX
INT $0x80
+ JAE 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+4(FP)
RET
TEXT runtime·read(SB),NOSPLIT,$-4
MOVL $3, AX
INT $0x80
+ JAE 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+12(FP)
RET
TEXT runtime·write(SB),NOSPLIT,$-4
MOVL $4, AX
INT $0x80
+ JAE 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+12(FP)
RET
MOVL perm+12(FP), DX // arg 3 mode
MOVL $5, AX
SYSCALL
+ JCC 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+16(FP)
RET
MOVL fd+0(FP), DI // arg 1 fd
MOVL $6, AX
SYSCALL
+ JCC 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+8(FP)
RET
MOVL n+16(FP), DX // arg 3 count
MOVL $3, AX
SYSCALL
+ JCC 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+24(FP)
RET
MOVL n+16(FP), DX // arg 3 count
MOVL $4, AX
SYSCALL
+ JCC 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+24(FP)
RET
TEXT runtime·open(SB),NOSPLIT,$-4
MOVL $5, AX
INT $0x80
+ JAE 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+12(FP)
RET
TEXT runtime·close(SB),NOSPLIT,$-4
MOVL $6, AX
INT $0x80
+ JAE 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+4(FP)
RET
TEXT runtime·read(SB),NOSPLIT,$-4
MOVL $3, AX
INT $0x80
+ JAE 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+12(FP)
RET
TEXT runtime·write(SB),NOSPLIT,$-4
MOVL $4, AX
INT $0x80
+ JAE 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+12(FP)
RET
MOVL perm+12(FP), DX // arg 3 mode
MOVL $5, AX
SYSCALL
+ JCC 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+16(FP)
RET
MOVL fd+0(FP), DI // arg 1 fd
MOVL $6, AX
SYSCALL
+ JCC 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+8(FP)
RET
MOVL n+16(FP), DX // arg 3 count
MOVL $3, AX
SYSCALL
+ JCC 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+24(FP)
RET
MOVL n+16(FP), DX // arg 3 count
MOVL $4, AX
SYSCALL
+ JCC 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+24(FP)
RET
MOVW perm+8(FP), R2 // arg 3 perm
MOVW $SYS_open, R7
SWI $0
+ MOVW.CS $-1, R0
MOVW R0, ret+12(FP)
RET
MOVW n+8(FP), R2 // arg 3 count
MOVW $SYS_read, R7
SWI $0
+ MOVW.CS $-1, R0
MOVW R0, ret+12(FP)
RET
MOVW n+8(FP), R2 // arg 3 count
MOVW $SYS_write, R7
SWI $0
+ MOVW.CS $-1, R0
MOVW R0, ret+12(FP)
RET
MOVW fd+0(FP), R0 // arg 1 fd
MOVW $SYS_close, R7
SWI $0
+ MOVW.CS $-1, R0
MOVW R0, ret+4(FP)
RET
MOVL mode+4(FP), CX
MOVL perm+8(FP), DX
CALL *runtime·_vdso(SB)
+ CMPL AX, $0xfffff001
+ JLS 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+12(FP)
RET
MOVL $6, AX // syscall - close
MOVL fd+0(FP), BX
CALL *runtime·_vdso(SB)
+ CMPL AX, $0xfffff001
+ JLS 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+4(FP)
RET
MOVL p+4(FP), CX
MOVL n+8(FP), DX
CALL *runtime·_vdso(SB)
+ CMPL AX, $0xfffff001
+ JLS 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+12(FP)
RET
MOVL p+4(FP), CX
MOVL n+8(FP), DX
CALL *runtime·_vdso(SB)
+ CMPL AX, $0xfffff001
+ JLS 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+12(FP)
RET
MOVL perm+12(FP), DX
MOVL $2, AX // syscall entry
SYSCALL
+ CMPQ AX, $0xfffffffffffff001
+ JLS 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+16(FP)
RET
MOVL fd+0(FP), DI
MOVL $3, AX // syscall entry
SYSCALL
+ CMPQ AX, $0xfffffffffffff001
+ JLS 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+8(FP)
RET
MOVL n+16(FP), DX
MOVL $1, AX // syscall entry
SYSCALL
+ CMPQ AX, $0xfffffffffffff001
+ JLS 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+24(FP)
RET
MOVL n+16(FP), DX
MOVL $0, AX // syscall entry
SYSCALL
+ CMPQ AX, $0xfffffffffffff001
+ JLS 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+24(FP)
RET
MOVW perm+8(FP), R2
MOVW $SYS_open, R7
SWI $0
+ MOVW $0xfffff001, R1
+ CMP R1, R0
+ MOVW.HI $-1, R0
MOVW R0, ret+12(FP)
RET
MOVW fd+0(FP), R0
MOVW $SYS_close, R7
SWI $0
+ MOVW $0xfffff001, R1
+ CMP R1, R0
+ MOVW.HI $-1, R0
MOVW R0, ret+4(FP)
RET
MOVW n+8(FP), R2
MOVW $SYS_write, R7
SWI $0
+ MOVW $0xfffff001, R1
+ CMP R1, R0
+ MOVW.HI $-1, R0
MOVW R0, ret+12(FP)
RET
MOVW n+8(FP), R2
MOVW $SYS_read, R7
SWI $0
+ MOVW $0xfffff001, R1
+ CMP R1, R0
+ MOVW.HI $-1, R0
MOVW R0, ret+12(FP)
RET
MOVW mode+8(FP), R4
MOVW perm+12(FP), R5
SYSCALL $SYS_open
+ BVC 2(PC)
+ MOVW $-1, R3
MOVW R3, ret+16(FP)
RETURN
TEXT runtime·close(SB),NOSPLIT,$-8-12
MOVW fd+0(FP), R3
SYSCALL $SYS_close
+ BVC 2(PC)
+ MOVW $-1, R3
MOVW R3, ret+8(FP)
RETURN
MOVD p+8(FP), R4
MOVW n+16(FP), R5
SYSCALL $SYS_write
+ BVC 2(PC)
+ MOVW $-1, R3
MOVW R3, ret+24(FP)
RETURN
MOVD p+8(FP), R4
MOVW n+16(FP), R5
SYSCALL $SYS_read
+ BVC 2(PC)
+ MOVW $-1, R3
MOVW R3, ret+24(FP)
RETURN
TEXT runtime·open(SB),NOSPLIT,$-4
MOVL $5, AX
INT $0x80
+ JAE 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+12(FP)
RET
TEXT runtime·close(SB),NOSPLIT,$-4
MOVL $6, AX
INT $0x80
+ JAE 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+4(FP)
RET
TEXT runtime·read(SB),NOSPLIT,$-4
MOVL $3, AX
INT $0x80
+ JAE 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+12(FP)
RET
TEXT runtime·write(SB),NOSPLIT,$-4
MOVL $4, AX // sys_write
INT $0x80
+ JAE 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+12(FP)
RET
MOVL perm+12(FP), DX // arg 3 mode
MOVL $5, AX
SYSCALL
+ JCC 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+16(FP)
RET
MOVL fd+0(FP), DI // arg 1 fd
MOVL $6, AX
SYSCALL
+ JCC 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+8(FP)
RET
MOVL n+16(FP), DX // arg 3 count
MOVL $3, AX
SYSCALL
+ JCC 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+24(FP)
RET
MOVL n+16(FP), DX // arg 3 - nbyte
MOVL $4, AX // sys_write
SYSCALL
+ JCC 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+24(FP)
RET
MOVW mode+4(FP), R1
MOVW perm+8(FP), R2
SWI $0xa00005
+ MOVW.CS $-1, R0
MOVW R0, ret+12(FP)
RET
TEXT runtime·close(SB),NOSPLIT,$-8
MOVW fd+0(FP), R0
SWI $0xa00006
+ MOVW.CS $-1, R0
MOVW R0, ret+4(FP)
RET
MOVW p+4(FP), R1
MOVW n+8(FP), R2
SWI $0xa00003
+ MOVW.CS $-1, R0
MOVW R0, ret+12(FP)
RET
MOVW p+4(FP), R1 // arg 2 - buf
MOVW n+8(FP), R2 // arg 3 - nbyte
SWI $0xa00004 // sys_write
+ MOVW.CS $-1, R0
MOVW R0, ret+12(FP)
RET
TEXT runtime·open(SB),NOSPLIT,$-4
MOVL $5, AX
INT $0x80
+ JAE 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+12(FP)
RET
TEXT runtime·close(SB),NOSPLIT,$-4
MOVL $6, AX
INT $0x80
+ JAE 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+4(FP)
RET
TEXT runtime·read(SB),NOSPLIT,$-4
MOVL $3, AX
INT $0x80
+ JAE 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+12(FP)
RET
TEXT runtime·write(SB),NOSPLIT,$-4
MOVL $4, AX // sys_write
INT $0x80
+ JAE 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+12(FP)
RET
MOVL perm+12(FP), DX // arg 3 mode
MOVL $5, AX
SYSCALL
+ JCC 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+16(FP)
RET
MOVL fd+0(FP), DI // arg 1 fd
MOVL $6, AX
SYSCALL
+ JCC 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+8(FP)
RET
MOVL n+16(FP), DX // arg 3 count
MOVL $3, AX
SYSCALL
+ JCC 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+24(FP)
RET
MOVL n+16(FP), DX // arg 3 - nbyte
MOVL $4, AX // sys_write
SYSCALL
+ JCC 2(PC)
+ MOVL $-1, AX
MOVL AX, ret+24(FP)
RET