From 32fb2ab4a933b26d9bd0148420041a6be79f9ad2 Mon Sep 17 00:00:00 2001 From: "Ryan C. Gordon" Date: Wed, 20 Feb 2008 12:24:10 +0000 Subject: [PATCH] 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. --- CHANGELOG | 3 +++ archivers/grp.c | 24 ++++++++++++++++-------- archivers/hog.c | 24 ++++++++++++++++-------- archivers/mvl.c | 24 ++++++++++++++++-------- archivers/qpak.c | 24 ++++++++++++++++-------- archivers/wad.c | 24 ++++++++++++++++-------- archivers/zip.c | 24 ++++++++++++++++-------- 7 files changed, 99 insertions(+), 48 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index d6a51134..a4c2024b 100644 --- a/CHANGELOG +++ b/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. diff --git a/archivers/grp.c b/archivers/grp.c index f1a46088..ffed8fd6 100644 --- a/archivers/grp.c +++ b/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 */ diff --git a/archivers/hog.c b/archivers/hog.c index a6de721a..94ad4659 100644 --- a/archivers/hog.c +++ b/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 */ diff --git a/archivers/mvl.c b/archivers/mvl.c index 25cb8280..06166419 100644 --- a/archivers/mvl.c +++ b/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 */ diff --git a/archivers/qpak.c b/archivers/qpak.c index 5dd35111..5cb21906 100644 --- a/archivers/qpak.c +++ b/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 */ diff --git a/archivers/wad.c b/archivers/wad.c index 10606758..2a757d23 100644 --- a/archivers/wad.c +++ b/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 */ diff --git a/archivers/zip.c b/archivers/zip.c index 4ba1297d..2aeaf158 100644 --- a/archivers/zip.c +++ b/archivers/zip.c @@ -992,19 +992,27 @@ static int zip_load_entry(void *in, ZIPentry *entry, PHYSFS_uint32 ofs_fixup) 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 */