summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/inet/tcp/tcp.c
diff options
context:
space:
mode:
authorDan McDonald <danmcd@omniti.com>2014-02-14 11:27:16 -0500
committerDan McDonald <danmcd@omniti.com>2014-03-05 10:54:10 -0500
commita1ca8b43681e3163e9f085ab65b8b6de1848d8ac (patch)
tree116b6fc2cff4ac6b6e952a344371b80a11b5af39 /usr/src/uts/common/inet/tcp/tcp.c
parent7298ed33f6dda314aee9fee22d0dccfb09cc0ef6 (diff)
downloadillumos-gate-a1ca8b43681e3163e9f085ab65b8b6de1848d8ac.tar.gz
4596 Callers of ip_srcid_find_id() need to be more careful
Reviewed by: Garrett D'Amore <garrett@damore.org> Reviewed by: Sebastien Roy <sebastien.roy@delphix.com> Approved by: Robert Mustacchi <rm@joyent.com>
Diffstat (limited to 'usr/src/uts/common/inet/tcp/tcp.c')
-rw-r--r--usr/src/uts/common/inet/tcp/tcp.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/usr/src/uts/common/inet/tcp/tcp.c b/usr/src/uts/common/inet/tcp/tcp.c
index 5ba1c603c0..7d48fd1c49 100644
--- a/usr/src/uts/common/inet/tcp/tcp.c
+++ b/usr/src/uts/common/inet/tcp/tcp.c
@@ -24,6 +24,7 @@
* Copyright (c) 2011, Joyent Inc. All rights reserved.
* Copyright (c) 2011 Nexenta Systems, Inc. All rights reserved.
* Copyright (c) 2013 by Delphix. All rights reserved.
+ * Copyright 2014, OmniTI Computer Consulting, Inc. All rights reserved.
*/
/* Copyright (c) 1990 Mentat Inc. */
@@ -1583,8 +1584,11 @@ tcp_connect_ipv4(tcp_t *tcp, ipaddr_t *dstaddrp, in_port_t dstport,
/* Handle __sin6_src_id if socket not bound to an IP address */
if (srcid != 0 && connp->conn_laddr_v4 == INADDR_ANY) {
- ip_srcid_find_id(srcid, &connp->conn_laddr_v6,
- IPCL_ZONEID(connp), tcps->tcps_netstack);
+ if (!ip_srcid_find_id(srcid, &connp->conn_laddr_v6,
+ IPCL_ZONEID(connp), B_TRUE, tcps->tcps_netstack)) {
+ /* Mismatch - conn_laddr_v6 would be v6 address. */
+ return (EADDRNOTAVAIL);
+ }
connp->conn_saddr_v6 = connp->conn_laddr_v6;
}
@@ -1665,8 +1669,11 @@ tcp_connect_ipv6(tcp_t *tcp, in6_addr_t *dstaddrp, in_port_t dstport,
/* Handle __sin6_src_id if socket not bound to an IP address */
if (srcid != 0 && IN6_IS_ADDR_UNSPECIFIED(&connp->conn_laddr_v6)) {
- ip_srcid_find_id(srcid, &connp->conn_laddr_v6,
- IPCL_ZONEID(connp), tcps->tcps_netstack);
+ if (!ip_srcid_find_id(srcid, &connp->conn_laddr_v6,
+ IPCL_ZONEID(connp), B_FALSE, tcps->tcps_netstack)) {
+ /* Mismatch - conn_laddr_v6 would be v4-mapped. */
+ return (EADDRNOTAVAIL);
+ }
connp->conn_saddr_v6 = connp->conn_laddr_v6;
}