From 37e9e2c660d949748f034bc0b4fcaade1913e355 Mon Sep 17 00:00:00 2001 From: Nathan Hjelm Date: Mon, 23 May 2016 12:21:34 -0600 Subject: [PATCH] mca/base: fix typo in flag enumeration This commit fixes a typo in flag enumeration that can cause the parser to miss valid flags or crash. Signed-off-by: Nathan Hjelm --- opal/mca/base/mca_base_var.c | 2 +- opal/mca/base/mca_base_var_enum.c | 19 +++++++++++++------ 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/opal/mca/base/mca_base_var.c b/opal/mca/base/mca_base_var.c index 5322433a43..e8866f7df5 100644 --- a/opal/mca/base/mca_base_var.c +++ b/opal/mca/base/mca_base_var.c @@ -688,7 +688,7 @@ static int var_set_from_string (mca_base_var_t *var, char *src) case MCA_BASE_VAR_TYPE_BOOL: case MCA_BASE_VAR_TYPE_SIZE_T: ret = int_from_string(src, var->mbv_enumerator, &int_value); - if (OPAL_ERR_VALUE_OUT_OF_BOUNDS == ret || + if (OPAL_SUCCESS != ret || (MCA_BASE_VAR_TYPE_INT == var->mbv_type && ((int) int_value != (int64_t) int_value)) || (MCA_BASE_VAR_TYPE_UNSIGNED_INT == var->mbv_type && ((unsigned int) int_value != int_value))) { if (var->mbv_enumerator) { diff --git a/opal/mca/base/mca_base_var_enum.c b/opal/mca/base/mca_base_var_enum.c index b261c50115..5f0d80ccbf 100644 --- a/opal/mca/base/mca_base_var_enum.c +++ b/opal/mca/base/mca_base_var_enum.c @@ -494,21 +494,28 @@ static int enum_value_from_string_flag (mca_base_var_enum_t *self, const char *s bool found = false, conflict = false; for (int j = 0 ; j < count ; ++j) { - if ((is_int && (value == flag_enum->enum_flags[i].flag)) || - 0 == strcasecmp (flags[i], flag_enum->enum_flags[i].string)) { + if ((is_int && (value & flag_enum->enum_flags[j].flag)) || + 0 == strcasecmp (flags[i], flag_enum->enum_flags[j].string)) { found = true; - if (flag & flag_enum->enum_flags[i].conflicting_flag) { + if (flag & flag_enum->enum_flags[j].conflicting_flag) { conflict = true; } else { - flag |= flag_enum->enum_flags[i].flag; + flag |= flag_enum->enum_flags[j].flag; } - break; + if (is_int) { + value &= ~flag_enum->enum_flags[j].flag; + if (0 == value) { + break; + } + } else { + break; + } } } - if (!found || conflict) { + if (!found || conflict || (is_int && value)) { opal_argv_free (flags); return !found ? OPAL_ERR_VALUE_OUT_OF_BOUNDS : OPAL_ERR_BAD_PARAM; }