Skip to content

Commit cbed97c

Browse files
authored
Merge pull request #760 from RubenKelevra/fix_jpeg-soi-overread
fix(cam_hal): prevent SOI scan from (1) running on length<3 and (2) over-reading the last 2 bytes
2 parents a66af8d + 3e50b59 commit cbed97c

File tree

1 file changed

+11
-4
lines changed

1 file changed

+11
-4
lines changed

driver/cam_hal.c

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,20 @@
4242
static const char *TAG = "cam_hal";
4343
static cam_obj_t *cam_obj = NULL;
4444

45-
static const uint32_t JPEG_SOI_MARKER = 0xFFD8FF; // written in little-endian for esp32
46-
static const uint16_t JPEG_EOI_MARKER = 0xD9FF; // written in little-endian for esp32
45+
/* JPEG markers in little-endian order (ESP32). */
46+
static const uint8_t JPEG_SOI_MARKER[] = {0xFF, 0xD8, 0xFF}; /* SOI = FF D8 FF */
47+
#define JPEG_SOI_MARKER_LEN (3)
48+
static const uint16_t JPEG_EOI_MARKER = 0xD9FF; /* EOI = FF D9 */
4749

4850
static int cam_verify_jpeg_soi(const uint8_t *inbuf, uint32_t length)
4951
{
50-
for (uint32_t i = 0; i < length; i++) {
51-
if (memcmp(&inbuf[i], &JPEG_SOI_MARKER, 3) == 0) {
52+
if (length < JPEG_SOI_MARKER_LEN) {
53+
ESP_LOGW(TAG, "NO-SOI");
54+
return -1;
55+
}
56+
57+
for (uint32_t i = 0; i <= length - JPEG_SOI_MARKER_LEN; i++) {
58+
if (memcmp(&inbuf[i], JPEG_SOI_MARKER, JPEG_SOI_MARKER_LEN) == 0) {
5259
//ESP_LOGW(TAG, "SOI: %d", (int) i);
5360
return i;
5461
}

0 commit comments

Comments
 (0)