diff --git a/src/box/alter.cc b/src/box/alter.cc index 0683cfe2aa1ce7ef4f6d64f9546a71cbd14eadf2..09c26eec5798fc0a6725d44447149fa03f2026cb 100644 --- a/src/box/alter.cc +++ b/src/box/alter.cc @@ -460,7 +460,7 @@ space_def_new_from_tuple(struct tuple *tuple, uint32_t errcode, return NULL; struct field_def *fields = NULL; uint32_t field_count; - if (field_def_array_decode(format, &field_count, region, &fields) != 0) + if (field_def_array_decode(&format, &fields, &field_count, region) != 0) return NULL; if (exact_field_count != 0 && exact_field_count < field_count) { diff --git a/src/box/field_def.c b/src/box/field_def.c index fb62cd7ce620ac404715b7f2bf53332e5ef7d53b..313b194e5a3324047d9ebaefefac88dd65c48fa0 100644 --- a/src/box/field_def.c +++ b/src/box/field_def.c @@ -372,13 +372,16 @@ field_def_decode(struct field_def *field, const char **data, } int -field_def_array_decode(const char *data, uint32_t *out_count, - struct region *region, struct field_def **fields) +field_def_array_decode(const char **data, struct field_def **fields, + uint32_t *field_count, struct region *region) { - /* Type is checked by _space format. */ - assert(mp_typeof(*data) == MP_ARRAY); - uint32_t count = mp_decode_array(&data); - *out_count = count; + if (mp_typeof(**data) != MP_ARRAY) { + diag_set(ClientError, ER_WRONG_SPACE_FORMAT, + "expected an array"); + return -1; + } + uint32_t count = mp_decode_array(data); + *field_count = count; if (count == 0) { *fields = NULL; return 0; @@ -393,8 +396,7 @@ field_def_array_decode(const char *data, uint32_t *out_count, return -1; } for (uint32_t i = 0; i < count; ++i) { - if (field_def_decode(®ion_defs[i], &data, - i, region) != 0) + if (field_def_decode(®ion_defs[i], data, i, region) != 0) return -1; } *fields = region_defs; diff --git a/src/box/field_def.h b/src/box/field_def.h index 7abc6304adb27fbebf739236275caeea60ee00b7..70c57222404c8ab1b5e87a54bf06b9781a1d864e 100644 --- a/src/box/field_def.h +++ b/src/box/field_def.h @@ -202,16 +202,15 @@ action_is_nullable(enum on_conflict_action nullable_action) /** * Decode MessagePack array of fields. - * @param data MessagePack array of fields. - * @param[out] out_count Length of a result array. - * @param region Region to allocate result array. + * @param[inout] data MessagePack array of fields. * @param[out] fields Array of fields. - * + * @param[out] field_count Length of a result array. + * @param region Region to allocate result array. * @retval Error code. */ int -field_def_array_decode(const char *data, uint32_t *out_count, - struct region *region, struct field_def **fields); +field_def_array_decode(const char **data, struct field_def **fields, + uint32_t *field_count, struct region *region); /** * Duplicates array of fields using malloc. Never fails.