summaryrefslogtreecommitdiffstats
path: root/unix/tclUnixChan.c
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2023-12-30 21:32:22 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2023-12-30 21:32:22 (GMT)
commitdc8b54aa4a41cb96a11d5aba63ea749b62455af5 (patch)
treec91c334d8ea0c72af75771eea534bd68bbf204c4 /unix/tclUnixChan.c
parentb5f266cc6f83e2553829349945914bc908323817 (diff)
downloadtcl-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.c16
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);
}