diff --git a/src/shell/shell_cmds.cpp b/src/shell/shell_cmds.cpp index e63ea6c5..a8cf22bd 100644 --- a/src/shell/shell_cmds.cpp +++ b/src/shell/shell_cmds.cpp @@ -233,34 +233,38 @@ void DOS_Shell::CMD_HELP(char * args){ void DOS_Shell::CMD_RENAME(char * args){ HELP("RENAME"); StripSpaces(args); - if(!*args) {SyntaxError();return;} - if((strchr(args,'*')!=NULL) || (strchr(args,'?')!=NULL) ) { WriteOut(MSG_Get("SHELL_CMD_NO_WILD"));return;} + if (!*args) {SyntaxError();return;} + if ((strchr(args,'*')!=NULL) || (strchr(args,'?')!=NULL) ) { WriteOut(MSG_Get("SHELL_CMD_NO_WILD"));return;} char * arg1=StripWord(args); + StripSpaces(args); + if (!*args) {SyntaxError();return;} char* slash = strrchr(arg1,'\\'); - if(slash) { - slash++; + if (slash) { /* If directory specified (crystal caves installer) * rename from c:\X : rename c:\abc.exe abc.shr. - * File must appear in C:\ */ + * File must appear in C:\ + * Ren X:\A\B C => ren X:\A\B X:\A\C */ - char dir_source[DOS_PATHLENGTH]={0}; + char dir_source[DOS_PATHLENGTH + 4] = {0}; //not sure if drive portion is included in pathlength //Copy first and then modify, makes GCC happy - strcpy(dir_source,arg1); + safe_strncpy(dir_source,arg1,DOS_PATHLENGTH + 4); char* dummy = strrchr(dir_source,'\\'); - *dummy=0; - - if((strlen(dir_source) == 2) && (dir_source[1] == ':')) - strcat(dir_source,"\\"); //X: add slash - - char dir_current[DOS_PATHLENGTH + 1]; - dir_current[0] = '\\'; //Absolute addressing so we can return properly - DOS_GetCurrentDir(0,dir_current + 1); - if(!DOS_ChangeDir(dir_source)) { + if (!dummy) { //Possible due to length WriteOut(MSG_Get("SHELL_ILLEGAL_PATH")); return; } - DOS_Rename(slash,args); - DOS_ChangeDir(dir_current); + dummy++; + *dummy = 0; + + //Maybe check args for directory, as I think that isn't allowed + + //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); + strncat(target,args,CROSS_LEN); + + DOS_Rename(arg1,target); + } else { DOS_Rename(arg1,args); }