diff options
Diffstat (limited to 'decode.c')
| -rw-r--r-- | decode.c | 28 |
1 files changed, 26 insertions, 2 deletions
@@ -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) |
