Skip to content

Commit 9124afb

Browse files
committed
pmix: do not invoke PMIX_INFO_CREATE() with a zero size
Thanks Lisandro Dalcin for the report Fixes #3854 Signed-off-by: Gilles Gouaillardet <[email protected]>
1 parent 4d3e22e commit 9124afb

File tree

7 files changed

+183
-253
lines changed

7 files changed

+183
-253
lines changed

opal/mca/pmix/ext1x/pmix1x_client.c

Lines changed: 28 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -470,17 +470,12 @@ int pmix1_get(const opal_process_name_t *proc, const char *key,
470470
pptr = NULL;
471471
}
472472

473-
if (NULL != info) {
474-
ninfo = opal_list_get_size(info);
475-
if (0 < ninfo) {
476-
PMIX_INFO_CREATE(pinfo, ninfo);
477-
n=0;
478-
OPAL_LIST_FOREACH(ival, info, opal_value_t) {
479-
(void)strncpy(pinfo[n].key, ival->key, PMIX_MAX_KEYLEN);
480-
pmix1_value_load(&pinfo[n].value, ival);
481-
}
482-
} else {
483-
pinfo = NULL;
473+
if (NULL != info && 0 < (ninfo = opal_list_get_size(info))) {
474+
PMIX_INFO_CREATE(pinfo, ninfo);
475+
n=0;
476+
OPAL_LIST_FOREACH(ival, info, opal_value_t) {
477+
(void)strncpy(pinfo[n].key, ival->key, PMIX_MAX_KEYLEN);
478+
pmix1_value_load(&pinfo[n].value, ival);
484479
}
485480
} else {
486481
pinfo = NULL;
@@ -563,15 +558,12 @@ int pmix1_getnb(const opal_process_name_t *proc, const char *key,
563558
op->p.rank = PMIX_RANK_WILDCARD;
564559
}
565560

566-
if (NULL != info) {
567-
op->sz = opal_list_get_size(info);
568-
if (0 < op->sz) {
569-
PMIX_INFO_CREATE(op->info, op->sz);
570-
n=0;
571-
OPAL_LIST_FOREACH(ival, info, opal_value_t) {
572-
(void)strncpy(op->info[n].key, ival->key, PMIX_MAX_KEYLEN);
573-
pmix1_value_load(&op->info[n].value, ival);
574-
}
561+
if (NULL != info && 0 < (op->sz = opal_list_get_size(info))) {
562+
PMIX_INFO_CREATE(op->info, op->sz);
563+
n=0;
564+
OPAL_LIST_FOREACH(ival, info, opal_value_t) {
565+
(void)strncpy(op->info[n].key, ival->key, PMIX_MAX_KEYLEN);
566+
pmix1_value_load(&op->info[n].value, ival);
575567
}
576568
}
577569

@@ -683,8 +675,7 @@ int pmix1_lookup(opal_list_t *data, opal_list_t *info)
683675
(void)strncpy(pdata[n++].key, d->value.key, PMIX_MAX_KEYLEN);
684676
}
685677

686-
if (NULL != info) {
687-
ninfo = opal_list_get_size(info);
678+
if (NULL != info && (0 < (ninfo = opal_list_get_size(info)))) {
688679
PMIX_INFO_CREATE(pinfo, ninfo);
689680
n=0;
690681
OPAL_LIST_FOREACH(iptr, info, opal_value_t) {
@@ -832,16 +823,13 @@ int pmix1_lookupnb(char **keys, opal_list_t *info,
832823
op->lkcbfunc = cbfunc;
833824
op->cbdata = cbdata;
834825

835-
if (NULL != info) {
836-
op->sz = opal_list_get_size(info);
837-
if (0 < op->sz) {
838-
PMIX_INFO_CREATE(op->info, op->sz);
839-
n=0;
840-
OPAL_LIST_FOREACH(iptr, info, opal_value_t) {
841-
(void)strncpy(op->info[n].key, iptr->key, PMIX_MAX_KEYLEN);
842-
pmix1_value_load(&op->info[n].value, iptr);
843-
++n;
844-
}
826+
if (NULL != info && 0 < (op->sz = opal_list_get_size(info))) {
827+
PMIX_INFO_CREATE(op->info, op->sz);
828+
n=0;
829+
OPAL_LIST_FOREACH(iptr, info, opal_value_t) {
830+
(void)strncpy(op->info[n].key, iptr->key, PMIX_MAX_KEYLEN);
831+
pmix1_value_load(&op->info[n].value, iptr);
832+
++n;
845833
}
846834
}
847835

@@ -857,8 +845,7 @@ int pmix1_unpublish(char **keys, opal_list_t *info)
857845
pmix_info_t *pinfo;
858846
opal_value_t *iptr;
859847

860-
if (NULL != info) {
861-
ninfo = opal_list_get_size(info);
848+
if (NULL != info && 0 < (ninfo = opal_list_get_size(info))) {
862849
PMIX_INFO_CREATE(pinfo, ninfo);
863850
n=0;
864851
OPAL_LIST_FOREACH(iptr, info, opal_value_t) {
@@ -890,16 +877,13 @@ int pmix1_unpublishnb(char **keys, opal_list_t *info,
890877
op->opcbfunc = cbfunc;
891878
op->cbdata = cbdata;
892879

893-
if (NULL != info) {
894-
op->sz = opal_list_get_size(info);
895-
if (0 < op->sz) {
896-
PMIX_INFO_CREATE(op->info, op->sz);
897-
n=0;
898-
OPAL_LIST_FOREACH(iptr, info, opal_value_t) {
899-
(void)strncpy(op->info[n].key, iptr->key, PMIX_MAX_KEYLEN);
900-
pmix1_value_load(&op->info[n].value, iptr);
901-
++n;
902-
}
880+
if (NULL != info && 0 < (op->sz = opal_list_get_size(info))) {
881+
PMIX_INFO_CREATE(op->info, op->sz);
882+
n=0;
883+
OPAL_LIST_FOREACH(iptr, info, opal_value_t) {
884+
(void)strncpy(op->info[n].key, iptr->key, PMIX_MAX_KEYLEN);
885+
pmix1_value_load(&op->info[n].value, iptr);
886+
++n;
903887
}
904888
}
905889

opal/mca/pmix/ext1x/pmix1x_server_south.c

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -139,8 +139,7 @@ int pmix1_server_init(opal_pmix_server_module_t *module,
139139
}
140140

141141
/* convert the list to an array of pmix_info_t */
142-
if (NULL != info) {
143-
sz = opal_list_get_size(info);
142+
if (NULL != info && 0 < (sz = opal_list_get_size(info))) {
144143
PMIX_INFO_CREATE(pinfo, sz);
145144
n = 0;
146145
OPAL_LIST_FOREACH(kv, info, opal_value_t) {
@@ -248,8 +247,7 @@ int pmix1_server_register_nspace(opal_jobid_t jobid,
248247
opal_list_append(&mca_pmix_ext1x_component.jobids, &job->super);
249248

250249
/* convert the list to an array of pmix_info_t */
251-
if (NULL != info) {
252-
sz = opal_list_get_size(info);
250+
if (NULL != info && 0 < (sz = opal_list_get_size(info))) {
253251
PMIX_INFO_CREATE(pinfo, sz);
254252
n = 0;
255253
OPAL_LIST_FOREACH(kv, info, opal_value_t) {
@@ -260,14 +258,16 @@ int pmix1_server_register_nspace(opal_jobid_t jobid,
260258
* that list to another array */
261259
pmapinfo = (opal_list_t*)kv->data.ptr;
262260
szmap = opal_list_get_size(pmapinfo);
263-
PMIX_INFO_CREATE(pmap, szmap);
264-
pinfo[n].value.data.array.array = (struct pmix_info_t*)pmap;
265-
pinfo[n].value.data.array.size = szmap;
266-
m = 0;
267-
OPAL_LIST_FOREACH(k2, pmapinfo, opal_value_t) {
268-
(void)strncpy(pmap[m].key, k2->key, PMIX_MAX_KEYLEN);
269-
pmix1_value_load(&pmap[m].value, k2);
270-
++m;
261+
if (0 < szmap) {
262+
PMIX_INFO_CREATE(pmap, szmap);
263+
pinfo[n].value.data.array.array = (struct pmix_info_t*)pmap;
264+
pinfo[n].value.data.array.size = szmap;
265+
m = 0;
266+
OPAL_LIST_FOREACH(k2, pmapinfo, opal_value_t) {
267+
(void)strncpy(pmap[m].key, k2->key, PMIX_MAX_KEYLEN);
268+
pmix1_value_load(&pmap[m].value, k2);
269+
++m;
270+
}
271271
}
272272
OPAL_LIST_RELEASE(pmapinfo);
273273
} else {
@@ -429,8 +429,7 @@ int pmix1_server_notify_error(int status,
429429
op->cbdata = cbdata;
430430

431431
/* convert the list to an array of pmix_info_t */
432-
if (NULL != info) {
433-
sz = opal_list_get_size(info);
432+
if (NULL != info && 0 < (sz = opal_list_get_size(info))) {
434433
PMIX_INFO_CREATE(pinfo, sz);
435434
n = 0;
436435
OPAL_LIST_FOREACH(kv, info, opal_value_t) {

opal/mca/pmix/ext2x/pmix2x.c

Lines changed: 33 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -190,17 +190,14 @@ static void return_local_event_hdlr(int status, opal_list_t *results,
190190
if (NULL != cd->pmixcbfunc) {
191191
op = OBJ_NEW(ext2x_opcaddy_t);
192192

193-
if (NULL != results) {
194-
/* convert the list of results to an array of info */
195-
op->ninfo = opal_list_get_size(results);
196-
if (0 < op->ninfo) {
197-
PMIX_INFO_CREATE(op->info, op->ninfo);
198-
n=0;
199-
OPAL_LIST_FOREACH(kv, cd->info, opal_value_t) {
200-
(void)strncpy(op->info[n].key, kv->key, PMIX_MAX_KEYLEN);
201-
ext2x_value_load(&op->info[n].value, kv);
202-
++n;
203-
}
193+
if (NULL != results && 0 < (op->ninfo = opal_list_get_size(results))) {
194+
/* convert the list of results to an array of info */
195+
PMIX_INFO_CREATE(op->info, op->ninfo);
196+
n=0;
197+
OPAL_LIST_FOREACH(kv, cd->info, opal_value_t) {
198+
(void)strncpy(op->info[n].key, kv->key, PMIX_MAX_KEYLEN);
199+
ext2x_value_load(&op->info[n].value, kv);
200+
++n;
204201
}
205202
}
206203
/* convert the status */
@@ -811,13 +808,17 @@ void ext2x_value_load(pmix_value_t *v,
811808
v->data.darray = (pmix_data_array_t*)malloc(sizeof(pmix_data_array_t));
812809
v->data.darray->type = PMIX_INFO;
813810
v->data.darray->size = opal_list_get_size(list);
814-
PMIX_INFO_CREATE(info, v->data.darray->size);
815-
v->data.darray->array = info;
816-
n=0;
817-
OPAL_LIST_FOREACH(val, list, opal_value_t) {
818-
(void)strncpy(info[n].key, val->key, PMIX_MAX_KEYLEN);
819-
ext2x_value_load(&info[n].value, val);
820-
++n;
811+
if (0 < v->data.darray->size) {
812+
PMIX_INFO_CREATE(info, v->data.darray->size);
813+
v->data.darray->array = info;
814+
n=0;
815+
OPAL_LIST_FOREACH(val, list, opal_value_t) {
816+
(void)strncpy(info[n].key, val->key, PMIX_MAX_KEYLEN);
817+
ext2x_value_load(&info[n].value, val);
818+
++n;
819+
}
820+
} else {
821+
v->data.darray->array = NULL;
821822
}
822823
break;
823824
default:
@@ -1062,16 +1063,13 @@ static void register_handler(opal_list_t *event_codes,
10621063
}
10631064

10641065
/* convert the list of info to an array of pmix_info_t */
1065-
if (NULL != info) {
1066-
op->ninfo = opal_list_get_size(info);
1067-
if (0 < op->ninfo) {
1068-
PMIX_INFO_CREATE(op->info, op->ninfo);
1069-
n=0;
1070-
OPAL_LIST_FOREACH(kv, info, opal_value_t) {
1071-
(void)strncpy(op->info[n].key, kv->key, PMIX_MAX_KEYLEN);
1072-
ext2x_value_load(&op->info[n].value, kv);
1073-
++n;
1074-
}
1066+
if (NULL != info && 0 < (op->ninfo = opal_list_get_size(info))) {
1067+
PMIX_INFO_CREATE(op->info, op->ninfo);
1068+
n=0;
1069+
OPAL_LIST_FOREACH(kv, info, opal_value_t) {
1070+
(void)strncpy(op->info[n].key, kv->key, PMIX_MAX_KEYLEN);
1071+
ext2x_value_load(&op->info[n].value, kv);
1072+
++n;
10751073
}
10761074
}
10771075

@@ -1176,16 +1174,13 @@ static int notify_event(int status,
11761174
prange = ext2x_convert_opalrange(range);
11771175

11781176
/* convert the list of info */
1179-
if (NULL != info) {
1180-
op->ninfo = opal_list_get_size(info);
1181-
if (0 < op->ninfo) {
1182-
PMIX_INFO_CREATE(op->info, op->ninfo);
1183-
n=0;
1184-
OPAL_LIST_FOREACH(kv, info, opal_value_t) {
1185-
(void)strncpy(op->info[n].key, kv->key, PMIX_MAX_KEYLEN);
1186-
ext2x_value_load(&op->info[n].value, kv);
1187-
++n;
1188-
}
1177+
if (NULL != info && 0 < (op->ninfo = opal_list_get_size(info))) {
1178+
PMIX_INFO_CREATE(op->info, op->ninfo);
1179+
n=0;
1180+
OPAL_LIST_FOREACH(kv, info, opal_value_t) {
1181+
(void)strncpy(op->info[n].key, kv->key, PMIX_MAX_KEYLEN);
1182+
ext2x_value_load(&op->info[n].value, kv);
1183+
++n;
11891184
}
11901185
}
11911186

0 commit comments

Comments
 (0)