From 7839dc91a8f7a1f33114761ae13a5d7d4d1bfa18 Mon Sep 17 00:00:00 2001
From: Ralph Castain <rhc@open-mpi.org>
Date: Mon, 30 Oct 2017 13:06:41 -0700
Subject: [PATCH] Sync to PMIx v3.0 (master)

Signed-off-by: Ralph Castain <rhc@open-mpi.org>
---
 opal/mca/pmix/pmix3x/pmix/VERSION             |  4 +--
 .../pmix3x/pmix/config/pmix_setup_zlib.m4     | 28 +++++++++++--------
 .../pmix/pmix3x/pmix/src/mca/ptl/base/base.h  |  1 +
 .../pmix/src/mca/ptl/base/ptl_base_frame.c    |  7 +++++
 .../pmix/src/mca/ptl/base/ptl_base_sendrecv.c |  7 +++++
 .../pmix/src/runtime/help-pmix-runtime.txt    |  9 ++++++
 opal/mca/pmix/pmix3x/pmix/src/util/path.c     |  1 +
 opal/mca/pmix/pmix3x/pmix/src/util/pif.c      | 10 +++----
 8 files changed, 48 insertions(+), 19 deletions(-)

diff --git a/opal/mca/pmix/pmix3x/pmix/VERSION b/opal/mca/pmix/pmix3x/pmix/VERSION
index 2e8071d32c..75471cddac 100644
--- a/opal/mca/pmix/pmix3x/pmix/VERSION
+++ b/opal/mca/pmix/pmix3x/pmix/VERSION
@@ -30,7 +30,7 @@ greek=
 # command, or with the date (if "git describe" fails) in the form of
 # "date<date>".
 
-repo_rev=gitffa464b
+repo_rev=git877b4d8
 
 # If tarball_version is not empty, it is used as the version string in
 # the tarball filename, regardless of all other versions listed in
@@ -44,7 +44,7 @@ tarball_version=
 
 # The date when this release was created
 
-date="Oct 26, 2017"
+date="Oct 30, 2017"
 
 # The shared library version of each of PMIx's public libraries.
 # These versions are maintained in accordance with the "Library
