From 83e710f3bb2cfc493a323035911bd90cd9d1ba3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franti=C5=A1ek=20Boh=C3=A1=C4=8Dek?= Date: Wed, 16 Jun 2021 10:51:17 +0200 Subject: [PATCH] fix: movement within border underflow of unsigned integer --- image-viewer/include/direction.h | 2 +- image-viewer/include/image_viewer.h | 1 + image-viewer/src/cursor.c | 2 +- image-viewer/src/direction.c | 2 +- image-viewer/src/image.c | 4 ++-- image-viewer/src/image_viewer.c | 4 +++- 6 files changed, 9 insertions(+), 6 deletions(-) diff --git a/image-viewer/include/direction.h b/image-viewer/include/direction.h index ad7b454..9b68122 100644 --- a/image-viewer/include/direction.h +++ b/image-viewer/include/direction.h @@ -10,6 +10,6 @@ typedef enum { RIGHT, } direction_t; -void direction_move_xy(direction_t direction, uint16_t *x, uint16_t *y, int16_t amount); +void direction_move_xy(direction_t direction, int32_t *x, int32_t *y, int16_t amount); #endif // __DIRECTION_H__ diff --git a/image-viewer/include/image_viewer.h b/image-viewer/include/image_viewer.h index aa35867..4738942 100644 --- a/image-viewer/include/image_viewer.h +++ b/image-viewer/include/image_viewer.h @@ -11,6 +11,7 @@ typedef struct { image_t image; cursor_t cursor; image_region_t region; + image_region_t image_region; image_region_t display_region; image_error_t error; diff --git a/image-viewer/src/cursor.c b/image-viewer/src/cursor.c index 749fe31..c5ced6b 100644 --- a/image-viewer/src/cursor.c +++ b/image-viewer/src/cursor.c @@ -22,7 +22,7 @@ void cursor_center(cursor_t *cursor, image_region_t region) { } bool cursor_move(cursor_t *cursor, image_region_t region, direction_t direction, int16_t amount) { - uint16_t x = cursor->x, y = cursor->y; + int32_t x = cursor->x, y = cursor->y; direction_move_xy(direction, &x, &y, amount); if (x < region.x) { diff --git a/image-viewer/src/direction.c b/image-viewer/src/direction.c index 8ca6223..7c7410f 100644 --- a/image-viewer/src/direction.c +++ b/image-viewer/src/direction.c @@ -1,6 +1,6 @@ #include "direction.h" -void direction_move_xy(direction_t direction, uint16_t *x, uint16_t *y, int16_t amount) { +void direction_move_xy(direction_t direction, int32_t *x, int32_t *y, int16_t amount) { switch (direction) { case LEFT: *x -= amount; diff --git a/image-viewer/src/image.c b/image-viewer/src/image.c index d70204a..a36a8f8 100644 --- a/image-viewer/src/image.c +++ b/image-viewer/src/image.c @@ -36,8 +36,8 @@ image_region_t image_region_create(uint16_t x, uint16_t y, uint16_t width, bool image_region_move_within(image_region_t *to_move, direction_t direction, int amount, image_region_t *border) { - uint16_t x = to_move->x; - uint16_t y = to_move->y; + int32_t x = to_move->x; + int32_t y = to_move->y; if (x < border->x) { x = border->x; diff --git a/image-viewer/src/image_viewer.c b/image-viewer/src/image_viewer.c index 86d3af1..a3f37ba 100644 --- a/image-viewer/src/image_viewer.c +++ b/image-viewer/src/image_viewer.c @@ -19,13 +19,15 @@ image_viewer_t image_viewer_create(char *filename, display_t *display, logger_t .region = image_region_create(0, 0, 0, 0), .logger = logger, .display_region = image_region_create(0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT), + .image_region = image_region_create(0, 0, 0, 0), .scale_factor = 0 }; viewer.error = image_loader_load(&viewer.image); if (viewer.error == IMERR_SUCCESS) { - viewer.region = image_region_create(0, 0, viewer.image.width, viewer.image.height); + viewer.region = viewer.image_region = + image_region_create(0, 0, viewer.image.width, viewer.image.height); cursor_center(&viewer.cursor, viewer.display_region); } -- 2.48.1