diff --git a/ftpCommandElaborate.c b/ftpCommandElaborate.c index 3d2c214..b5c8ff7 100755 --- a/ftpCommandElaborate.c +++ b/ftpCommandElaborate.c @@ -436,7 +436,6 @@ int parseCommandFeat(ftpDataType *data, int socketId) return FTP_COMMAND_PROCESSED; } - int parseCommandProt(ftpDataType *data, int socketId) { int returnCode; @@ -483,7 +482,6 @@ int parseCommandProt(ftpDataType *data, int socketId) return FTP_COMMAND_PROCESSED; } - int parseCommandCcc(ftpDataType *data, int socketId) { int returnCode; @@ -571,7 +569,6 @@ int parseCommandPbsz(ftpDataType *data, int socketId) return FTP_COMMAND_PROCESSED; } - int parseCommandTypeA(ftpDataType *data, int socketId) { int returnCode; @@ -1698,7 +1695,6 @@ int parseCommandOpts(ftpDataType *data, int socketId) return FTP_COMMAND_PROCESSED; } - int parseCommandDele(ftpDataType *data, int socketId) { int functionReturnCode = 0; @@ -1908,7 +1904,6 @@ int invalidCommandResponse(ftpDataType *data, int socketId) return FTP_COMMAND_PROCESSED; } - int parseCommandQuit(ftpDataType *data, int socketId) { int returnCode; @@ -2065,6 +2060,7 @@ int parseCommandRnfr(ftpDataType *data, int socketId) theRnfrFileName = getFtpCommandArg("RNFR", data->clients[socketId].theCommandReceived, 0); cleanDynamicStringDataType(&data->clients[socketId].renameFromFile, 0, &data->clients[socketId].memoryTable); + cleanDynamicStringDataType(&data->clients[socketId].renameFromFileWd, 0, &data->clients[socketId].memoryTable); isSafePath = getSafePath(&data->clients[socketId].renameFromFile, theRnfrFileName, &data->clients[socketId].login, &data->clients[socketId].memoryTable); @@ -2078,6 +2074,7 @@ int parseCommandRnfr(ftpDataType *data, int socketId) if ((checkUserFilePermissions(data->clients[socketId].renameFromFile.text, data->clients[socketId].login.ownerShip.uid, data->clients[socketId].login.ownerShip.gid) & FILE_PERMISSION_W) == FILE_PERMISSION_W) { returnCode = socketPrintf(data, socketId, "s", "350 RNFR accepted - file exists, ready for destination\r\n"); + setDynamicStringDataType(&data->clients[socketId].renameFromFileWd, data->clients[socketId].login.ftpPath.text, data->clients[socketId].login.ftpPath.textLen, &data->clients[socketId].memoryTable); } else { @@ -2123,13 +2120,16 @@ int parseCommandRnto(ftpDataType *data, int socketId) isSafePath = getSafePath(&data->clients[socketId].renameToFile, theRntoFileName, &data->clients[socketId].login, &data->clients[socketId].memoryTable); if (isSafePath == 1 && - data->clients[socketId].renameFromFile.textLen > 0) + data->clients[socketId].renameFromFile.textLen > 0 && + data->clients[socketId].renameFromFileWd.textLen == data->clients[socketId].login.ftpPath.textLen && + strcmp(data->clients[socketId].renameFromFileWd.text, data->clients[socketId].login.ftpPath.text) == 0) { if(FILE_IsFile(data->clients[socketId].renameToFile.text, 0) == 1) { if ((checkUserFilePermissions(data->clients[socketId].renameToFile.text, data->clients[socketId].login.ownerShip.uid, data->clients[socketId].login.ownerShip.gid) & FILE_PERMISSION_W) != FILE_PERMISSION_W) { cleanDynamicStringDataType(&data->clients[socketId].renameFromFile, 0, &data->clients[socketId].memoryTable); + cleanDynamicStringDataType(&data->clients[socketId].renameFromFileWd, 0, &data->clients[socketId].memoryTable); cleanDynamicStringDataType(&data->clients[socketId].renameToFile, 0, &data->clients[socketId].memoryTable); returnCode = socketPrintf(data, socketId, "s", "550 Error Renaming the file no permissions\r\n"); if (returnCode <= 0) @@ -2197,6 +2197,7 @@ int parseCommandRnto(ftpDataType *data, int socketId) } cleanDynamicStringDataType(&data->clients[socketId].renameFromFile, 0, &data->clients[socketId].memoryTable); + cleanDynamicStringDataType(&data->clients[socketId].renameFromFileWd, 0, &data->clients[socketId].memoryTable); cleanDynamicStringDataType(&data->clients[socketId].renameToFile, 0, &data->clients[socketId].memoryTable); if (returnCode <= 0) @@ -2338,8 +2339,6 @@ long long int writeRetrFile(ftpDataType *data, int theSocketId, long long int st return toReturn; } - - char *getFtpCommandArg(char *theCommand, char *theCommandString, int skipArgs) { char *toReturn = theCommandString + strlen(theCommand); diff --git a/ftpData.c b/ftpData.c index cbc40e3..d26bac9 100755 --- a/ftpData.c +++ b/ftpData.c @@ -827,6 +827,7 @@ void resetClientData(ftpDataType *data, int clientId, int isInitialization) //Rename from and to data init cleanDynamicStringDataType(&data->clients[clientId].renameFromFile, isInitialization, &data->clients[clientId].memoryTable); + cleanDynamicStringDataType(&data->clients[clientId].renameFromFileWd, isInitialization, &data->clients[clientId].memoryTable); cleanDynamicStringDataType(&data->clients[clientId].renameToFile, isInitialization, &data->clients[clientId].memoryTable); cleanDynamicStringDataType(&data->clients[clientId].fileToStor, isInitialization, &data->clients[clientId].memoryTable); cleanDynamicStringDataType(&data->clients[clientId].fileToRetr, isInitialization, &data->clients[clientId].memoryTable); diff --git a/ftpData.h b/ftpData.h index 315c15d..ccb53f6 100755 --- a/ftpData.h +++ b/ftpData.h @@ -213,6 +213,7 @@ struct clientData char theCommandReceived[CLIENT_COMMAND_STRING_SIZE+1]; dynamicStringDataType renameFromFile; + dynamicStringDataType renameFromFileWd; dynamicStringDataType renameToFile; dynamicStringDataType fileToStor;