From e2c199b8abf9561d407135a9d822fee2a502259c Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Sun, 31 Oct 2004 12:20:00 +0000 Subject: [PATCH] Fixed infinite loop in enum code (thanks, Adam!) --- CHANGELOG | 1 + physfs.c | 13 ++++++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 38e5d4f6..185dc313 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -4,6 +4,7 @@ 10302004 - Fixed a strcpy that should have been a strcat. (thanks, Tolga!) Build system respects external CFLAGS now. (thanks, Adam!) + Fixed infinite loop in new enumeration code. (thanks, Adam!) 10062004 - Removed profiling code from physfs.c. 09292004 - Every API that can return a list of strings can now use a callback mechanism if the application wants to do it's own diff --git a/physfs.c b/physfs.c index 25749b92..e38424aa 100644 --- a/physfs.c +++ b/physfs.c @@ -1305,19 +1305,26 @@ static int locateInStringList(const char *str, { PHYSFS_uint32 hi = *pos - 1; PHYSFS_uint32 lo = 0; - PHYSFS_uint32 i = hi / 2; + PHYSFS_uint32 i = hi >> 1; int cmp; + assert(*pos != 0); /* this doesn't work with empty lists! */ + while (hi != lo) { cmp = strcmp(list[i], str); if (cmp == 0) /* it's in the list already. */ return(1); else if (cmp < 0) + { hi = i; + i = lo + ((hi - lo) >> 1); + } /* else if */ else - lo = i; - i = lo + ((hi - lo) / 2); + { + lo = i + 1; + i = lo + ((1 + hi - lo) >> 1); + } /* else */ } /* while */ /* hi == lo, check it in case it's the match... */