diff options
| author | jan.nijtmans <nijtmans@users.sourceforge.net> | 2023-12-30 21:32:22 (GMT) |
|---|---|---|
| committer | jan.nijtmans <nijtmans@users.sourceforge.net> | 2023-12-30 21:32:22 (GMT) |
| commit | dc8b54aa4a41cb96a11d5aba63ea749b62455af5 (patch) | |
| tree | c91c334d8ea0c72af75771eea534bd68bbf204c4 /unix/tclUnixChan.c | |
| parent | b5f266cc6f83e2553829349945914bc908323817 (diff) | |
| download | tcl-dc8b54aa4a41cb96a11d5aba63ea749b62455af5.zip tcl-dc8b54aa4a41cb96a11d5aba63ea749b62455af5.tar.gz tcl-dc8b54aa4a41cb96a11d5aba63ea749b62455af5.tar.bz2 | |
(cherry-pick) Don't call getsockname(2) in Tcl_MakeFileChannel(3) unless absolutely necessary. Closes RFE [0ac9d06895]. Permits better constraining of Tcl/tclsh via OpenBSD's pledge(2) or similar mechanisms. Minor rewrite
Diffstat (limited to 'unix/tclUnixChan.c')
| -rw-r--r-- | unix/tclUnixChan.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/unix/tclUnixChan.c b/unix/tclUnixChan.c index 0957282..132f690 100644 --- a/unix/tclUnixChan.c +++ b/unix/tclUnixChan.c @@ -1975,27 +1975,29 @@ Tcl_MakeFileChannel( char channelName[16 + TCL_INTEGER_SPACE]; int fd = PTR2INT(handle); const Tcl_ChannelType *channelTypePtr; - struct sockaddr sockaddr; - socklen_t sockaddrLen = sizeof(sockaddr); + Tcl_StatBuf buf; if (mode == 0) { return NULL; } - sockaddr.sa_family = AF_UNSPEC; - #ifdef SUPPORTS_TTY if (isatty(fd)) { channelTypePtr = &ttyChannelType; snprintf(channelName, sizeof(channelName), "serial%d", fd); } else #endif /* SUPPORTS_TTY */ - if ((getsockname(fd, (struct sockaddr *)&sockaddr, &sockaddrLen) == 0) + if (TclOSfstat(fd, &buf) == 0 && S_ISSOCK(buf.st_mode)) { + struct sockaddr sockaddr; + socklen_t sockaddrLen = sizeof(sockaddr); + + sockaddr.sa_family = AF_UNSPEC; + if ((getsockname(fd, (struct sockaddr *)&sockaddr, &sockaddrLen) == 0) && (sockaddrLen > 0) && (sockaddr.sa_family == AF_INET || sockaddr.sa_family == AF_INET6)) { - return (Tcl_Channel)TclpMakeTcpClientChannelMode(INT2PTR(fd), mode); - } else { + return (Tcl_Channel)TclpMakeTcpClientChannelMode(INT2PTR(fd), mode); + } channelTypePtr = &fileChannelType; snprintf(channelName, sizeof(channelName), "file%d", fd); } |
