msgbuf: Add pldm_msgbuf_extract_uint*_to_size APIs

Add pldm_msgbuf_extract_uint8_to_size(),
pldm_msgbuf_extract_uint16_to_size() and
pldm_msgbuf_extract_uint32_to_size() APIs to msgbuf API list. These are
the extractors which extract uint8_t/uint16_t/uint32_t to the size_t
destination. We mostly use size_t as the type to hold object size, but
extracting data to a size_t variable has not been properly supported.
These new APIs can bypass this limitation.

Example:

Extract from buffer the length of a variable length data represented by
`variable_field` struct, which has a field of size_t to represent
length.

Change-Id: I89f2600602bacf39f1f915a3496231dcc63fd6aa
Signed-off-by: Chau Ly <chaul@amperecomputing.com>
diff --git a/tests/msgbuf.cpp b/tests/msgbuf.cpp
index 14f5d73..0c2169e 100644
--- a/tests/msgbuf.cpp
+++ b/tests/msgbuf.cpp
@@ -1439,3 +1439,109 @@
     ASSERT_EQ(pldm_msgbuf_complete(dst), 0);
     ASSERT_EQ(pldm_msgbuf_complete(src), -EOVERFLOW);
 }
+
+TEST(msgbuf, extract_one_uint8_to_size)
+{
+    PLDM_MSGBUF_DEFINE_P(ctx);
+    uint8_t buf[1] = {0xa5};
+
+    size_t val;
+
+    ASSERT_EQ(pldm_msgbuf_init_errno(ctx, sizeof(buf), buf, sizeof(buf)), 0);
+    EXPECT_EQ(pldm_msgbuf_extract_uint8_to_size(ctx, val), 0);
+    EXPECT_EQ(val, 0xa5);
+    EXPECT_EQ(pldm_msgbuf_complete(ctx), 0);
+}
+
+TEST(msgbuf, extract_under_uint8_to_size)
+{
+    PLDM_MSGBUF_DEFINE_P(ctx);
+    uint8_t buf[1] = {};
+    size_t val;
+
+    ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, 0), 0);
+    ctx->remaining = INTMAX_MIN + sizeof(val) - 1;
+    EXPECT_NE(pldm_msgbuf_extract_uint8_to_size(ctx, val), 0);
+    EXPECT_EQ(pldm_msgbuf_complete(ctx), -EOVERFLOW);
+}
+
+TEST(msgbuf, extract_over_uint8_to_size)
+{
+    PLDM_MSGBUF_DEFINE_P(ctx);
+    uint8_t buf[1] = {};
+    size_t val;
+
+    ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, 0), 0);
+    EXPECT_NE(pldm_msgbuf_extract_uint8_to_size(ctx, val), 0);
+    EXPECT_EQ(pldm_msgbuf_complete(ctx), -EOVERFLOW);
+}
+
+TEST(msgbuf, extract_one_uint16_to_size)
+{
+    PLDM_MSGBUF_DEFINE_P(ctx);
+    uint16_t buf[1] = {htole16(0x5aa5)};
+    size_t val;
+
+    ASSERT_EQ(pldm_msgbuf_init_errno(ctx, sizeof(buf), buf, sizeof(buf)), 0);
+    EXPECT_EQ(pldm_msgbuf_extract_uint16_to_size(ctx, val), 0);
+    EXPECT_EQ(val, 0x5aa5);
+    EXPECT_EQ(pldm_msgbuf_complete(ctx), 0);
+}
+
+TEST(msgbuf, extract_under_uint16_to_size)
+{
+    PLDM_MSGBUF_DEFINE_P(ctx);
+    uint16_t buf[1] = {};
+    size_t val;
+
+    ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, 0), 0);
+    ctx->remaining = INTMAX_MIN + sizeof(val) - 1;
+    EXPECT_NE(pldm_msgbuf_extract_uint16_to_size(ctx, val), 0);
+    EXPECT_EQ(pldm_msgbuf_complete(ctx), -EOVERFLOW);
+}
+
+TEST(msgbuf, extract_over_uint16_to_size)
+{
+    PLDM_MSGBUF_DEFINE_P(ctx);
+    uint16_t buf[1] = {};
+    size_t val;
+
+    ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, 0), 0);
+    EXPECT_NE(pldm_msgbuf_extract_uint16_to_size(ctx, val), 0);
+    EXPECT_EQ(pldm_msgbuf_complete(ctx), -EOVERFLOW);
+}
+
+TEST(msgbuf, extract_one_uint32_to_size)
+{
+    PLDM_MSGBUF_DEFINE_P(ctx);
+    uint32_t buf[1] = {htole32(0x5a00ffa5)};
+    size_t val;
+
+    ASSERT_EQ(pldm_msgbuf_init_errno(ctx, sizeof(buf), buf, sizeof(buf)), 0);
+    EXPECT_EQ(pldm_msgbuf_extract_uint32_to_size(ctx, val), 0);
+    EXPECT_EQ(val, 0x5a00ffa5);
+    EXPECT_EQ(pldm_msgbuf_complete(ctx), 0);
+}
+
+TEST(msgbuf, extract_under_uint32_to_size)
+{
+    PLDM_MSGBUF_DEFINE_P(ctx);
+    uint32_t buf[1] = {};
+    size_t val;
+
+    ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, 0), 0);
+    ctx->remaining = INTMAX_MIN + sizeof(val) - 1;
+    EXPECT_NE(pldm_msgbuf_extract_uint32_to_size(ctx, val), 0);
+    EXPECT_EQ(pldm_msgbuf_complete(ctx), -EOVERFLOW);
+}
+
+TEST(msgbuf, extract_over_uint32_to_size)
+{
+    PLDM_MSGBUF_DEFINE_P(ctx);
+    uint32_t buf[1] = {};
+    size_t val;
+
+    ASSERT_EQ(pldm_msgbuf_init_errno(ctx, 0, buf, 0), 0);
+    EXPECT_NE(pldm_msgbuf_extract_uint32_to_size(ctx, val), 0);
+    EXPECT_EQ(pldm_msgbuf_complete(ctx), -EOVERFLOW);
+}