Skip to content

Commit bdb178b

Browse files
committed
Fixed error handling in reader buffer ensure
1 parent b2ddedd commit bdb178b

File tree

3 files changed

+22
-6
lines changed

3 files changed

+22
-6
lines changed

src/mpack/mpack-expect.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
// Helpers
3030

3131
MPACK_STATIC_INLINE uint8_t mpack_expect_native_u8(mpack_reader_t* reader) {
32+
if (mpack_reader_error(reader) != mpack_ok)
33+
return 0;
3234
uint8_t type;
3335
if (!mpack_reader_ensure(reader, sizeof(type)))
3436
return 0;
@@ -40,6 +42,8 @@ MPACK_STATIC_INLINE uint8_t mpack_expect_native_u8(mpack_reader_t* reader) {
4042

4143
#if !MPACK_OPTIMIZE_FOR_SIZE
4244
MPACK_STATIC_INLINE uint16_t mpack_expect_native_u16(mpack_reader_t* reader) {
45+
if (mpack_reader_error(reader) != mpack_ok)
46+
return 0;
4347
uint16_t type;
4448
if (!mpack_reader_ensure(reader, sizeof(type)))
4549
return 0;
@@ -50,6 +54,8 @@ MPACK_STATIC_INLINE uint16_t mpack_expect_native_u16(mpack_reader_t* reader) {
5054
}
5155

5256
MPACK_STATIC_INLINE uint32_t mpack_expect_native_u32(mpack_reader_t* reader) {
57+
if (mpack_reader_error(reader) != mpack_ok)
58+
return 0;
5359
uint32_t type;
5460
if (!mpack_reader_ensure(reader, sizeof(type)))
5561
return 0;

src/mpack/mpack-reader.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,7 @@ static void mpack_partial_fill(mpack_reader_t* reader) {
229229

230230
bool mpack_reader_ensure_straddle(mpack_reader_t* reader, size_t count) {
231231
mpack_assert(count != 0, "cannot ensure zero bytes!");
232+
mpack_assert(reader->error == mpack_ok, "reader cannot be in an error state!");
232233

233234
if (count <= reader->left) {
234235
mpack_assert(0,
@@ -248,6 +249,9 @@ bool mpack_reader_ensure_straddle(mpack_reader_t* reader, size_t count) {
248249
return false;
249250
}
250251

252+
mpack_assert(count <= reader->size, "cannot ensure byte count %i larger than buffer size %i",
253+
(int)count, (int)reader->size);
254+
251255
// re-fill as much as possible
252256
mpack_partial_fill(reader);
253257

@@ -591,6 +595,8 @@ const char* mpack_read_utf8_inplace(mpack_reader_t* reader, size_t count) {
591595
// Decodes a tag from a byte buffer. The size of the bytes buffer
592596
// must be at least MPACK_MINIMUM_TAG_SIZE.
593597
static size_t mpack_parse_tag(mpack_reader_t* reader, mpack_tag_t* tag) {
598+
mpack_assert(reader->error == mpack_ok, "reader cannot be in an error state!");
599+
594600
if (!mpack_reader_ensure(reader, 1))
595601
return 0;
596602
uint8_t type = mpack_load_u8(reader->buffer + reader->pos);
@@ -965,6 +971,8 @@ mpack_tag_t mpack_read_tag(mpack_reader_t* reader) {
965971
mpack_log("reading tag\n");
966972

967973
// make sure we can read a tag
974+
if (mpack_reader_error(reader) != mpack_ok)
975+
return mpack_tag_nil();
968976
if (mpack_reader_track_element(reader) != mpack_ok)
969977
return mpack_tag_nil();
970978

@@ -1008,6 +1016,9 @@ mpack_tag_t mpack_read_tag(mpack_reader_t* reader) {
10081016
mpack_tag_t mpack_peek_tag(mpack_reader_t* reader) {
10091017
mpack_log("peeking tag\n");
10101018

1019+
// make sure we can peek a tag
1020+
if (mpack_reader_error(reader) != mpack_ok)
1021+
return mpack_tag_nil();
10111022
if (mpack_reader_track_peek_element(reader) != mpack_ok)
10121023
return mpack_tag_nil();
10131024

src/mpack/mpack-reader.h

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -681,16 +681,15 @@ bool mpack_reader_ensure_straddle(mpack_reader_t* reader, size_t count);
681681
// Ensures there are at least count bytes left in the buffer. This will
682682
// flag an error if there is not enough data, and will assert if there
683683
// is a fill function and count is larger than the buffer size. Returns
684-
// true if there are enough bytes, false otherwise.
684+
// true if there are enough bytes, false otherwise. Error handling must
685+
// be done separately! The reader cannot be in an error state when this
686+
// is called.
685687
MPACK_INLINE bool mpack_reader_ensure(mpack_reader_t* reader, size_t count) {
686688
mpack_assert(count != 0, "cannot ensure zero bytes!");
689+
mpack_assert(reader->error == mpack_ok, "reader cannot be in an error state!");
687690

688-
if (count <= reader->left) {
689-
mpack_assert(reader->error == mpack_ok, "error state %i but there are %i bytes left?",
690-
(int)reader->error, (int)reader->left);
691+
if (count <= reader->left)
691692
return true;
692-
}
693-
694693
return mpack_reader_ensure_straddle(reader, count);
695694
}
696695

0 commit comments

Comments
 (0)