diff --git a/include/dos_system.h b/include/dos_system.h index b6f9918c..57157f66 100644 --- a/include/dos_system.h +++ b/include/dos_system.h @@ -256,7 +256,7 @@ public: virtual bool FileExists(const char* name)=0; virtual bool FileStat(const char* name, FileStat_Block * const stat_block)=0; virtual Bit8u GetMediaByte(void)=0; - virtual void SetDir(const char* path) { strcpy(curdir,path); }; + virtual void SetDir(const char *path) { safe_strcpy(curdir, path); }; virtual void EmptyCache(void) { dirCache.EmptyCache(); }; virtual bool isRemote(void)=0; virtual bool isRemovable(void)=0; diff --git a/src/dos/dos_files.cpp b/src/dos/dos_files.cpp index ac925e1e..e43d03c9 100644 --- a/src/dos/dos_files.cpp +++ b/src/dos/dos_files.cpp @@ -219,7 +219,7 @@ bool DOS_ChangeDir(char const * const dir) { } if (Drives[drive]->TestDir(fulldir)) { - strcpy(Drives[drive]->curdir,fulldir); + safe_strcpy(Drives[drive]->curdir, fulldir); return true; } else { DOS_SetError(DOSERR_PATH_NOT_FOUND); @@ -327,12 +327,12 @@ bool DOS_FindFirst(char * search,Bit16u attr,bool fcb_findfirst) { char * find_last; find_last=strrchr(fullsearch,'\\'); if (!find_last) { /*No dir */ - strcpy(pattern,fullsearch); + safe_strcpy(pattern, fullsearch); dir[0]=0; } else { *find_last=0; - strcpy(pattern,find_last+1); - strcpy(dir,fullsearch); + safe_strcpy(pattern, find_last + 1); + safe_strcpy(dir, fullsearch); } dta.SetupSearch(drive,(Bit8u)attr,pattern); @@ -464,7 +464,7 @@ static bool PathExists(char const * const name) { const char* leading = strrchr(name,'\\'); if(!leading) return true; char temp[CROSS_LEN]; - strcpy(temp,name); + safe_strcpy(temp, name); char * lead = strrchr(temp,'\\'); if (lead == temp) return true; *lead = 0; @@ -915,9 +915,11 @@ checkext: } savefcb: if (!hasdrive & !(parser & PARSE_DFLT_DRIVE)) fcb_name.part.drive[0] = 0; - if (!hasname & !(parser & PARSE_BLNK_FNAME)) strcpy(fcb_name.part.name," "); - if (!hasext & !(parser & PARSE_BLNK_FEXT)) strcpy(fcb_name.part.ext," "); - fcb.SetName(fcb_name.part.drive[0],fcb_name.part.name,fcb_name.part.ext); + if (!hasname & !(parser & PARSE_BLNK_FNAME)) + safe_strcpy(fcb_name.part.name, " "); + if (!hasext & !(parser & PARSE_BLNK_FEXT)) + safe_strcpy(fcb_name.part.ext, " "); + fcb.SetName(fcb_name.part.drive[0], fcb_name.part.name, fcb_name.part.ext); fcb.ClearBlockRecsize(); //Undocumented bonus work. *change=(Bit8u)(string-string_begin); return ret; diff --git a/src/dos/dos_keyboard_layout.cpp b/src/dos/dos_keyboard_layout.cpp index 2351abbf..bfeea754 100644 --- a/src/dos/dos_keyboard_layout.cpp +++ b/src/dos/dos_keyboard_layout.cpp @@ -259,7 +259,8 @@ static Bit32u read_kcl_data(Bit8u * kcl_data, Bit32u kcl_data_size, const char* Bitu keyboard_layout::read_keyboard_file(const char* keyboard_file_name, Bit32s specific_layout, Bit32s requested_codepage) { this->reset(); - if (specific_layout==-1) strcpy(current_keyboard_file_name, keyboard_file_name); + if (specific_layout == -1) + safe_strcpy(current_keyboard_file_name, keyboard_file_name); if (!strcmp(keyboard_file_name,"none")) return KEYB_NOERROR; static Bit8u read_buf[65535]; @@ -701,7 +702,7 @@ Bit16u keyboard_layout::extract_codepage(const char* keyboard_file_name) { Bitu keyboard_layout::read_codepage_file(const char* codepage_file_name, Bit32s codepage_id) { char cp_filename[512]; - strcpy(cp_filename, codepage_file_name); + safe_strcpy(cp_filename, codepage_file_name); if (!strcmp(cp_filename,"none")) return KEYB_NOERROR; if (codepage_id==dos.loaded_codepage) return KEYB_NOERROR; @@ -967,7 +968,7 @@ Bitu keyboard_layout::switch_keyboard_layout(const char* new_layout, keyboard_la if (strncasecmp(new_layout,"US",2)) { // switch to a foreign layout char tbuf[256]; - strcpy(tbuf, new_layout); + safe_strcpy(tbuf, new_layout); size_t newlen=strlen(tbuf); bool language_code_found=false; diff --git a/src/dos/dos_programs.cpp b/src/dos/dos_programs.cpp index e9e074be..36c21b7f 100644 --- a/src/dos/dos_programs.cpp +++ b/src/dos/dos_programs.cpp @@ -377,7 +377,8 @@ public: } //Copy current directory if not marked as deleted. if (newdrive->TestDir(ldp->curdir)) { - strcpy(newdrive->curdir, ldp->curdir); + safe_strcpy(newdrive->curdir, + ldp->curdir); } delete Drives[drive - 'A']; @@ -580,11 +581,11 @@ private: Section* dos_sec = control->GetSection("dos"); dos_sec->ExecuteDestroy(false); char test[20]; - strcpy(test,"umb=false"); + safe_strcpy(test, "umb=false"); dos_sec->HandleInputline(test); - strcpy(test,"xms=false"); + safe_strcpy(test, "xms=false"); dos_sec->HandleInputline(test); - strcpy(test,"ems=false"); + safe_strcpy(test, "ems=false"); dos_sec->HandleInputline(test); dos_sec->ExecuteInit(false); } @@ -1514,10 +1515,10 @@ void KEYB::Run(void) { char cp_file_name[256]; if (cmd->FindCommand(3,cp_string)) { /* third parameter is codepage file */ - strcpy(cp_file_name, cp_string.c_str()); + safe_strcpy(cp_file_name, cp_string.c_str()); } else { /* no codepage file specified, use automatic selection */ - strcpy(cp_file_name, "auto"); + safe_strcpy(cp_file_name, "auto"); } keyb_error=DOS_LoadKeyboardLayout(temp_line.c_str(), tried_cp, cp_file_name); diff --git a/src/dos/drive_iso.cpp b/src/dos/drive_iso.cpp index 011770c2..2e103630 100644 --- a/src/dos/drive_iso.cpp +++ b/src/dos/drive_iso.cpp @@ -152,7 +152,7 @@ isoDrive::isoDrive(char driveLetter, const char *fileName, Bit8u mediaid, int &e if (!error) { if (loadImage()) { - strcpy(info, "isoDrive "); + safe_strcpy(info, "isoDrive "); strcat(info, fileName); this->driveLetter = driveLetter; this->mediaid = mediaid; @@ -161,12 +161,12 @@ isoDrive::isoDrive(char driveLetter, const char *fileName, Bit8u mediaid, int &e Set_Label(buffer,discLabel,true); } else if (CDROM_Interface_Image::images[subUnit]->HasDataTrack() == false) { //Audio only cdrom - strcpy(info, "isoDrive "); + safe_strcpy(info, "isoDrive "); strcat(info, fileName); this->driveLetter = driveLetter; this->mediaid = mediaid; char buffer[32] = { 0 }; - strcpy(buffer, "Audio_CD"); + safe_strcpy(buffer, "Audio_CD"); Set_Label(buffer,discLabel,true); } else error = 6; //Corrupt image } @@ -296,7 +296,7 @@ bool isoDrive::FindNext(DOS_DTA &dta) { char findName[DOS_NAMELENGTH_ASCII]; findName[0] = 0; if(strlen((char*)de.ident) < DOS_NAMELENGTH_ASCII) { - strcpy(findName, (char*)de.ident); + safe_strcpy(findName, (char *)de.ident); upcase(findName); } Bit32u findSize = DATA_LENGTH(de); diff --git a/src/dos/drive_local.cpp b/src/dos/drive_local.cpp index ae84d83e..a187b3d3 100644 --- a/src/dos/drive_local.cpp +++ b/src/dos/drive_local.cpp @@ -36,7 +36,7 @@ bool localDrive::FileCreate(DOS_File * * file,char * name,Bit16u /*attributes*/) { //TODO Maybe care for attributes but not likely char newname[CROSS_LEN]; - strcpy(newname,basedir); + safe_strcpy(newname, basedir); strcat(newname,name); CROSS_FILENAME(newname); char* temp_name = dirCache.GetExpandName(newname); //Can only be used in till a new drive_cache action is preformed */ @@ -82,7 +82,7 @@ bool localDrive::FileOpen(DOS_File** file, char * name, Bit32u flags) { return false; } char newname[CROSS_LEN]; - strcpy(newname,basedir); + safe_strcpy(newname, basedir); strcat(newname,name); CROSS_FILENAME(newname); dirCache.ExpandName(newname); @@ -172,7 +172,7 @@ bool localDrive::FileOpen(DOS_File** file, char * name, Bit32u flags) { FILE * localDrive::GetSystemFilePtr(char const * const name, char const * const type) { char newname[CROSS_LEN]; - strcpy(newname,basedir); + safe_strcpy(newname, basedir); strcat(newname,name); CROSS_FILENAME(newname); dirCache.ExpandName(newname); @@ -191,7 +191,7 @@ bool localDrive::GetSystemFilename(char *sysName, char const * const dosName) { bool localDrive::FileUnlink(char * name) { char newname[CROSS_LEN]; - strcpy(newname,basedir); + safe_strcpy(newname, basedir); strcat(newname,name); CROSS_FILENAME(newname); char *fullname = dirCache.GetExpandName(newname); @@ -232,7 +232,7 @@ bool localDrive::FileUnlink(char * name) { bool localDrive::FindFirst(char * _dir,DOS_DTA & dta,bool fcb_findfirst) { char tempDir[CROSS_LEN]; - strcpy(tempDir,basedir); + safe_strcpy(tempDir, basedir); strcat(tempDir,_dir); CROSS_FILENAME(tempDir); @@ -248,7 +248,7 @@ bool localDrive::FindFirst(char * _dir,DOS_DTA & dta,bool fcb_findfirst) { DOS_SetError(DOSERR_PATH_NOT_FOUND); return false; } - strcpy(srchInfo[id].srch_dir,tempDir); + safe_strcpy(srchInfo[id].srch_dir, tempDir); dta.SetDirID(id); Bit8u sAttr; @@ -303,13 +303,13 @@ again: } if (!WildFileCmp(dir_ent,srch_pattern)) goto again; - strcpy(full_name,srchInfo[id].srch_dir); + safe_strcpy(full_name, srchInfo[id].srch_dir); strcat(full_name,dir_ent); //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); + safe_strcpy(dir_entcopy, dir_ent); if (stat(dirCache.GetExpandName(full_name),&stat_block)!=0) { goto again;//No symlinks and such } @@ -322,7 +322,7 @@ again: char find_name[DOS_NAMELENGTH_ASCII];Bit16u find_date,find_time;Bit32u find_size; if (strlen(dir_entcopy)FindCommand(3, temp_line)) { udpPort = 213; diff --git a/src/misc/cross.cpp b/src/misc/cross.cpp index cdded36b..1ea6e552 100644 --- a/src/misc/cross.cpp +++ b/src/misc/cross.cpp @@ -312,7 +312,7 @@ bool read_directory_next(dir_information* dirp, char* entry_name, bool& is_direc static char buffer[2 * CROSS_LEN + 1] = { 0 }; static char split[2] = { CROSS_FILESPLIT , 0 }; buffer[0] = 0; - strcpy(buffer,dirp->base_path); + safe_strcpy(buffer, dirp->base_path); size_t buflen = strlen(buffer); if (buflen && buffer[buflen - 1] != CROSS_FILESPLIT ) strcat(buffer, split); strcat(buffer,entry_name); diff --git a/src/misc/messages.cpp b/src/misc/messages.cpp index a28c410b..b0a088a8 100644 --- a/src/misc/messages.cpp +++ b/src/misc/messages.cpp @@ -95,8 +95,8 @@ static void LoadMessageFile(const char * fname) { /* New string name */ if (linein[0]==':') { string[0]=0; - strcpy(name,linein+1); - /* End of string marker */ + safe_strcpy(name, linein + 1); + /* End of string marker */ } else if (linein[0]=='.') { /* Replace/Add the string to the internal languagefile */ /* Remove last newline (marker is \n.\n) */ diff --git a/src/shell/shell.cpp b/src/shell/shell.cpp index bb95eeb9..444592ae 100644 --- a/src/shell/shell.cpp +++ b/src/shell/shell.cpp @@ -329,7 +329,7 @@ void DOS_Shell::Run(void) { char input_line[CMD_MAXLINE] = {0}; std::string line; if (cmd->FindStringRemainBegin("/C",line)) { - strcpy(input_line,line.c_str()); + safe_strcpy(input_line, line.c_str()); char* sep = strpbrk(input_line,"\r\n"); //GTA installer if (sep) *sep = 0; DOS_Shell temp; @@ -351,7 +351,7 @@ void DOS_Shell::Run(void) { if (machine == MCH_HERC) WriteOut(MSG_Get("SHELL_STARTUP_HERC")); WriteOut(MSG_Get("SHELL_STARTUP_END")); - strcpy(input_line,line.c_str()); + safe_strcpy(input_line, line.c_str()); line.erase(); ParseLine(input_line); } else { @@ -775,7 +775,7 @@ void SHELL_Init() { CommandTail tail; tail.count=(Bit8u)strlen(init_line); memset(&tail.buffer,0,127); - strcpy(tail.buffer,init_line); + safe_strcpy(tail.buffer, init_line); MEM_BlockWrite(PhysMake(psp_seg,128),&tail,128); /* Setup internal DOS Variables */ diff --git a/src/shell/shell_cmds.cpp b/src/shell/shell_cmds.cpp index fb97a4be..a53b0a85 100644 --- a/src/shell/shell_cmds.cpp +++ b/src/shell/shell_cmds.cpp @@ -268,7 +268,7 @@ void DOS_Shell::CMD_RENAME(char * args){ //dir_source and target are introduced for when we support multiple files being renamed. char target[DOS_PATHLENGTH+CROSS_LEN + 5] = {0}; - strcpy(target,dir_source); + safe_strcpy(target, dir_source); strncat(target,args,CROSS_LEN); DOS_Rename(arg1,target); @@ -874,12 +874,12 @@ void DOS_Shell::CMD_COPY(char * args) { dta.GetResult(name,size,date,time,attr); if ((attr & DOS_ATTR_DIRECTORY) == 0) { - strcpy(nameSource,pathSource); + safe_strcpy(nameSource, pathSource); strcat(nameSource,name); // Open Source if (DOS_OpenFile(nameSource,0,&sourceHandle)) { // Create Target or open it if in concat mode - strcpy(nameTarget,pathTarget); + safe_strcpy(nameTarget, pathTarget); if (nameTarget[strlen(nameTarget) - 1] == '\\') strcat(nameTarget,name); //Special variable to ensure that copy * a_file, where a_file is not a directory concats. @@ -1248,7 +1248,7 @@ void DOS_Shell::CMD_SUBST (char * args) { char mountstring[DOS_PATHLENGTH+CROSS_LEN+20]; char temp_str[2] = { 0,0 }; try { - strcpy(mountstring,"MOUNT "); + safe_strcpy(mountstring, "MOUNT "); StripSpaces(args); std::string arg; CommandLine command(0,args); @@ -1275,7 +1275,7 @@ void DOS_Shell::CMD_SUBST (char * args) { if ( ( ldp=dynamic_cast(Drives[drive])) == 0 ) throw 0; char newname[CROSS_LEN]; - strcpy(newname, ldp->getBasedir()); + safe_strcpy(newname, ldp->getBasedir()); strcat(newname,fulldir); CROSS_FILENAME(newname); ldp->dirCache.ExpandName(newname); diff --git a/src/shell/shell_misc.cpp b/src/shell/shell_misc.cpp index 2be97db6..af547010 100644 --- a/src/shell/shell_misc.cpp +++ b/src/shell/shell_misc.cpp @@ -273,8 +273,8 @@ void DOS_Shell::InputCommand(char * line) { strncat(mask, "*",DOS_PATHLENGTH - 1); else strncat(mask, "*.*",DOS_PATHLENGTH - 1); } else { - strcpy(mask, "*.*"); - } + safe_strcpy(mask, "*.*"); + } RealPt save_dta=dos.dta(); dos.dta(dos.tables.tempdta); @@ -413,7 +413,7 @@ bool DOS_Shell::Execute(char * name,char * args) { /* Check for a full name */ p_fullname = Which(name); if (!p_fullname) return false; - strcpy(fullname,p_fullname); + safe_strcpy(fullname, p_fullname); const char* extension = strrchr(fullname,'.'); /*always disallow files without extension from being executed. */ @@ -424,22 +424,22 @@ bool DOS_Shell::Execute(char * name,char * args) { if(strlen(fullname) >( DOS_PATHLENGTH - 1) ) return false; char temp_name[DOS_PATHLENGTH+4],* temp_fullname; //try to add .com, .exe and .bat extensions to filename - - strcpy(temp_name,fullname); + + safe_strcpy(temp_name, fullname); strcat(temp_name,".COM"); temp_fullname=Which(temp_name); if (temp_fullname) { extension=".com";strcpy(fullname,temp_fullname); } else { - strcpy(temp_name,fullname); + safe_strcpy(temp_name, fullname); strcat(temp_name,".EXE"); temp_fullname=Which(temp_name); if (temp_fullname) { extension=".exe";strcpy(fullname,temp_fullname);} else { - strcpy(temp_name,fullname); + safe_strcpy(temp_name, fullname); strcat(temp_name,".BAT"); temp_fullname=Which(temp_name); if (temp_fullname) { extension=".bat";strcpy(fullname,temp_fullname);}