浏览代码

Various archiver swap and compare functions now check if they are
swapping/comparing an item against itself, for efficiency and to prevent
overlapping memcpy() calls.

Ryan C. Gordon 18 年之前
父节点
当前提交
32fb2ab4a9
共有 7 个文件被更改,包括 99 次插入48 次删除
  1. 3 0
      CHANGELOG
  2. 16 8
      archivers/grp.c
  3. 16 8
      archivers/hog.c
  4. 16 8
      archivers/mvl.c
  5. 16 8
      archivers/qpak.c
  6. 16 8
      archivers/wad.c
  7. 16 8
      archivers/zip.c

+ 3 - 0
CHANGELOG

@@ -4,6 +4,9 @@
 
 -- stuff in the stable-1.0 branch, backported from 2.0.0 dev branch, etc ---
 
+02202008 - Various archiver swap and compare functions now check if they are
+           swapping/comparing an item against itself, for efficiency and
+           to prevent overlapping memcpy() calls.
 02132008 - Minor Windows fix (thanks, fydo!).
 01222008 - Added zlib README, and updated LICENSE.txt.
 01212008 - Fixed HTTP header in physfshttpd.c.

+ 16 - 8
archivers/grp.c

@@ -263,19 +263,27 @@ static int GRP_isArchive(const char *filename, int forWriting)
 
 static int grp_entry_cmp(void *_a, PHYSFS_uint32 one, PHYSFS_uint32 two)
 {
-    GRPentry *a = (GRPentry *) _a;
-    return(strcmp(a[one].name, a[two].name));
+    if (one != two)
+    {
+        const GRPentry *a = (const GRPentry *) _a;
+        return(strcmp(a[one].name, a[two].name));
+    } /* if */
+
+    return 0;
 } /* grp_entry_cmp */
 
 
 static void grp_entry_swap(void *_a, PHYSFS_uint32 one, PHYSFS_uint32 two)
 {
-    GRPentry tmp;
-    GRPentry *first = &(((GRPentry *) _a)[one]);
-    GRPentry *second = &(((GRPentry *) _a)[two]);
-    memcpy(&tmp, first, sizeof (GRPentry));
-    memcpy(first, second, sizeof (GRPentry));
-    memcpy(second, &tmp, sizeof (GRPentry));
+    if (one != two)
+    {
+        GRPentry tmp;
+        GRPentry *first = &(((GRPentry *) _a)[one]);
+        GRPentry *second = &(((GRPentry *) _a)[two]);
+        memcpy(&tmp, first, sizeof (GRPentry));
+        memcpy(first, second, sizeof (GRPentry));
+        memcpy(second, &tmp, sizeof (GRPentry));
+    } /* if */
 } /* grp_entry_swap */
 
 

+ 16 - 8
archivers/hog.c

@@ -300,19 +300,27 @@ static int HOG_isArchive(const char *filename, int forWriting)
 
 static int hog_entry_cmp(void *_a, PHYSFS_uint32 one, PHYSFS_uint32 two)
 {
-    HOGentry *a = (HOGentry *) _a;
-    return(__PHYSFS_platformStricmp(a[one].name, a[two].name));
+    if (one != two)
+    {
+        const HOGentry *a = (const HOGentry *) _a;
+        return(__PHYSFS_platformStricmp(a[one].name, a[two].name));
+    } /* if */
+
+    return 0;
 } /* hog_entry_cmp */
 
 
 static void hog_entry_swap(void *_a, PHYSFS_uint32 one, PHYSFS_uint32 two)
 {
-    HOGentry tmp;
-    HOGentry *first = &(((HOGentry *) _a)[one]);
-    HOGentry *second = &(((HOGentry *) _a)[two]);
-    memcpy(&tmp, first, sizeof (HOGentry));
-    memcpy(first, second, sizeof (HOGentry));
-    memcpy(second, &tmp, sizeof (HOGentry));
+    if (one != two)
+    {
+        HOGentry tmp;
+        HOGentry *first = &(((HOGentry *) _a)[one]);
+        HOGentry *second = &(((HOGentry *) _a)[two]);
+        memcpy(&tmp, first, sizeof (HOGentry));
+        memcpy(first, second, sizeof (HOGentry));
+        memcpy(second, &tmp, sizeof (HOGentry));
+    } /* if */
 } /* hog_entry_swap */
 
 

+ 16 - 8
archivers/mvl.c

@@ -266,19 +266,27 @@ static int MVL_isArchive(const char *filename, int forWriting)
 
 static int mvl_entry_cmp(void *_a, PHYSFS_uint32 one, PHYSFS_uint32 two)
 {
-    MVLentry *a = (MVLentry *) _a;
-    return(strcmp(a[one].name, a[two].name));
+    if (one != two)
+    {
+        const MVLentry *a = (const MVLentry *) _a;
+        return(strcmp(a[one].name, a[two].name));
+    } /* if */
+
+    return 0;
 } /* mvl_entry_cmp */
 
 
 static void mvl_entry_swap(void *_a, PHYSFS_uint32 one, PHYSFS_uint32 two)
 {
-    MVLentry tmp;
-    MVLentry *first = &(((MVLentry *) _a)[one]);
-    MVLentry *second = &(((MVLentry *) _a)[two]);
-    memcpy(&tmp, first, sizeof (MVLentry));
-    memcpy(first, second, sizeof (MVLentry));
-    memcpy(second, &tmp, sizeof (MVLentry));
+    if (one != two)
+    {
+        MVLentry tmp;
+        MVLentry *first = &(((MVLentry *) _a)[one]);
+        MVLentry *second = &(((MVLentry *) _a)[two]);
+        memcpy(&tmp, first, sizeof (MVLentry));
+        memcpy(first, second, sizeof (MVLentry));
+        memcpy(second, &tmp, sizeof (MVLentry));
+    } /* if */
 } /* mvl_entry_swap */
 
 

