mirror of
https://github.com/kingk85/uFTP.git
synced 2025-07-25 13:16:12 +03:00
fix: RNFR - RNTO accepted only if run from the same WD
This commit is contained in:
@ -436,7 +436,6 @@ int parseCommandFeat(ftpDataType *data, int socketId)
|
|||||||
return FTP_COMMAND_PROCESSED;
|
return FTP_COMMAND_PROCESSED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int parseCommandProt(ftpDataType *data, int socketId)
|
int parseCommandProt(ftpDataType *data, int socketId)
|
||||||
{
|
{
|
||||||
int returnCode;
|
int returnCode;
|
||||||
@ -483,7 +482,6 @@ int parseCommandProt(ftpDataType *data, int socketId)
|
|||||||
return FTP_COMMAND_PROCESSED;
|
return FTP_COMMAND_PROCESSED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int parseCommandCcc(ftpDataType *data, int socketId)
|
int parseCommandCcc(ftpDataType *data, int socketId)
|
||||||
{
|
{
|
||||||
int returnCode;
|
int returnCode;
|
||||||
@ -571,7 +569,6 @@ int parseCommandPbsz(ftpDataType *data, int socketId)
|
|||||||
return FTP_COMMAND_PROCESSED;
|
return FTP_COMMAND_PROCESSED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int parseCommandTypeA(ftpDataType *data, int socketId)
|
int parseCommandTypeA(ftpDataType *data, int socketId)
|
||||||
{
|
{
|
||||||
int returnCode;
|
int returnCode;
|
||||||
@ -1698,7 +1695,6 @@ int parseCommandOpts(ftpDataType *data, int socketId)
|
|||||||
return FTP_COMMAND_PROCESSED;
|
return FTP_COMMAND_PROCESSED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int parseCommandDele(ftpDataType *data, int socketId)
|
int parseCommandDele(ftpDataType *data, int socketId)
|
||||||
{
|
{
|
||||||
int functionReturnCode = 0;
|
int functionReturnCode = 0;
|
||||||
@ -1908,7 +1904,6 @@ int invalidCommandResponse(ftpDataType *data, int socketId)
|
|||||||
return FTP_COMMAND_PROCESSED;
|
return FTP_COMMAND_PROCESSED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int parseCommandQuit(ftpDataType *data, int socketId)
|
int parseCommandQuit(ftpDataType *data, int socketId)
|
||||||
{
|
{
|
||||||
int returnCode;
|
int returnCode;
|
||||||
@ -2065,6 +2060,7 @@ int parseCommandRnfr(ftpDataType *data, int socketId)
|
|||||||
|
|
||||||
theRnfrFileName = getFtpCommandArg("RNFR", data->clients[socketId].theCommandReceived, 0);
|
theRnfrFileName = getFtpCommandArg("RNFR", data->clients[socketId].theCommandReceived, 0);
|
||||||
cleanDynamicStringDataType(&data->clients[socketId].renameFromFile, 0, &data->clients[socketId].memoryTable);
|
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);
|
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)
|
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");
|
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
|
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);
|
isSafePath = getSafePath(&data->clients[socketId].renameToFile, theRntoFileName, &data->clients[socketId].login, &data->clients[socketId].memoryTable);
|
||||||
|
|
||||||
if (isSafePath == 1 &&
|
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(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)
|
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].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);
|
cleanDynamicStringDataType(&data->clients[socketId].renameToFile, 0, &data->clients[socketId].memoryTable);
|
||||||
returnCode = socketPrintf(data, socketId, "s", "550 Error Renaming the file no permissions\r\n");
|
returnCode = socketPrintf(data, socketId, "s", "550 Error Renaming the file no permissions\r\n");
|
||||||
if (returnCode <= 0)
|
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].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);
|
cleanDynamicStringDataType(&data->clients[socketId].renameToFile, 0, &data->clients[socketId].memoryTable);
|
||||||
|
|
||||||
if (returnCode <= 0)
|
if (returnCode <= 0)
|
||||||
@ -2338,8 +2339,6 @@ long long int writeRetrFile(ftpDataType *data, int theSocketId, long long int st
|
|||||||
return toReturn;
|
return toReturn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
char *getFtpCommandArg(char *theCommand, char *theCommandString, int skipArgs)
|
char *getFtpCommandArg(char *theCommand, char *theCommandString, int skipArgs)
|
||||||
{
|
{
|
||||||
char *toReturn = theCommandString + strlen(theCommand);
|
char *toReturn = theCommandString + strlen(theCommand);
|
||||||
|
@ -827,6 +827,7 @@ void resetClientData(ftpDataType *data, int clientId, int isInitialization)
|
|||||||
|
|
||||||
//Rename from and to data init
|
//Rename from and to data init
|
||||||
cleanDynamicStringDataType(&data->clients[clientId].renameFromFile, isInitialization, &data->clients[clientId].memoryTable);
|
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].renameToFile, isInitialization, &data->clients[clientId].memoryTable);
|
||||||
cleanDynamicStringDataType(&data->clients[clientId].fileToStor, 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);
|
cleanDynamicStringDataType(&data->clients[clientId].fileToRetr, isInitialization, &data->clients[clientId].memoryTable);
|
||||||
|
@ -213,6 +213,7 @@ struct clientData
|
|||||||
char theCommandReceived[CLIENT_COMMAND_STRING_SIZE+1];
|
char theCommandReceived[CLIENT_COMMAND_STRING_SIZE+1];
|
||||||
|
|
||||||
dynamicStringDataType renameFromFile;
|
dynamicStringDataType renameFromFile;
|
||||||
|
dynamicStringDataType renameFromFileWd;
|
||||||
dynamicStringDataType renameToFile;
|
dynamicStringDataType renameToFile;
|
||||||
|
|
||||||
dynamicStringDataType fileToStor;
|
dynamicStringDataType fileToStor;
|
||||||
|
Reference in New Issue
Block a user