summaryrefslogtreecommitdiff
path: root/apps/buffering.c
diff options
context:
space:
mode:
authorAidan MacDonald <amachronic@protonmail.com>2022-03-27 00:08:28 +0000
committerAidan MacDonald <amachronic@protonmail.com>2022-04-09 15:20:57 +0100
commit7718b244011661a5273121d1b545a18f1a5cd497 (patch)
tree68ee6e02cd3985581e67e803e70b16b412bb0527 /apps/buffering.c
parentbd444ebd0a6cb98faf7ca569c273f4ca860ab65d (diff)
downloadrockbox-7718b244011661a5273121d1b545a18f1a5cd497.tar.gz
rockbox-7718b244011661a5273121d1b545a18f1a5cd497.zip
buffering: fix signed overflow in next_handle_id()
Not sure what the comment is talking about - signed overflow is undefined behavior and we don't use -fwrapv or other flags to make it defined. I can't see how a compiler could abuse it here, but the overflow is nonetheless easily avoided. Change-Id: Ibed6d7c0d841db2aa86b9d8ba4c6a0d08c413354
Diffstat (limited to 'apps/buffering.c')
-rw-r--r--apps/buffering.c13
1 files changed, 5 insertions, 8 deletions
diff --git a/apps/buffering.c b/apps/buffering.c
index 3adbc4a6b9..f80d73a4a8 100644
--- a/apps/buffering.c
+++ b/apps/buffering.c
@@ -71,8 +71,6 @@
71/* amount of data to read in one read() call */ 71/* amount of data to read in one read() call */
72#define BUFFERING_DEFAULT_FILECHUNK (1024*32) 72#define BUFFERING_DEFAULT_FILECHUNK (1024*32)
73 73
74#define BUF_HANDLE_MASK 0x7FFFFFFF
75
76enum handle_flags 74enum handle_flags
77{ 75{
78 H_CANWRAP = 0x1, /* Handle data may wrap in buffer */ 76 H_CANWRAP = 0x1, /* Handle data may wrap in buffer */
@@ -295,12 +293,11 @@ static int next_handle_id(void)
295{ 293{
296 static int cur_handle_id = 0; 294 static int cur_handle_id = 0;
297 295
298 /* Wrap signed int is safe and 0 doesn't happen */ 296 int next_hid = cur_handle_id + 1;
299 int next_hid = (cur_handle_id + 1) & BUF_HANDLE_MASK; 297 if (next_hid == INT_MAX)
300 if (next_hid == 0) 298 cur_handle_id = 0; /* next would overflow; reset the counter */
301 next_hid = 1; 299 else
302 300 cur_handle_id = next_hid;
303 cur_handle_id = next_hid;
304 301
305 return next_hid; 302 return next_hid;
306} 303}