+ 16 - 8
archivers/qpak.c

@@ -296,19 +296,27 @@ static int QPAK_isArchive(const char *filename, int forWriting)
 
 static int qpak_entry_cmp(void *_a, PHYSFS_uint32 one, PHYSFS_uint32 two)
 {
-    QPAKentry *a = (QPAKentry *) _a;
-    return(QPAK_strcmp(a[one].name, a[two].name));
+    if (one != two)
+    {
+        const QPAKentry *a = (const QPAKentry *) _a;
+        return(QPAK_strcmp(a[one].name, a[two].name));
+    } /* if */
+
+    return 0;
 } /* qpak_entry_cmp */
 
 
 static void qpak_entry_swap(void *_a, PHYSFS_uint32 one, PHYSFS_uint32 two)
 {
-    QPAKentry tmp;
-    QPAKentry *first = &(((QPAKentry *) _a)[one]);
-    QPAKentry *second = &(((QPAKentry *) _a)[two]);
-    memcpy(&tmp, first, sizeof (QPAKentry));
-    memcpy(first, second, sizeof (QPAKentry));
-    memcpy(second, &tmp, sizeof (QPAKentry));
+    if (one != two)
+    {
+        QPAKentry tmp;
+        QPAKentry *first = &(((QPAKentry *) _a)[one]);
+        QPAKentry *second = &(((QPAKentry *) _a)[two]);
+        memcpy(&tmp, first, sizeof (QPAKentry));
+        memcpy(first, second, sizeof (QPAKentry));
+        memcpy(second, &tmp, sizeof (QPAKentry));
+    } /* if */
 } /* qpak_entry_swap */
 
 

+ 16 - 8
archivers/wad.c

@@ -287,19 +287,27 @@ static int WAD_isArchive(const char *filename, int forWriting)
 
 static int wad_entry_cmp(void *_a, PHYSFS_uint32 one, PHYSFS_uint32 two)
 {
-    WADentry *a = (WADentry *) _a;
-    return(strcmp(a[one].name, a[two].name));
+    if (one != two)
+    {
+        const WADentry *a = (const WADentry *) _a;
+        return(strcmp(a[one].name, a[two].name));
+    } /* if */
+
+    return 0;
 } /* wad_entry_cmp */
 
 
 static void wad_entry_swap(void *_a, PHYSFS_uint32 one, PHYSFS_uint32 two)
 {
-    WADentry tmp;
-    WADentry *first = &(((WADentry *) _a)[one]);
-    WADentry *second = &(((WADentry *) _a)[two]);
-    memcpy(&tmp, first, sizeof (WADentry));
-    memcpy(first, second, sizeof (WADentry));
-    memcpy(second, &tmp, sizeof (WADentry));
+    if (one != two)
+    {
+        WADentry tmp;
+        WADentry *first = &(((WADentry *) _a)[one]);
+        WADentry *second = &(((WADentry *) _a)[two]);
+        memcpy(&tmp, first, sizeof (WADentry));
+        memcpy(first, second, sizeof (WADentry));
+        memcpy(second, &tmp, sizeof (WADentry));
+    } /* if */
 } /* wad_entry_swap */
 
 

+ 16 - 8
archivers/zip.c

@@ -992,19 +992,27 @@ zip_load_entry_puked:
 
 static int zip_entry_cmp(void *_a, PHYSFS_uint32 one, PHYSFS_uint32 two)
 {
-    ZIPentry *a = (ZIPentry *) _a;
-    return(strcmp(a[one].name, a[two].name));
+    if (one != two)
+    {
+        const ZIPentry *a = (const ZIPentry *) _a;
+        return(strcmp(a[one].name, a[two].name));
+    } /* if */
+
+    return 0;
 } /* zip_entry_cmp */
 
 
 static void zip_entry_swap(void *_a, PHYSFS_uint32 one, PHYSFS_uint32 two)
 {
-    ZIPentry tmp;
-    ZIPentry *first = &(((ZIPentry *) _a)[one]);
-    ZIPentry *second = &(((ZIPentry *) _a)[two]);
-    memcpy(&tmp, first, sizeof (ZIPentry));
-    memcpy(first, second, sizeof (ZIPentry));
-    memcpy(second, &tmp, sizeof (ZIPentry));
+    if (one != two)
+    {
+        ZIPentry tmp;
+        ZIPentry *first = &(((ZIPentry *) _a)[one]);
+        ZIPentry *second = &(((ZIPentry *) _a)[two]);
+        memcpy(&tmp, first, sizeof (ZIPentry));
+        memcpy(first, second, sizeof (ZIPentry));
+        memcpy(second, &tmp, sizeof (ZIPentry));
+    } /* if */
 } /* zip_entry_swap */