-
Notifications
You must be signed in to change notification settings - Fork 18.5k
Description
Go version
go version go1.21.8 netbsd/amd64
Output of go env in your module/workspace:
GO111MODULE=''
GOARCH='amd64'
GOBIN=''
GOCACHE='/root/.cache/go-build'
GOENV='/root/.config/go/env'
GOEXE=''
GOEXPERIMENT=''
GOFLAGS=''
GOHOSTARCH='amd64'
GOHOSTOS='netbsd'
GOINSECURE=''
GOMODCACHE='/root/go/pkg/mod'
GONOPROXY=''
GONOSUMDB=''
GOOS='netbsd'
GOPATH='/root/go'
GOPRIVATE=''
GOPROXY='https://proxy.golang.org,direct'
GOROOT='/usr/pkg/go121'
GOSUMDB='sum.golang.org'
GOTMPDIR=''
GOTOOLCHAIN='auto'
GOTOOLDIR='/usr/pkg/go121/pkg/tool/netbsd_amd64'
GOVCS=''
GOVERSION='go1.21.8'
GCCGO='gccgo'
GOAMD64='v1'
AR='ar'
CC='gcc'
CXX='g++'
CGO_ENABLED='1'
GOMOD='/dev/null'
GOWORK=''
CGO_CFLAGS='-O2 -g'
CGO_CPPFLAGS=''
CGO_CXXFLAGS='-O2 -g'
CGO_FFLAGS='-O2 -g'
CGO_LDFLAGS='-O2 -g'
PKG_CONFIG='pkg-config'
GOGCCFLAGS='-fPIC -m64 -pthread -Wl,--no-gc-sections -fmessage-length=0 -ffile-prefix-map=/tmp/go-build1420044071=/tmp/go-build -gno-record-gcc-switches'What did you do?
Although the test case TestIoctlPtmget passes on NetBSD, debugging revealed that ptm.Sn is a byte array filled with zeros, thus preventing us from obtaining the ptsname. The log consistently shows sfd = 0, ptsname = , whereas under normal circumstances, we expect something like sfd = 0, ptsname = /dev/pts/0 to be displayed.
Below is an example of relevant code for the amd64 architecture.
func TestIoctlPtmget(t *testing.T) {
fd, err := unix.Open("/dev/ptmx", unix.O_NOCTTY|unix.O_RDWR, 0666)
if err != nil {
t.Skip("failed to open /dev/ptmx, skipping test")
}
defer unix.Close(fd)
ptm, err := unix.IoctlGetPtmget(fd, unix.TIOCPTSNAME)
if err != nil {
t.Fatalf("IoctlGetPtmget: %v\n", err)
}
t.Logf("sfd = %v, ptsname = %v", ptm.Sfd, unix.ByteSliceToString(ptm.Sn[:]))
}
const TIOCPTSNAME = 0x40287448
type Ptmget struct {
Cfd int32
Sfd int32
Cn [1024]byte
Sn [1024]byte
}According to my investigation, this error is caused by the mismatch in the lengths of the arrays Cn and Sn within the Ptmget structure with the value of TIOCPTSNAME.
In NetBSD: src/sys/sys/ttycom.h, we can find that the value of TIOCPTSNAME is related to the size of Ptmget.
#include <iostream>
#define IOCPARM_MASK 0x1fff /* parameter length, at most 13 bits */
#define IOCPARM_SHIFT 16
#define IOCGROUP_SHIFT 8
#define _IOC(inout, group, num, len) \
((inout) | (((len) & IOCPARM_MASK) << IOCPARM_SHIFT) | \
((group) << IOCGROUP_SHIFT) | (num))
#define IOC_OUT (unsigned long)0x40000000
#define _IOR(g,n,t) _IOC(IOC_OUT, (g), (n), sizeof(t))
#define TIOCPTSNAME _IOR('t', 72, struct ptmget) /* ptsname(3) */
#define PATH_MAX 1024
struct ptmget {
int cfd;
int sfd;
char cn[PATH_MAX];
char sn[PATH_MAX];
};
int main() {
std::cout << TIOCPTSNAME;
}When we set PATH_MAX to the currently used 1024 in the code, the corresponding value for TIOCPTSNAME should be 0x48087448, not the 0x40287448 defined for 386/amd64/arm64 (the arm definition matches correctly).
And when TIOCPTSNAME is 0x40287448 as used in the current code, the corresponding PATH_MAX should be 16. This indeed aligns with the description in the netbsd man page / ptm.
I will submit a CL to fix this error shortly. This is my first time submitting a CL for Go. Please let me know if there's anything inappropriate or if you have any feedback.
What did you see happen?
None
What did you expect to see?
None
Metadata
Metadata
Assignees
Labels
Type
Projects
Status