summaryrefslogtreecommitdiff
path: root/decode.c
diff options
context:
space:
mode:
Diffstat (limited to 'decode.c')
-rw-r--r--decode.c28
1 files changed, 26 insertions, 2 deletions
diff --git a/decode.c b/decode.c
index 7542b9d..73c0dd0 100644
--- a/decode.c
+++ b/decode.c
@@ -67,6 +67,9 @@ static int
decode_int(const char *buffer, unsigned int buff_size, unsigned int *out_size);
static int
+decode_uint(const char *buffer, unsigned int buff_size, unsigned int *out_size);
+
+static int
decode_bigint(const char *buffer, unsigned int buff_size, unsigned int *out_size);
static int
@@ -144,10 +147,10 @@ static ParseCallbackTableItem callback_table[] =
"int", &decode_int
},
{
- "oid", &decode_int
+ "oid", &decode_uint
},
{
- "xid", &decode_int
+ "xid", &decode_uint
},
{
"serial", &decode_int
@@ -702,6 +705,27 @@ decode_int(const char *buffer, unsigned int buff_size, unsigned int *out_size)
return 0;
}
+/* Decode an unsigned int type */
+static int
+decode_uint(const char *buffer, unsigned int buff_size, unsigned int *out_size)
+{
+ const char *new_buffer = (const char *) INTALIGN(buffer);
+ unsigned int delta = (unsigned int) ((uintptr_t) new_buffer - (uintptr_t) buffer);
+
+ if (buff_size < delta)
+ return -1;
+
+ buff_size -= delta;
+ buffer = new_buffer;
+
+ if (buff_size < sizeof(uint32))
+ return -2;
+
+ CopyAppendFmt("%u", *(uint32 *) buffer);
+ *out_size = sizeof(uint32) + delta;
+ return 0;
+}
+
/* Decode a bigint type */
static int
decode_bigint(const char *buffer, unsigned int buff_size, unsigned int *out_size)