diff --git a/doc/ChangeLog.html b/doc/ChangeLog.html index 3e3dcd8b8..606e184b6 100644 --- a/doc/ChangeLog.html +++ b/doc/ChangeLog.html @@ -1100,6 +1100,7 @@ <LI>Fixed bug in save replay menu (from Jimmy Salmon). <LI>Fixed "make buildit" (from Nehal Mistry). <LI>Fixed crash when middle clicking in a menu (from Nehal Mistry). + <LI>Fixed crash on BSD (from Jimmy Salmon and ppl). <LI>+++ </UL> </UL> diff --git a/src/ui/menus.cpp b/src/ui/menus.cpp index ee06147f6..9233d1444 100644 --- a/src/ui/menus.cpp +++ b/src/ui/menus.cpp @@ -1135,12 +1135,13 @@ local int SaveGameRDFilter(char *pathbuf, FileList *fl) fl->type='b'; } #endif - if (strstr(pathbuf, ".sav")) { - if (fl->type == -1) - fl->type = 'n'; - fl->name = strdup(np); - fl->xdata = NULL; - return 1; + if (strcasestr(pathbuf, ".sav")) { + if (fl->type == -1) { + fl->type = 'n'; + } + fl->name = strdup(np); + fl->xdata = NULL; + return 1; } } return 0; @@ -3255,11 +3256,11 @@ local void ScenSelectLBExit(Menuitem *mi) local int ScenSelectRDFilter(char *pathbuf, FileList *fl) { MapInfo *info; - char *suf[2]; + char *suf[3]; char *cp; char *lcp; char *np; - int p; + int curopt; unsigned u; int sz; static int szl[] = { -1, 32, 64, 96, 128, 256, 512, 1024 }; @@ -3270,18 +3271,17 @@ local int ScenSelectRDFilter(char *pathbuf, FileList *fl) menu = FindMenu("menu-select-scenario"); - if (menu->items[6].d.pulldown.curopt == 0) { + curopt = menu->items[6].d.pulldown.curopt; + if (curopt == 0) { suf[0] = ".cm"; suf[1] = NULL; - p = 0; - } else if (menu->items[6].d.pulldown.curopt == 1) { + } else if (curopt == 1) { suf[0] = ".pud"; suf[1] = NULL; - p = 1; } else { suf[0] = ".scm"; suf[1] = ".chk"; - p = 2; + suf[2] = NULL; } np = strrchr(pathbuf, '/'); if (np) { @@ -3300,7 +3300,7 @@ local int ScenSelectRDFilter(char *pathbuf, FileList *fl) } #endif u = 0; - do { + while (suf[u]) { cp = np; --cp; do { @@ -3311,7 +3311,11 @@ local int ScenSelectRDFilter(char *pathbuf, FileList *fl) break; } ++u; - } while (u < sizeof(suf)/sizeof(*suf)); + } + if (!suf[u]) { + return 0; + } + if (lcp >= np) { cp = lcp + strlen(suf[u]); #ifdef USE_ZLIB @@ -3328,23 +3332,29 @@ local int ScenSelectRDFilter(char *pathbuf, FileList *fl) #ifdef USE_ZZIPLIB usezzf: #endif - if (p==1) { - if (strcasestr(pathbuf, ".pud")) { - info = GetPudInfo(pathbuf); - if (info) { - DebugLevel3Fn("GetPudInfo(%s) : %p\n" _C_ pathbuf _C_ info); - sz = szl[menu->items[8].d.pulldown.curopt]; - if (sz < 0 || (info->MapWidth == sz && info->MapHeight == sz)) { - fl->type = 1; - fl->name = strdup(np); - fl->xdata = info; - return 1; - } else { - FreeMapInfo(info); - } + if (curopt == 0) { + // info = GetCmInfo(pathbuf); + info = NULL; + DebugLevel3Fn("GetCmInfo(%s) : %p\n" _C_ pathbuf _C_ info); + fl->type = 1; + fl->name = strdup(np); + fl->xdata = info; + return 1; + } else if (curopt == 1) { + info = GetPudInfo(pathbuf); + if (info) { + DebugLevel3Fn("GetPudInfo(%s) : %p\n" _C_ pathbuf _C_ info); + sz = szl[menu->items[8].d.pulldown.curopt]; + if (sz < 0 || (info->MapWidth == sz && info->MapHeight == sz)) { + fl->type = 1; + fl->name = strdup(np); + fl->xdata = info; + return 1; + } else { + FreeMapInfo(info); } } - } else if (p==2) { + } else { if (strcasestr(pathbuf, ".scm")) { info = GetScmInfo(pathbuf); if (info) { @@ -3359,7 +3369,7 @@ usezzf: FreeMapInfo(info); } } - } else if (strcasestr(pathbuf, ".chk")) { + } else { info = GetChkInfo(pathbuf); if (info) { DebugLevel3Fn("GetChkInfo(%s) : %p\n" _C_ pathbuf _C_ info); @@ -3374,16 +3384,6 @@ usezzf: } } } - } else { - if (strstr(pathbuf, ".cm")) { - // info = GetCmInfo(pathbuf); - info = NULL; - DebugLevel3Fn("GetCmInfo(%s) : %p\n" _C_ pathbuf _C_ info); - fl->type = 1; - fl->name = strdup(np); - fl->xdata = info; - return 1; - } } } } @@ -5261,7 +5261,7 @@ local void EditorMainLoadLBExit(Menuitem *mi) local int EditorMainLoadRDFilter(char *pathbuf, FileList *fl) { MapInfo *info; - char *suf[3]; + char *suf[4]; char *np; char *cp; char *lcp; @@ -5290,8 +5290,9 @@ local int EditorMainLoadRDFilter(char *pathbuf, FileList *fl) suf[0] = ".pud"; suf[1] = ".scm"; suf[2] = ".chk"; + suf[3] = NULL; u = 0; - do { + while (suf[u]) { cp = np; --cp; do { @@ -5302,7 +5303,10 @@ local int EditorMainLoadRDFilter(char *pathbuf, FileList *fl) break; } ++u; - } while (u < sizeof(suf)/sizeof(*suf)); + } + if (!suf[u]) { + return 0; + } if (lcp >= np) { cp = lcp + strlen(suf[u]);