cbor: Fix implicit conversion
Fix implicit conversion checks that are happened on the following
compilation options.
-Wsign-conversion
-Wimplicit-int-conversion
Bug: 342974524
Change-Id: Ie037dfd40d2d91f5f6c254f24452125644aa1752
Signed-off-by: Tommy Chiu <tommychiu@google.com>
Reviewed-on: https://pigweed-review.googlesource.com/c/open-dice/+/233451
Commit-Queue: Auto-Submit <auto-submit@pigweed-service-accounts.iam.gserviceaccount.com>
Reviewed-by: Andrew Scull <ascull@google.com>
Lint: Lint 🤖 <android-build-ayeaye@system.gserviceaccount.com>
diff --git a/src/cbor_reader.c b/src/cbor_reader.c
index 7f33b2f..1270206 100644
--- a/src/cbor_reader.c
+++ b/src/cbor_reader.c
@@ -54,13 +54,13 @@
if (bytes == 2) {
value |= in->buffer[in->cursor + 1];
} else if (bytes == 3) {
- value |= (uint16_t)in->buffer[in->cursor + 1] << 8;
- value |= (uint16_t)in->buffer[in->cursor + 2];
+ value |= (uint64_t)in->buffer[in->cursor + 1] << 8;
+ value |= (uint64_t)in->buffer[in->cursor + 2];
} else if (bytes == 5) {
- value |= (uint32_t)in->buffer[in->cursor + 1] << 24;
- value |= (uint32_t)in->buffer[in->cursor + 2] << 16;
- value |= (uint32_t)in->buffer[in->cursor + 3] << 8;
- value |= (uint32_t)in->buffer[in->cursor + 4];
+ value |= (uint64_t)in->buffer[in->cursor + 1] << 24;
+ value |= (uint64_t)in->buffer[in->cursor + 2] << 16;
+ value |= (uint64_t)in->buffer[in->cursor + 3] << 8;
+ value |= (uint64_t)in->buffer[in->cursor + 4];
} else if (bytes == 9) {
value |= (uint64_t)in->buffer[in->cursor + 1] << 56;
value |= (uint64_t)in->buffer[in->cursor + 2] << 48;
@@ -96,7 +96,7 @@
if (raw > SIZE_MAX) {
return CBOR_READ_RESULT_MALFORMED;
}
- *size = raw;
+ *size = (size_t)raw;
in->cursor += bytes;
return CBOR_READ_RESULT_OK;
}
@@ -250,7 +250,7 @@
continue;
case CBOR_TYPE_BSTR:
case CBOR_TYPE_TSTR:
- if (CborReadWouldOverflow(val, &peeker)) {
+ if (val > SIZE_MAX || CborReadWouldOverflow((size_t)val, &peeker)) {
return CBOR_READ_RESULT_END;
}
peeker.cursor += val;
@@ -277,7 +277,10 @@
if (stack_size == CBOR_READ_SKIP_STACK_SIZE) {
return CBOR_READ_RESULT_MALFORMED;
}
- size_stack[stack_size++] = val;
+ if (val > SIZE_MAX) {
+ return CBOR_READ_RESULT_END;
+ }
+ size_stack[stack_size++] = (size_t)val;
}
in->cursor = peeker.cursor;
diff --git a/src/cbor_writer.c b/src/cbor_writer.c
index e512931..6c70129 100644
--- a/src/cbor_writer.c
+++ b/src/cbor_writer.c
@@ -59,22 +59,22 @@
}
if (CborWriteFitsInBuffer(size, out)) {
if (size == 1) {
- out->buffer[out->cursor] = (type << 5) | val;
+ out->buffer[out->cursor] = (uint8_t)((type << 5) | val);
} else if (size == 2) {
- out->buffer[out->cursor] = (type << 5) | 24;
+ out->buffer[out->cursor] = (uint8_t)((type << 5) | 24);
out->buffer[out->cursor + 1] = val & 0xff;
} else if (size == 3) {
- out->buffer[out->cursor] = (type << 5) | 25;
+ out->buffer[out->cursor] = (uint8_t)((type << 5) | 25);
out->buffer[out->cursor + 1] = (val >> 8) & 0xff;
out->buffer[out->cursor + 2] = val & 0xff;
} else if (size == 5) {
- out->buffer[out->cursor] = (type << 5) | 26;
+ out->buffer[out->cursor] = (uint8_t)((type << 5) | 26);
out->buffer[out->cursor + 1] = (val >> 24) & 0xff;
out->buffer[out->cursor + 2] = (val >> 16) & 0xff;
out->buffer[out->cursor + 3] = (val >> 8) & 0xff;
out->buffer[out->cursor + 4] = val & 0xff;
} else if (size == 9) {
- out->buffer[out->cursor] = (type << 5) | 27;
+ out->buffer[out->cursor] = (uint8_t)((type << 5) | 27);
out->buffer[out->cursor + 1] = (val >> 56) & 0xff;
out->buffer[out->cursor + 2] = (val >> 48) & 0xff;
out->buffer[out->cursor + 3] = (val >> 40) & 0xff;
@@ -108,9 +108,9 @@
void CborWriteInt(int64_t val, struct CborOut* out) {
if (val < 0) {
- CborWriteType(CBOR_TYPE_NINT, (-1 - val), out);
+ CborWriteType(CBOR_TYPE_NINT, (uint64_t)(-1 - val), out);
} else {
- CborWriteType(CBOR_TYPE_UINT, val, out);
+ CborWriteType(CBOR_TYPE_UINT, (uint64_t)val, out);
}
}