19187537 iberror() of open-fabrics dumps core because of buffer overrun
19195181 wrong handling of getaddrinfo() retval in open-fabrics dumps core
19448949 libibverbs cleanup incomplete
--- a/components/open-fabrics/infiniband-diags/patches/base.patch Fri Oct 31 07:12:22 2014 -0700
+++ b/components/open-fabrics/infiniband-diags/patches/base.patch Mon Nov 03 13:22:00 2014 -0800
@@ -1,3 +1,6 @@
+# This patch was developed in-house. Since it is Solaris-specific,
+# it is not suitable for upstream.
+#
diff -r -u /tmp/infiniband-diags-1.5.8/Makefile.am infiniband-diags-1.5.8/Makefile.am
--- /tmp/infiniband-diags-1.5.8/Makefile.am Wed Feb 16 02:13:21 2011
+++ infiniband-diags-1.5.8/Makefile.am Fri Feb 25 03:09:22 2011
@@ -1928,7 +1931,18 @@
diff -r -u /tmp/infiniband-diags-1.5.8/src/ibdiag_common.c infiniband-diags-1.5.8/src/ibdiag_common.c
--- /tmp/infiniband-diags-1.5.8/src/ibdiag_common.c Wed Feb 16 02:13:21 2011
+++ infiniband-diags-1.5.8/src/ibdiag_common.c Tue May 3 13:50:05 2011
-@@ -330,7 +330,7 @@
+@@ -322,15 +322,17 @@
+ char buf[512];
+ va_list va;
+ int n;
++ int bufsz;
+
+ va_start(va, msg);
+- n = vsprintf(buf, msg, va);
++ bufsz = strlen(msg) < sizeof (buf) ? strlen(msg) : sizeof (buf);
++ n = vsnprintf(buf, bufsz, msg, va);
+ va_end(va);
+ buf[n] = 0;
if (ibdebug)
printf("%s: iberror: [pid %d] %s: failed: %s\n",
--- a/components/open-fabrics/libibverbs/patches/base.patch Fri Oct 31 07:12:22 2014 -0700
+++ b/components/open-fabrics/libibverbs/patches/base.patch Mon Nov 03 13:22:00 2014 -0800
@@ -1,3 +1,6 @@
+# This patch was developed in-house. Since it is Solaris-specific,
+# it is not suitable for upstream.
+#
diff -r -u /tmp/846623/libibverbs-1.1.4/Makefile.am libibverbs-1.1.4/Makefile.am
--- /tmp/846623/libibverbs-1.1.4/Makefile.am Thu Feb 3 01:53:17 2011
+++ libibverbs-1.1.4/Makefile.am Fri Feb 11 04:02:12 2011
@@ -2524,6 +2527,27 @@
device_list.o: examples/device_list.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT device_list.o -MD -MP -MF $(DEPDIR)/device_list.Tpo -c -o device_list.o `test -f 'examples/device_list.c' || echo '$(srcdir)/'`examples/device_list.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/device_list.Tpo $(DEPDIR)/device_list.Po
+diff -r -u /tmp/846623/libibverbs-1.1.4/examples/uc_pingpong.c libibverbs-1.1.4/examples/uc_pingpong.c
+--- /tmp/846623/libibverbs-1.1.4/examples/uc_pingpong.c Thu Mar 10 06:58:21 2011
++++ libibverbs-1.1.4/examples/uc_pingpong.c Tue Aug 19 10:46:28 2014
+@@ -144,7 +144,7 @@
+
+ n = getaddrinfo(servername, service, &hints, &res);
+
+- if (n < 0) {
++ if (n != 0) {
+ fprintf(stderr, "%s for %s:%d\n", gai_strerror(n), servername, port);
+ free(service);
+ return NULL;
+@@ -219,7 +219,7 @@
+
+ n = getaddrinfo(NULL, service, &hints, &res);
+
+- if (n < 0) {
++ if (n != 0) {
+ fprintf(stderr, "%s for port %d\n", gai_strerror(n), port);
+ free(service);
+ return NULL;
diff -r -u /tmp/846623/libibverbs-1.1.4/examples/asyncwatch.c libibverbs-1.1.4/examples/asyncwatch.c
--- /tmp/846623/libibverbs-1.1.4/examples/asyncwatch.c Thu Mar 10 06:58:21 2011
+++ libibverbs-1.1.4/examples/asyncwatch.c Fri Feb 11 04:02:18 2011
@@ -2916,51 +2940,87 @@
diff -r -u /tmp/846623/libibverbs-1.1.4/examples/srq_pingpong.c libibverbs-1.1.4/examples/srq_pingpong.c
--- /tmp/846623/libibverbs-1.1.4/examples/srq_pingpong.c Thu Mar 10 06:58:21 2011
+++ libibverbs-1.1.4/examples/srq_pingpong.c Wed Jun 8 09:46:34 2011
-@@ -171,6 +171,12 @@
+@@ -165,8 +165,13 @@
+
+ n = getaddrinfo(servername, service, &hints, &res);
+
+- if (n < 0) {
+- fprintf(stderr, "%s for %s:%d\n", gai_strerror(n), servername, port);
++ if (n != 0) {
++ if (n == EAI_NONAME)
++ fprintf(stderr,
++ "Name or service not known for %s:%d\n", servername, port);
++ else
++ fprintf(stderr,
++ "%s for %s:%d\n", gai_strerror(n), servername, port);
+ free(service);
return NULL;
}
+@@ -253,7 +258,7 @@
-+ if (n == EAI_NONAME) {
-+ fprintf(stderr, "Name or service not known for %s:%d\n", servername, port);
-+ free(service);
-+ return NULL;
-+ }
-+
- for (t = res; t; t = t->ai_next) {
- sockfd = socket(t->ai_family, t->ai_socktype, t->ai_protocol);
- if (sockfd >= 0) {
+ n = getaddrinfo(NULL, service, &hints, &res);
+
+- if (n < 0) {
++ if (n != 0) {
+ fprintf(stderr, "%s for port %d\n", gai_strerror(n), port);
+ free(service);
+ return NULL;
diff -r -u /tmp/846623/libibverbs-1.1.4/examples/ud_pingpong.c libibverbs-1.1.4/examples/ud_pingpong.c
--- /tmp/846623/libibverbs-1.1.4/examples/ud_pingpong.c Thu Mar 10 06:58:21 2011
+++ libibverbs-1.1.4/examples/ud_pingpong.c Wed Jun 8 09:46:34 2011
-@@ -149,6 +149,12 @@
+@@ -143,8 +143,13 @@
+
+ n = getaddrinfo(servername, service, &hints, &res);
+
+- if (n < 0) {
+- fprintf(stderr, "%s for %s:%d\n", gai_strerror(n), servername, port);
++ if (n != 0) {
++ if (n == EAI_NONAME)
++ fprintf(stderr,
++ "Name or service not known for %s:%d\n", servername, port);
++ else
++ fprintf(stderr,
++ "%s for %s:%d\n", gai_strerror(n), servername, port);
+ free(service);
return NULL;
}
+@@ -217,7 +222,7 @@
-+ if (n == EAI_NONAME) {
-+ fprintf(stderr, "Name or service not known for %s:%d\n", servername, port);
-+ free(service);
-+ return NULL;
-+ }
-+
- for (t = res; t; t = t->ai_next) {
- sockfd = socket(t->ai_family, t->ai_socktype, t->ai_protocol);
- if (sockfd >= 0) {
+ n = getaddrinfo(NULL, service, &hints, &res);
+
+- if (n < 0) {
++ if (n != 0) {
+ fprintf(stderr, "%s for port %d\n", gai_strerror(n), port);
+ free(service);
+ return NULL;
diff -r -u /tmp/846623/libibverbs-1.1.4/examples/rc_pingpong.c libibverbs-1.1.4/examples/rc_pingpong.c
--- /tmp/846623/libibverbs-1.1.4/examples/rc_pingpong.c Thu Mar 10 06:58:21 2011
+++ libibverbs-1.1.4/examples/rc_pingpong.c Wed Jun 8 09:46:34 2011
-@@ -161,6 +161,12 @@
+@@ -155,8 +155,13 @@
+
+ n = getaddrinfo(servername, service, &hints, &res);
+
+- if (n < 0) {
+- fprintf(stderr, "%s for %s:%d\n", gai_strerror(n), servername, port);
++ if (n != 0) {
++ if (n == EAI_NONAME)
++ fprintf(stderr,
++ "Name or service not known for %s:%d\n", servername, port);
++ else
++ fprintf(stderr,
++ "%s for %s:%d\n", gai_strerror(n), servername, port);
+ free(service);
return NULL;
}
+@@ -230,7 +235,7 @@
-+ if (n == EAI_NONAME) {
-+ fprintf(stderr, "Name or service not known for %s:%d\n", servername, port);
-+ free(service);
-+ return NULL;
-+ }
-+
- for (t = res; t; t = t->ai_next) {
- sockfd = socket(t->ai_family, t->ai_socktype, t->ai_protocol);
- if (sockfd >= 0) {
+ n = getaddrinfo(NULL, service, &hints, &res);
+
+- if (n < 0) {
++ if (n != 0) {
+ fprintf(stderr, "%s for port %d\n", gai_strerror(n), port);
+ free(service);
+ return NULL;
diff -r -u /tmp/846623/libibverbs-1.1.4/examples/device_list.c libibverbs-1.1.4/examples/device_list.c
--- /tmp/846623/libibverbs-1.1.4/examples/device_list.c Sun Nov 1 06:47:19 2009
+++ libibverbs-1.1.4/examples/device_list.c Fri Feb 11 04:02:18 2011
--- a/components/open-fabrics/libibverbs/solaris_compatibility.c Fri Oct 31 07:12:22 2014 -0700
+++ b/components/open-fabrics/libibverbs/solaris_compatibility.c Mon Nov 03 13:22:00 2014 -0800
@@ -371,13 +371,8 @@
uverbs_cache_info_t info;
int dev_num, fd, i, bufsize, hca_cnt;
char uverbs_devpath[MAXPATHLEN];
-#ifndef IB_USER_VERBS_V2_IN_V1
sol_uverbs_info_t *uverbs_infop;
sol_uverbs_hca_info_t *hca_infop;
-#else
- sol_uverbs_info_v2_t *uverbs_infop;
- sol_uverbs_hca_info_v2_t *hca_infop;
-#endif
char *buf;
snprintf(uverbs_devpath, MAXPATHLEN, "%s/%s%d",
@@ -394,20 +389,11 @@
goto error_exit1;
}
-#ifndef IB_USER_VERBS_V2_IN_V1
bufsize = sizeof (sol_uverbs_info_t) + sizeof (sol_uverbs_hca_info_t) *
MAX_HCAS;
-#else
- bufsize = sizeof (sol_uverbs_info_v2_t) +
- sizeof (sol_uverbs_hca_info_v2_t) * MAX_HCAS;
-#endif
buf = malloc(bufsize);
memset(buf, 0, bufsize);
-#ifndef IB_USER_VERBS_V2_IN_V1
uverbs_infop = (sol_uverbs_info_t *)buf;
-#else
- uverbs_infop = (sol_uverbs_info_v2_t *)buf;
-#endif
uverbs_infop->uverbs_hca_cnt = MAX_HCAS;
if (ioctl(fd, UVERBS_IOCTL_GET_HCA_INFO, uverbs_infop) != 0) {
--- a/components/open-fabrics/perftest/patches/base.patch Fri Oct 31 07:12:22 2014 -0700
+++ b/components/open-fabrics/perftest/patches/base.patch Mon Nov 03 13:22:00 2014 -0800
@@ -1,3 +1,6 @@
+# This patch was developed in-house. Since it is Solaris-specific,
+# it is not suitable for upstream.
+#
diff -r -u /tmp/perftest-1.3.0/Makefile perftest-1.3.0/Makefile
--- /tmp/perftest-1.3.0/Makefile Thu Jan 20 01:37:35 2011
+++ perftest-1.3.0/Makefile Fri Feb 11 04:12:45 2011
@@ -214,9 +217,12 @@
#include <infiniband/verbs.h>
#include <rdma/rdma_cma.h>
-@@ -144,7 +147,7 @@
+@@ -142,9 +145,9 @@
- if (n < 0) {
+ n = getaddrinfo(data->servername, service, &hints, &res);
+
+- if (n < 0) {
++ if (n != 0) {
fprintf(stderr, "%d:%s: %s for %s:%d\n",
- pid, __func__, gai_strerror(n),
+ (int)pid, __func__, gai_strerror(n),
@@ -343,11 +349,13 @@
free(data->rem_dest);
goto err;
}
-@@ -347,7 +350,7 @@
+@@ -346,8 +349,8 @@
+ if (asprintf(&service, "%d", data->port) < 0)
goto err5;
- if ( (n = getaddrinfo(NULL, service, &hints, &res)) < 0 ) {
+- if ( (n = getaddrinfo(NULL, service, &hints, &res)) < 0 ) {
- fprintf(stderr, "%d:%s: %s for port %d\n", pid, __func__,
++ if ( (n = getaddrinfo(NULL, service, &hints, &res) != 0) ) {
+ fprintf(stderr, "%d:%s: %s for port %d\n", (int)pid, __func__,
gai_strerror(n), data->port);
goto err5;
@@ -828,6 +836,15 @@
return 1;
}
ccnt += 1;
+@@ -1265,7 +1277,7 @@
+
+ write(data.sockfd, "done", sizeof "done");
+ close(data.sockfd);
+-
++
+ }
+
+ print_report(iters, data.size, duplex, tposted, tcompleted);
diff -r -u /tmp/perftest-1.3.0/rdma_lat.c perftest-1.3.0/rdma_lat.c
--- /tmp/perftest-1.3.0/rdma_lat.c Wed Apr 7 09:44:33 2010
+++ perftest-1.3.0/rdma_lat.c Fri Feb 11 04:12:46 2011
@@ -874,9 +891,12 @@
&rem_dest->psn, &rem_dest->rkey, &rem_dest->vaddr);
if (parsed != 5) {
-@@ -220,7 +229,7 @@
+@@ -218,9 +227,9 @@
- if (n < 0) {
+ n = getaddrinfo(data->servername, service, &hints, &res);
+
+- if (n < 0) {
++ if (n != 0) {
fprintf(stderr, "%d:%s: %s for %s:%d\n",
- pid, __func__, gai_strerror(n),
+ (int)pid, __func__, gai_strerror(n),
@@ -962,11 +982,13 @@
goto err3;
}
ctx = pp_init_ctx(data->ib_dev, data);
-@@ -393,7 +402,7 @@
+@@ -392,8 +401,8 @@
+ if (asprintf(&service, "%d", data->port) < 0)
goto err5;
- if ( (n = getaddrinfo(NULL, service, &hints, &res)) < 0 ) {
+- if ( (n = getaddrinfo(NULL, service, &hints, &res)) < 0 ) {
- fprintf(stderr, "%d:%s: %s for port %d\n", pid, __func__,
++ if ( (n = getaddrinfo(NULL, service, &hints, &res) != 0) ) {
+ fprintf(stderr, "%d:%s: %s for port %d\n", (int)pid, __func__,
gai_strerror(n), data->port);
goto err5;
@@ -1384,6 +1406,24 @@
} else {
switch (params->mtu) {
+@@ -791,7 +807,7 @@
+
+ n = getaddrinfo(servername, service, &hints, &res);
+
+- if (n < 0) {
++ if (n != 0) {
+ fprintf(stderr, "%s for %s:%d\n", gai_strerror(n), servername, port);
+ return n;
+ }
+@@ -835,7 +851,7 @@
+
+ n = getaddrinfo(NULL, service, &hints, &res);
+
+- if (n < 0) {
++ if (n != 0) {
+ fprintf(stderr, "%s for port %d\n", gai_strerror(n), port);
+ return n;
+ }
@@ -869,7 +885,6 @@
close(sockfd);
return connfd;