From 55a7d656c76167f889bf2cdf478f9581422a74ea Mon Sep 17 00:00:00 2001 From: lovyan03 <42724151+lovyan03@users.noreply.github.com> Date: Sun, 3 May 2020 10:57:05 +0900 Subject: [PATCH] Add: Return error if data is too big. --- src/qrcode.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/qrcode.c b/src/qrcode.c index 940c06e..d0fb124 100755 --- a/src/qrcode.c +++ b/src/qrcode.c @@ -209,7 +209,9 @@ static void bb_initGrid(BitBucket *bitGrid, uint8_t *data, uint8_t size) { static void bb_appendBits(BitBucket *bitBuffer, uint32_t val, uint8_t length) { uint32_t offset = bitBuffer->bitOffsetOrWidth; for (int8_t i = length - 1; i >= 0; i--, offset++) { - bitBuffer->data[offset >> 3] |= ((val >> i) & 1) << (7 - (offset & 7)); + if (bitBuffer->capacityBytes > offset >> 3) { + bitBuffer->data[offset >> 3] |= ((val >> i) & 1) << (7 - (offset & 7)); + } } bitBuffer->bitOffsetOrWidth = offset; } @@ -771,7 +773,7 @@ uint16_t qrcode_getBufferSize(uint8_t version) { return bb_getGridSizeBytes(4 * version + 17); } -// @TODO: Return error if data is too big. + int8_t qrcode_initBytes(QRCode *qrcode, uint8_t *modules, uint8_t version, uint8_t ecc, uint8_t *data, uint16_t length) { uint8_t size = version * 4 + 17; qrcode->version = version; @@ -801,7 +803,8 @@ int8_t qrcode_initBytes(QRCode *qrcode, uint8_t *modules, uint8_t version, uint8 qrcode->mode = mode; // Add terminator and pad up to a byte if applicable - uint32_t padding = (dataCapacity * 8) - codewords.bitOffsetOrWidth; + int32_t padding = (dataCapacity * 8) - codewords.bitOffsetOrWidth; + if (padding < 0) { return -1; } if (padding > 4) { padding = 4; } bb_appendBits(&codewords, 0, padding); bb_appendBits(&codewords, 0, (8 - codewords.bitOffsetOrWidth % 8) % 8);