Skip to content

Commit 84e1425

Browse files
author
rhc54
committed
Merge pull request #1772 from rhc54/topic/strnlen
Abstract the strnlen function for environments that do not have it (e.g., Solaris 10)
2 parents 95ecae8 + 8fa9355 commit 84e1425

File tree

4 files changed

+62
-12
lines changed

4 files changed

+62
-12
lines changed

opal/mca/pmix/pmix114/pmix/config/pmix.m4

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ dnl Copyright (c) 2009 Los Alamos National Security, LLC. All rights
1717
dnl reserved.
1818
dnl Copyright (c) 2009-2011 Oak Ridge National Labs. All rights reserved.
1919
dnl Copyright (c) 2011-2013 NVIDIA Corporation. All rights reserved.
20-
dnl Copyright (c) 2013-2015 Intel, Inc. All rights reserved
20+
dnl Copyright (c) 2013-2016 Intel, Inc. All rights reserved
2121
dnl Copyright (c) 2015 Research Organization for Information Science
2222
dnl and Technology (RIST). All rights reserved.
2323
dnl Copyright (c) 2016 Mellanox Technologies, Inc.
@@ -495,7 +495,7 @@ AC_DEFUN([PMIX_SETUP_CORE],[
495495
# Darwin doesn't need -lm, as it's a symlink to libSystem.dylib
496496
PMIX_SEARCH_LIBS_CORE([ceil], [m])
497497

498-
AC_CHECK_FUNCS([asprintf snprintf vasprintf vsnprintf strsignal socketpair strncpy_s usleep getpeereid])
498+
AC_CHECK_FUNCS([asprintf snprintf vasprintf vsnprintf strsignal socketpair strncpy_s usleep getpeereid strnlen])
499499

500500
# On some hosts, htonl is a define, so the AC_CHECK_FUNC will get
501501
# confused. On others, it's in the standard library, but stubbed with

opal/mca/pmix/pmix114/pmix/src/server/pmix_server_listener.c

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
#include "src/util/output.h"
5757
#include "src/util/pmix_environ.h"
5858
#include "src/util/progress_threads.h"
59+
#include "src/util/strnlen.h"
5960
#include "src/usock/usock.h"
6061
#include "src/sec/pmix_sec.h"
6162

@@ -315,31 +316,41 @@ static pmix_status_t parse_connect_ack (char *msg, int len,
315316
char **nspace, int *rank,
316317
char **version, char **cred)
317318
{
318-
if ((int)strnlen (msg, len) < len) {
319+
int msglen;
320+
321+
PMIX_STRNLEN(msglen, msg, len);
322+
if (msglen < len) {
319323
*nspace = msg;
320324
msg += strlen(*nspace) + 1;
321325
len -= strlen(*nspace) + 1;
322-
} else
326+
} else {
323327
return PMIX_ERR_BAD_PARAM;
328+
}
324329

325-
if ((int)sizeof(int) <= len) {
330+
PMIX_STRNLEN(msglen, msg, len);
331+
if (msglen <= len) {
326332
*rank = *(int *)msg;
327333
msg += sizeof(int);
328334
len -= sizeof(int);
329-
} else
335+
} else {
330336
return PMIX_ERR_BAD_PARAM;
337+
}
331338

332-
if ((int)strnlen (msg, len) < len) {
339+
PMIX_STRNLEN(msglen, msg, len);
340+
if (msglen < len) {
333341
*version = msg;
334342
msg += strlen(*version) + 1;
335343
len -= strlen(*version) + 1;
336-
} else
344+
} else {
337345
return PMIX_ERR_BAD_PARAM;
346+
}
338347

339-
if ((int)strnlen (msg, len) < len)
348+
PMIX_STRNLEN(msglen, msg, len);
349+
if (msglen < len)
340350
*cred = msg;
341-
else
351+
else {
342352
*cred = NULL;
353+
}
343354

344355
return PMIX_SUCCESS;
345356
}

opal/mca/pmix/pmix114/pmix/src/util/Makefile.am

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
# Copyright (c) 2007-2010 Cisco Systems, Inc. All rights reserved.
1313
# Copyright (c) 2013 NVIDIA Corporation. All rights reserved.
1414
# Copyright (c) 2013 Intel, Inc. All rights reserved
15-
# Copyright (c) 2013-2015 Intel, Inc. All rights reserved
15+
# Copyright (c) 2013-2016 Intel, Inc. All rights reserved
1616
# $COPYRIGHT$
1717
#
1818
# Additional copyrights may follow
@@ -34,7 +34,8 @@ headers += \
3434
src/util/timings.h \
3535
src/util/os_path.h \
3636
src/util/basename.h \
37-
src/util/hash.h
37+
src/util/hash.h \
38+
src/util/strnlen.h
3839

3940
sources += \
4041
src/util/argv.c \
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*
2+
* Copyright (c) 2016 Intel, Inc. All rights reserved.
3+
* $COPYRIGHT$
4+
*
5+
* Additional copyrights may follow
6+
*
7+
* $HEADER$
8+
*/
9+
10+
/** @file
11+
*
12+
* Buffer strnlen function for portability to archaic platforms.
13+
*/
14+
15+
#ifndef PMIX_STRNLEN_H
16+
#define PMIX_STRNLEN_H
17+
18+
#include <src/include/pmix_config.h>
19+
20+
#if defined(HAVE_STRNLEN)
21+
#define PMIX_STRNLEN(c, a, b) \
22+
(c) = (int)strnlen(a, b)
23+
#else
24+
#define PMIX_STRNLEN(c, a, b) \
25+
do { \
26+
int _x; \
27+
(c) = 0; \
28+
for (_x=0; _x < (b); _x++) { \
29+
if ('\0' == (a)[_x]) { \
30+
break; \
31+
} \
32+
++(c); \
33+
} \
34+
} while(0)
35+
#endif
36+
37+
#endif /* PMIX_STRNLEN_H */
38+

0 commit comments

Comments
 (0)