Fixed infinite loop in enum code (thanks, Adam!)
authorRyan C. Gordon <icculus@icculus.org>
Sun, 31 Oct 2004 12:20:00 +0000
changeset 668 a5c80bd9549e
parent 666 7ca5dede89f2
child 669 66a1058b803d
Fixed infinite loop in enum code (thanks, Adam!)
CHANGELOG
physfs.c
--- a/CHANGELOG	Sat Oct 30 23:45:29 2004 +0000
+++ b/CHANGELOG	Sun Oct 31 12:20:00 2004 +0000
@@ -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
--- a/physfs.c	Sat Oct 30 23:45:29 2004 +0000
+++ b/physfs.c	Sun Oct 31 12:20:00 2004 +0000
@@ -1305,19 +1305,26 @@
 {
     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... */