slurmrestd - Prevent fatal_abort when parsing a non-empty group id
PARSE_FUNC(GROUP_ID) used the return value of
data_convert_type(src, DATA_TYPE_NONE) expecting it to return all possible
data types. However, this function never returns DATA_TYPE_STRING because
it doesn't attempt to convert the data_t to that type. This lead to
PARSE_FUNC(GROUP_ID) believing the data type was DATA_TYPE_NONE causing a
fatal_abort().
This patch makes it so data_convert_type always returns the current type of
the data_t.
Ticket: 23400
Changelog: slurmrestd - Prevent triggering a fatal abort when parsing a
non-empty group id string. This affects all endpoints with request bodies
containing openapi_meta_client group field. It also affects the following
endpoints:
'GET /slurmdb/v0.0.4*/jobs'
'POST /slurm/v0.0.4*/job/submit'
'POST /slurm/v0.0.4*/job/{job_id}'
'POST /slurm/v0.0.4*/job/allocate'
diff --git a/src/common/data.c b/src/common/data.c
index ef86168..500c4ab 100644
--- a/src/common/data.c
+++ b/src/common/data.c
@@ -1890,37 +1890,29 @@
switch (match) {
case DATA_TYPE_STRING:
- return _convert_data_string(data) ? DATA_TYPE_NONE :
- DATA_TYPE_STRING;
+ (void) _convert_data_string(data);
+ break;
case DATA_TYPE_BOOL:
- return _convert_data_force_bool(data) ? DATA_TYPE_NONE :
- DATA_TYPE_BOOL;
+ (void) _convert_data_force_bool(data);
+ break;
case DATA_TYPE_INT_64:
- return _convert_data_int(data, true) ? DATA_TYPE_NONE :
- DATA_TYPE_INT_64;
+ (void) _convert_data_int(data, true);
+ break;
case DATA_TYPE_FLOAT:
- return _convert_data_float(data) ? DATA_TYPE_NONE :
- DATA_TYPE_FLOAT;
+ (void) _convert_data_float(data);
+ break;
case DATA_TYPE_NULL:
- return _convert_data_null(data) ? DATA_TYPE_NONE :
- DATA_TYPE_NULL;
+ (void) _convert_data_null(data);
+ break;
case DATA_TYPE_NONE:
- if (!_convert_data_null(data))
- return DATA_TYPE_NULL;
+ /* If a conversion succeeds skip calling the others */
+ if (!_convert_data_null(data) ||
+ !_convert_data_int(data, false) ||
+ !_convert_data_float(data) ||
+ !_convert_data_int(data, true) || !_convert_data_bool(data))
+ ; /* blank on purpose */
- if (!_convert_data_int(data, false))
- return DATA_TYPE_INT_64;
-
- if (!_convert_data_float(data))
- return DATA_TYPE_FLOAT;
-
- if (!_convert_data_int(data, true))
- return DATA_TYPE_INT_64;
-
- if (!_convert_data_bool(data))
- return DATA_TYPE_BOOL;
-
- return DATA_TYPE_NONE;
+ break;
case DATA_TYPE_DICT:
if (data->type == TYPE_DICT)
return DATA_TYPE_DICT;
@@ -1929,7 +1921,7 @@
return DATA_TYPE_DICT;
/* data_parser should be used for this conversion instead. */
- return DATA_TYPE_NONE;
+ break;
case DATA_TYPE_LIST:
if (data->type == TYPE_LIST)
return DATA_TYPE_LIST;
@@ -1938,12 +1930,14 @@
return DATA_TYPE_LIST;
/* data_parser should be used for this conversion instead. */
- return DATA_TYPE_NONE;
+ break;
case DATA_TYPE_MAX:
fatal_abort("%s: unexpected data type", __func__);
+ default:
+ fatal_abort("%s: invalid conversion requested", __func__);
}
- fatal_abort("%s: invalid conversion requested", __func__);
+ return data_get_type(data);
}
static data_for_each_cmd_t _convert_list_entry(data_t *data, void *arg)
diff --git a/src/common/data.h b/src/common/data.h
index 2377686..eb4cfb6 100644
--- a/src/common/data.h
+++ b/src/common/data.h
@@ -282,7 +282,7 @@
* IN data structure to try to type and convert
* IN match try to detect this type only
* or DATA_TYPE_NONE to give best guess as to data type
- * RET new data type or DATA_TYPE_NONE on no change
+ * RET (new or unchanged) data type of data
*/
extern data_type_t data_convert_type(data_t *data, const data_type_t match);