summaryrefslogtreecommitdiff
path: root/librabbitmq/amqp_table.c
diff options
context:
space:
mode:
Diffstat (limited to 'librabbitmq/amqp_table.c')
-rw-r--r--librabbitmq/amqp_table.c37
1 files changed, 23 insertions, 14 deletions
diff --git a/librabbitmq/amqp_table.c b/librabbitmq/amqp_table.c
index 8495377..6071ece 100644
--- a/librabbitmq/amqp_table.c
+++ b/librabbitmq/amqp_table.c
@@ -299,12 +299,13 @@ static int amqp_encode_array(amqp_bytes_t encoded,
}
}
- if (amqp_encode_32(encoded, &start, *offset - start - 4)) {
- res = AMQP_STATUS_OK;
- } else {
- res = AMQP_STATUS_BAD_AMQP_DATA;
+ if (!amqp_encode_32(encoded, &start, *offset - start - 4)) {
+ res = AMQP_STATUS_TABLE_TOO_BIG;
+ goto out;
}
+ res = AMQP_STATUS_OK;
+
out:
return res;
}
@@ -319,13 +320,13 @@ int amqp_encode_table(amqp_bytes_t encoded,
*offset += 4; /* size of the table gets filled in later on */
for (i = 0; i < input->num_entries; i++) {
- res = amqp_encode_8(encoded, offset, input->entries[i].key.len);
- if (res < 0) {
+ if (!amqp_encode_8(encoded, offset, input->entries[i].key.len)) {
+ res = AMQP_STATUS_TABLE_TOO_BIG;
goto out;
}
- res = amqp_encode_bytes(encoded, offset, input->entries[i].key);
- if (res < 0) {
+ if (!amqp_encode_bytes(encoded, offset, input->entries[i].key)) {
+ res = AMQP_STATUS_TABLE_TOO_BIG;
goto out;
}
@@ -335,12 +336,13 @@ int amqp_encode_table(amqp_bytes_t encoded,
}
}
- if (amqp_encode_32(encoded, &start, *offset - start - 4)) {
- res = AMQP_STATUS_OK;
- } else {
- res = AMQP_STATUS_BAD_AMQP_DATA;
+ if (!amqp_encode_32(encoded, &start, *offset - start - 4)) {
+ res = AMQP_STATUS_TABLE_TOO_BIG;
+ goto out;
}
+ res = AMQP_STATUS_OK;
+
out:
return res;
}
@@ -355,7 +357,11 @@ static int amqp_encode_field_value(amqp_bytes_t encoded,
goto out;
}
-#define FIELD_ENCODER(bits, val) if (!amqp_encode_##bits(encoded, offset, val)) goto out; break
+#define FIELD_ENCODER(bits, val) if (!amqp_encode_##bits(encoded, offset, val)) { \
+ res = AMQP_STATUS_TABLE_TOO_BIG; \
+ goto out; \
+ } \
+ break
switch (entry->kind) {
case AMQP_FIELD_KIND_BOOLEAN:
@@ -392,6 +398,7 @@ static int amqp_encode_field_value(amqp_bytes_t encoded,
case AMQP_FIELD_KIND_DECIMAL:
if (!amqp_encode_8(encoded, offset, entry->value.decimal.decimals)
|| !amqp_encode_32(encoded, offset, entry->value.decimal.value)) {
+ res = AMQP_STATUS_TABLE_TOO_BIG;
goto out;
}
break;
@@ -403,6 +410,7 @@ static int amqp_encode_field_value(amqp_bytes_t encoded,
case AMQP_FIELD_KIND_BYTES:
if (!amqp_encode_32(encoded, offset, entry->value.bytes.len)
|| !amqp_encode_bytes(encoded, offset, entry->value.bytes)) {
+ res = AMQP_STATUS_TABLE_TOO_BIG;
goto out;
}
break;
@@ -422,7 +430,8 @@ static int amqp_encode_field_value(amqp_bytes_t encoded,
break;
default:
- abort();
+ res = AMQP_STATUS_INVALID_PARAMETER;
+ goto out;
}
res = AMQP_STATUS_OK;