diff --git a/opal/mca/pmix/pmix3x/pmix/config/pmix_setup_zlib.m4 b/opal/mca/pmix/pmix3x/pmix/config/pmix_setup_zlib.m4
index a67f1b7043..5440999eb1 100644
--- a/opal/mca/pmix/pmix3x/pmix/config/pmix_setup_zlib.m4
+++ b/opal/mca/pmix/pmix3x/pmix/config/pmix_setup_zlib.m4
@@ -13,7 +13,7 @@
 # MCA_zlib_CONFIG([action-if-found], [action-if-not-found])
 # --------------------------------------------------------------------
 AC_DEFUN([PMIX_ZLIB_CONFIG],[
-    PMIX_VAR_SCOPE_PUSH([pmix_zlib_dir pmix_zlib_libdir])
+    PMIX_VAR_SCOPE_PUSH([pmix_zlib_dir pmix_zlib_libdir pmix_zlib_standard_lib_location pmix_zlib_standard_header_location])
 
     AC_ARG_WITH([zlib],
                 [AC_HELP_STRING([--with-zlib=DIR],
@@ -24,28 +24,32 @@ AC_DEFUN([PMIX_ZLIB_CONFIG],[
                                 [Search for zlib libraries in DIR ])])
 
     pmix_zlib_support=0
+
     if test "$with_zlib" != "no"; then
         AC_MSG_CHECKING([for zlib in])
         if test ! -z "$with_zlib" && test "$with_zlib" != "yes"; then
             pmix_zlib_dir=$with_zlib
             pmix_zlib_standard_header_location=no
-            if test -d $with_zlib/lib; then
-                pmix_zlib_libdir=$with_zlib/lib
-            elif test -d $with_zlib/lib64; then
-                pmix_zlib_libdir=$with_zlib/lib64
-            else
-                AC_MSG_RESULT([Could not find $with_zlib/lib or $with_zlib/lib64])
-                AC_MSG_ERROR([Can not continue])
-            fi
-            AC_MSG_RESULT([$pmix_zlib_dir and $pmix_zlib_libdir])
+            pmix_zlib_standard_lib_location=no
+            AS_IF([test -z "$with_zlib_libdir" || test "$with_zlib_libdir" = "yes"],
+                  [if test -d $with_zlib/lib; then
+                       pmix_zlib_libdir=$with_zlib/lib
+                   elif test -d $with_zlib/lib64; then
+                       pmix_zlib_libdir=$with_zlib/lib64
+                   else
+                       AC_MSG_RESULT([Could not find $with_zlib/lib or $with_zlib/lib64])
+                       AC_MSG_ERROR([Can not continue])
+                   fi
+                   AC_MSG_RESULT([$pmix_zlib_dir and $pmix_zlib_libdir])],
+                  [AC_MSG_RESULT([$with_zlib_libdir])])
         else
             AC_MSG_RESULT([(default search paths)])
             pmix_zlib_standard_header_location=yes
+            pmix_zlib_standard_lib_location=yes
         fi
         AS_IF([test ! -z "$with_zlib_libdir" && test "$with_zlib_libdir" != "yes"],
               [pmix_zlib_libdir="$with_zlib_libdir"
-               pmix_zlib_standard_lib_location=no],
-              [pmix_zlib_standard_lib_location=yes])
+               pmix_zlib_standard_lib_location=no])
 
         PMIX_CHECK_PACKAGE([pmix_zlib],
                            [zlib.h],
diff --git a/opal/mca/pmix/pmix3x/pmix/src/mca/ptl/base/base.h b/opal/mca/pmix/pmix3x/pmix/src/mca/ptl/base/base.h
index 80bac4e5c3..47215a1e19 100644
--- a/opal/mca/pmix/pmix3x/pmix/src/mca/ptl/base/base.h
+++ b/opal/mca/pmix/pmix3x/pmix/src/mca/ptl/base/base.h
@@ -79,6 +79,7 @@ struct pmix_ptl_globals_t {
     bool listen_thread_active;
     pmix_list_t listeners;
     uint32_t current_tag;
+    size_t max_msg_size;
 };
 typedef struct pmix_ptl_globals_t pmix_ptl_globals_t;
 
diff --git a/opal/mca/pmix/pmix3x/pmix/src/mca/ptl/base/ptl_base_frame.c b/opal/mca/pmix/pmix3x/pmix/src/mca/ptl/base/ptl_base_frame.c
index 705c3f3f3d..7ca906edbc 100644
--- a/opal/mca/pmix/pmix3x/pmix/src/mca/ptl/base/ptl_base_frame.c
+++ b/opal/mca/pmix/pmix3x/pmix/src/mca/ptl/base/ptl_base_frame.c
@@ -59,6 +59,13 @@ int pmix_ptl_base_output = -1;
 
 static int pmix_ptl_register(pmix_mca_base_register_flag_t flags)
 {
+    pmix_ptl_globals.max_msg_size = 8000000;
+    pmix_mca_base_var_register("pmix", "ptl", "base", "max_msg_size",
+                               "Max size (in bytes) of a client/server msg",
+                               PMIX_MCA_BASE_VAR_TYPE_SIZE_T, NULL, 0, 0,
+                               PMIX_INFO_LVL_2,
+                               PMIX_MCA_BASE_VAR_SCOPE_READONLY,
+                               &pmix_ptl_globals.max_msg_size);
     return PMIX_SUCCESS;
 }
 
diff --git a/opal/mca/pmix/pmix3x/pmix/src/mca/ptl/base/ptl_base_sendrecv.c b/opal/mca/pmix/pmix3x/pmix/src/mca/ptl/base/ptl_base_sendrecv.c
index 97149094c9..a657f95880 100644
--- a/opal/mca/pmix/pmix3x/pmix/src/mca/ptl/base/ptl_base_sendrecv.c
+++ b/opal/mca/pmix/pmix3x/pmix/src/mca/ptl/base/ptl_base_sendrecv.c
@@ -44,6 +44,7 @@
 #include "src/client/pmix_client_ops.h"
 #include "src/server/pmix_server_ops.h"
 #include "src/util/error.h"
+#include "src/util/show_help.h"
 
 #include "src/mca/ptl/base/base.h"
 
@@ -459,6 +460,12 @@ void pmix_ptl_base_recv_handler(int sd, short flags, void *cbdata)
                                     "ptl:base:recv:handler allocate data region of size %lu",
                                     (unsigned long)peer->recv_msg->hdr.nbytes);
                 /* allocate the data region */
+                if (pmix_ptl_globals.max_msg_size < peer->recv_msg->hdr.nbytes) {
+                    pmix_show_help("help-pmix-runtime.txt", "ptl:msg_size", true,
+                                   (unsigned long)peer->recv_msg->hdr.nbytes,
+                                   (unsigned long)pmix_ptl_globals.max_msg_size);
+                    goto err_close;
+                }
                 peer->recv_msg->data = (char*)malloc(peer->recv_msg->hdr.nbytes);
                 memset(peer->recv_msg->data, 0, peer->recv_msg->hdr.nbytes);
                 /* point to it */
diff --git a/opal/mca/pmix/pmix3x/pmix/src/runtime/help-pmix-runtime.txt b/opal/mca/pmix/pmix3x/pmix/src/runtime/help-pmix-runtime.txt
index dcd9c1cd69..c1890837bf 100644
--- a/opal/mca/pmix/pmix3x/pmix/src/runtime/help-pmix-runtime.txt
+++ b/opal/mca/pmix/pmix3x/pmix/src/runtime/help-pmix-runtime.txt
@@ -58,3 +58,12 @@ by any of the following:
   that includes at least one usable plugin for this framework.
 
 Please check your installation and environment.
+#
+[ptl:msg_size]
+A received msg header indicates a size that is too large:
+
+  Requested size:  %lu
+  Size limit:      %lu
+
+If you believe this msg is legitimate, please increase the
+max msg size via the ptl_base_max_msg_size parameter.
diff --git a/opal/mca/pmix/pmix3x/pmix/src/util/path.c b/opal/mca/pmix/pmix3x/pmix/src/util/path.c
index 0de2fafef6..ad7e911a46 100644
--- a/opal/mca/pmix/pmix3x/pmix/src/util/path.c
+++ b/opal/mca/pmix/pmix3x/pmix/src/util/path.c
@@ -403,6 +403,7 @@ char* pmix_find_absolute_path( char* app_name )
         char* resolved_path = (char*)malloc(PMIX_PATH_MAX);
         if (NULL == realpath( abs_app_name, resolved_path )) {
             free(resolved_path);
+            free(abs_app_name);
             return NULL;
         }
         if( abs_app_name != app_name ) {
diff --git a/opal/mca/pmix/pmix3x/pmix/src/util/pif.c b/opal/mca/pmix/pmix3x/pmix/src/util/pif.c
index 2f58f0203a..78ca9559ff 100644
--- a/opal/mca/pmix/pmix3x/pmix/src/util/pif.c
+++ b/opal/mca/pmix/pmix3x/pmix/src/util/pif.c
@@ -269,13 +269,13 @@ int16_t pmix_ifaddrtokindex(const char* if_addr)
     for (r = res; r != NULL; r = r->ai_next) {
         PMIX_LIST_FOREACH(intf, &pmix_if_list, pmix_pif_t) {
             if (AF_INET == r->ai_family && AF_INET == intf->af_family) {
-                struct sockaddr ipv4, intv4;
-                memset(&ipv4, 0, sizeof(struct sockaddr));
+                struct sockaddr_in ipv4, intv4;
+                memset(&ipv4, 0, sizeof(struct sockaddr_in));
                 len = (r->ai_addrlen < sizeof(struct sockaddr_in)) ? r->ai_addrlen : sizeof(struct sockaddr_in);
                 memcpy(&ipv4, r->ai_addr, len);
-                memset(&intv4, 0, sizeof(struct sockaddr));
-                memcpy(&intv4, &intf->if_addr, sizeof(struct sockaddr));
-                if (pmix_net_samenetwork(&ipv4, &intv4, intf->if_mask)) {
+                memset(&intv4, 0, sizeof(struct sockaddr_in));
+                memcpy(&intv4, &intf->if_addr, sizeof(struct sockaddr_in));
+                if (pmix_net_samenetwork((struct sockaddr*)&ipv4, (struct sockaddr*)&intv4, intf->if_mask)) {
                     if_kernel_index = intf->if_kernel_index;
                     freeaddrinfo (res);
                     return if_kernel_index;