From 7c32c974c7c0f8b9bbfa4076a67e84c043485f55 Mon Sep 17 00:00:00 2001 From: Peter Veenstra Date: Tue, 12 Oct 2004 09:42:25 +0000 Subject: [PATCH] work around some drive_cache corruption in find Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@2019 --- src/dos/drive_local.cpp | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/dos/drive_local.cpp b/src/dos/drive_local.cpp index f4fa8b93..2b216eed 100644 --- a/src/dos/drive_local.cpp +++ b/src/dos/drive_local.cpp @@ -16,7 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -/* $Id: drive_local.cpp,v 1.51 2004-08-13 19:43:02 qbix79 Exp $ */ +/* $Id: drive_local.cpp,v 1.52 2004-10-12 09:42:25 qbix79 Exp $ */ #include #include @@ -181,6 +181,7 @@ bool localDrive::FindNext(DOS_DTA & dta) { char * dir_ent; struct stat stat_block; char full_name[CROSS_LEN]; + char dir_entcopy[CROSS_LEN]; Bit8u srch_attr;char srch_pattern[DOS_NAMELENGTH_ASCII]; Bit8u find_attr; @@ -199,8 +200,13 @@ again: strcpy(full_name,srchInfo[id].srch_dir); strcat(full_name,dir_ent); - if (stat(dirCache.GetExpandName(full_name),&stat_block)!=0) { - goto again; + + //GetExpandName might indirectly destroy dir_ent (by caching in a new directory + //and due to its design dir_ent might be lost.) + //Copying dir_ent first + strcpy(dir_entcopy,dir_ent); + if (stat(dirCache.GetExpandName(full_name),&stat_block)!=0) { + goto again;//No symlinks and such } if(S_ISDIR(stat_block.st_mode)) find_attr=DOS_ATTR_DIRECTORY; @@ -214,20 +220,20 @@ again: /*file is okay, setup everything to be copied in DTA Block */ char find_name[DOS_NAMELENGTH_ASCII];Bit16u find_date,find_time;Bit32u find_size; - if(strlen(dir_ent)tm_year+1900,time->tm_mon+1,time->tm_mday); find_time=DOS_PackTime(time->tm_hour,time->tm_min,time->tm_sec); - }else { - find_time=6; - find_date=4; - } + } else { + find_time=6; + find_date=4; + } dta.SetResult(find_name,find_size,find_date,find_time,find_attr); return true; }