1
1

Remove a sketchy use of asprintf() passing a union by value.

The original code was passing a union by value, and doing odd things
on Solaris/SPARC (where "odd" rhymes with "SIGBUS").  Replace it with
an exploded switch/case block for all the enum values.  Also use the
string literals so that we get compiler checking of the format string
vs. the type of the actual arguments.

cmr=v1.7.4:revier=hjelmn:subject=Fix MCA base var to not pass union by value

This commit was SVN r30276.
Этот коммит содержится в:
Jeff Squyres 2014-01-13 22:24:14 +00:00
родитель 91c4890886
Коммит e3f818ba87

Просмотреть файл

@ -80,17 +80,6 @@ const char *var_type_names[] = {
"double"
};
const char *var_type_formats[] = {
"%d",
"%u",
"%lu",
"%llu",
"%" PRIsize_t,
"%s",
"%d",
"%lf"
};
const size_t var_type_sizes[] = {
sizeof (int),
sizeof (unsigned),
@ -1688,10 +1677,35 @@ static int var_value_string (mca_base_var_t *var, char **value_string)
}
if (NULL == var->mbv_enumerator) {
if (MCA_BASE_VAR_TYPE_STRING == var->mbv_type) {
ret = asprintf (value_string, "%s", value->stringval ? value->stringval : "");
} else {
ret = asprintf (value_string, var_type_formats[var->mbv_type], value[0]);
switch (var->mbv_type) {
case MCA_BASE_VAR_TYPE_INT:
ret = asprintf (value_string, "%d", value->intval);
break;
case MCA_BASE_VAR_TYPE_UNSIGNED_INT:
ret = asprintf (value_string, "%u", value->uintval);
break;
case MCA_BASE_VAR_TYPE_UNSIGNED_LONG:
ret = asprintf (value_string, "%lu", value->ulval);
break;
case MCA_BASE_VAR_TYPE_UNSIGNED_LONG_LONG:
ret = asprintf (value_string, "%llu", value->ullval);
break;
case MCA_BASE_VAR_TYPE_SIZE_T:
ret = asprintf (value_string, "%" PRIsize_t, value->sizetval);
break;
case MCA_BASE_VAR_TYPE_STRING:
ret = asprintf (value_string, "%s",
value->stringval ? value->stringval : "");
break;
case MCA_BASE_VAR_TYPE_BOOL:
ret = asprintf (value_string, "%d", value->boolval);
break;
case MCA_BASE_VAR_TYPE_DOUBLE:
ret = asprintf (value_string, "%lf", value->lfval);
break;
default:
ret = -1;
break;
}
ret = (0 > ret) ? OPAL_ERR_OUT_OF_RESOURCE : OPAL_SUCCESS;