From a85502d98221974d90feab27db9453b0d2cc16eb Mon Sep 17 00:00:00 2001
From: Vladimir Davydov <vdavydov@tarantool.org>
Date: Wed, 23 Aug 2023 15:27:09 +0300
Subject: [PATCH] msgpack: remove dead code handling invalid MP_EXT

We have a few functions that decode MsgPack data assuming it was
previously checked with mp_check(). This means it's safe to expect
that MP_EXT contains valid data because we install a custom checker
for MP_EXT in msgpack_init. So let's replace errors with assertions,
removing the dead code.

NO_DOC=code cleanup
NO_TEST=code cleanup
NO_CHANGELOG=code cleanup
---
 src/box/bind.c    | 27 +++++--------------
 src/box/sql/mem.c | 67 +++++++++--------------------------------------
 src/lua/msgpack.c | 20 +++-----------
 3 files changed, 24 insertions(+), 90 deletions(-)

diff --git a/src/box/bind.c b/src/box/bind.c
index 579659ad6c..5d26f86b74 100644
--- a/src/box/bind.c
+++ b/src/box/bind.c
@@ -108,32 +108,19 @@ sql_bind_decode(struct sql_bind *bind, int i, const char **packet)
 		uint32_t size = mp_decode_extl(packet, &ext_type);
 		switch (ext_type) {
 		case MP_UUID:
-			if (uuid_unpack(packet, size, &bind->uuid) == NULL) {
-				diag_set(ClientError, ER_INVALID_MSGPACK,
-					 "Invalid MP_UUID MsgPack format");
-				return -1;
-			}
+			VERIFY(uuid_unpack(packet, size, &bind->uuid) != NULL);
 			break;
 		case MP_DECIMAL:
-			if (decimal_unpack(packet, size, &bind->dec) == NULL) {
-				diag_set(ClientError, ER_INVALID_MSGPACK,
-					 "Invalid MP_DECIMAL MsgPack format");
-				return -1;
-			}
+			VERIFY(decimal_unpack(packet, size,
+					      &bind->dec) != NULL);
 			break;
 		case MP_DATETIME:
-			if (datetime_unpack(packet, size, &bind->dt) == NULL) {
-				diag_set(ClientError, ER_INVALID_MSGPACK,
-					 "Invalid MP_DATETIME MsgPack format");
-				return -1;
-			}
+			VERIFY(datetime_unpack(packet, size,
+					       &bind->dt) != NULL);
 			break;
 		case MP_INTERVAL:
-			if (interval_unpack(packet, size, &bind->itv) == NULL) {
-				diag_set(ClientError, ER_INVALID_MSGPACK,
-					 "Invalid MP_INTERVAL MsgPack format");
-				return -1;
-			}
+			VERIFY(interval_unpack(packet, size,
+					       &bind->itv) != NULL);
 			break;
 		default:
 			diag_set(ClientError, ER_SQL_BIND_TYPE, "USERDATA",
diff --git a/src/box/sql/mem.c b/src/box/sql/mem.c
index aa46d551ff..4e1ad4188b 100644
--- a/src/box/sql/mem.c
+++ b/src/box/sql/mem.c
@@ -2728,21 +2728,15 @@ mem_cmp_msgpack(const struct Mem *a, const char **b, int *result,
 		if (type == MP_UUID) {
 			assert(len == UUID_LEN);
 			mem.type = MEM_TYPE_UUID;
-			if (uuid_unpack(b, len, &mem.u.uuid) == NULL)
-				return -1;
+			VERIFY(uuid_unpack(b, len, &mem.u.uuid) != NULL);
 			break;
 		} else if (type == MP_DECIMAL) {
 			mem.type = MEM_TYPE_DEC;
-			if (decimal_unpack(b, len, &mem.u.d) == 0)
-				return -1;
+			VERIFY(decimal_unpack(b, len, &mem.u.d) != NULL);
 			break;
 		} else if (type == MP_DATETIME) {
 			mem.type = MEM_TYPE_DATETIME;
-			if (datetime_unpack(b, len, &mem.u.dt) == 0) {
-				diag_set(ClientError, ER_INVALID_MSGPACK,
-					 "Invalid MP_DATETIME MsgPack format");
-				return -1;
-			}
+			VERIFY(datetime_unpack(b, len, &mem.u.dt) != NULL);
 			break;
 		} else if (type == MP_INTERVAL) {
 			diag_set(ClientError, ER_SQL_TYPE_MISMATCH, mp_str(*b),
@@ -3043,37 +3037,23 @@ mem_from_mp_ephemeral(struct Mem *mem, const char *buf, uint32_t *len)
 		uint32_t size = mp_decode_extl(&buf, &type);
 		if (type == MP_UUID) {
 			assert(size == UUID_LEN);
-			buf = svp;
-			if (mp_decode_uuid(&buf, &mem->u.uuid) == NULL) {
-				diag_set(ClientError, ER_INVALID_MSGPACK,
-					 "Invalid MP_UUID MsgPack format");
-				return -1;
-			}
+			VERIFY(uuid_unpack(&buf, size, &mem->u.uuid) != NULL);
 			mem->type = MEM_TYPE_UUID;
 			mem->flags = 0;
 			break;
 		} else if (type == MP_DECIMAL) {
-			buf = svp;
-			if (mp_decode_decimal(&buf, &mem->u.d) == NULL)
-				return -1;
+			VERIFY(decimal_unpack(&buf, size, &mem->u.d) != NULL);
 			mem->type = MEM_TYPE_DEC;
 			mem->flags = 0;
 			break;
 		} else if (type == MP_DATETIME) {
-			if (datetime_unpack(&buf, size, &mem->u.dt) == NULL) {
-				diag_set(ClientError, ER_INVALID_MSGPACK,
-					 "Invalid MP_DATETIME MsgPack format");
-				return -1;
-			}
+			VERIFY(datetime_unpack(&buf, size, &mem->u.dt) != NULL);
 			mem->type = MEM_TYPE_DATETIME;
 			mem->flags = 0;
 			break;
 		} else if (type == MP_INTERVAL) {
-			if (interval_unpack(&buf, size, &mem->u.itv) == NULL) {
-				diag_set(ClientError, ER_INVALID_MSGPACK,
-					 "Invalid MP_INTERVAL MsgPack format");
-				return -1;
-			}
+			VERIFY(interval_unpack(&buf, size,
+					       &mem->u.itv) != NULL);
 			mem->type = MEM_TYPE_INTERVAL;
 			mem->flags = 0;
 			break;
@@ -3686,44 +3666,23 @@ port_c_get_vdbemem(struct port *base, uint32_t *size)
 			if (type == MP_UUID) {
 				assert(len == UUID_LEN);
 				struct tt_uuid *uuid = &val[i].u.uuid;
-				data = str;
-				if (mp_decode_uuid(&data, uuid) == NULL) {
-					diag_set(ClientError,
-						 ER_INVALID_MSGPACK, "Invalid "
-						 "MP_UUID MsgPack format");
-					goto error;
-				}
+				VERIFY(uuid_unpack(&data, len, uuid) != NULL);
 				val[i].type = MEM_TYPE_UUID;
 				break;
 			} else if (type == MP_DECIMAL) {
 				decimal_t *d = &val[i].u.d;
-				data = str;
-				if (mp_decode_decimal(&data, d) == NULL) {
-					diag_set(ClientError,
-						 ER_INVALID_MSGPACK, "Invalid "
-						 "MP_DECIMAL MsgPack format");
-					goto error;
-				}
+				VERIFY(decimal_unpack(&data, len, d) != NULL);
 				val[i].type = MEM_TYPE_DEC;
 				break;
 			} else if (type == MP_DATETIME) {
 				struct datetime *dt = &val[i].u.dt;
-				if (datetime_unpack(&data, len, dt) == 0) {
-					diag_set(ClientError,
-						 ER_INVALID_MSGPACK, "Invalid "
-						 "MP_DATETIME MsgPack format");
-					goto error;
-				}
+				VERIFY(datetime_unpack(&data, len, dt) != NULL);
 				val[i].type = MEM_TYPE_DATETIME;
 				break;
 			} else if (type == MP_INTERVAL) {
 				struct interval *itv = &val[i].u.itv;
-				if (interval_unpack(&data, len, itv) == NULL) {
-					diag_set(ClientError,
-						 ER_INVALID_MSGPACK, "Invalid "
-						 "MP_INTERVAL MsgPack format");
-					goto error;
-				}
+				VERIFY(interval_unpack(&data, len,
+						       itv) != NULL);
 				val[i].type = MEM_TYPE_INTERVAL;
 				break;
 			}
diff --git a/src/lua/msgpack.c b/src/lua/msgpack.c
index cd7f6f4601..dd25017b32 100644
--- a/src/lua/msgpack.c
+++ b/src/lua/msgpack.c
@@ -486,34 +486,25 @@ luamp_decode(struct lua_State *L, struct luaL_serializer *cfg,
 		case MP_DECIMAL:
 		{
 			decimal_t *dec = luaT_newdecimal(L);
-			dec = decimal_unpack(data, len, dec);
-			if (dec == NULL)
-				goto ext_decode_err;
+			VERIFY(decimal_unpack(data, len, dec) != NULL);
 			return;
 		}
 		case MP_UUID:
 		{
 			struct tt_uuid *uuid = luaT_newuuid(L);
-			*data = svp;
-			uuid = mp_decode_uuid(data, uuid);
-			if (uuid == NULL)
-				goto ext_decode_err;
+			VERIFY(uuid_unpack(data, len, uuid) != NULL);
 			return;
 		}
 		case MP_DATETIME:
 		{
 			struct datetime *date = luaT_newdatetime(L);
-			date = datetime_unpack(data, len, date);
-			if (date == NULL)
-				goto ext_decode_err;
+			VERIFY(datetime_unpack(data, len, date) != NULL);
 			return;
 		}
 		case MP_INTERVAL:
 		{
 			struct interval *itv = luaT_newinterval(L);
-			itv = interval_unpack(data, len, itv);
-			if (itv == NULL)
-				goto ext_decode_err;
+			VERIFY(interval_unpack(data, len, itv) != NULL);
 			return;
 		}
 		default:
@@ -526,9 +517,6 @@ luamp_decode(struct lua_State *L, struct luaL_serializer *cfg,
 	}
 	}
 	return;
-ext_decode_err:
-	lua_pop(L, -1);
-	luaL_error(L, "msgpack.decode: invalid MsgPack");
 }
 
 
-- 
GitLab