fix: null-guard name in ftpTransferCallback (crash on transfer stop)
SimpleFTPServer passes null for the filename in FTP_TRANSFER_STOP from closeTransfer(). Using %s with a null pointer crashes vsnprintf. Guard all name uses with fallback to '?' if null or empty.
This commit is contained in:
+5
-4
@@ -150,15 +150,16 @@ void ftpCallback(FtpOperation ftpOperation, uint32_t freeSpace, uint32_t totalSp
|
|||||||
* Called during file transfer operations.
|
* Called during file transfer operations.
|
||||||
*/
|
*/
|
||||||
void ftpTransferCallback(FtpTransferOperation ftpOperation, const char *name, uint32_t transferredSize) {
|
void ftpTransferCallback(FtpTransferOperation ftpOperation, const char *name, uint32_t transferredSize) {
|
||||||
|
const char *n = (name && name[0]) ? name : "?";
|
||||||
switch (ftpOperation) {
|
switch (ftpOperation) {
|
||||||
case FTP_UPLOAD_START:
|
case FTP_UPLOAD_START:
|
||||||
Serial.printf("[FTP] Upload start: %s\n", name);
|
Serial.printf("[FTP] Upload start: %s\n", n);
|
||||||
ftp_transfer = true;
|
ftp_transfer = true;
|
||||||
ftp_ui_state = FTP_ST_TRANSFERRING;
|
ftp_ui_state = FTP_ST_TRANSFERRING;
|
||||||
ftp_ui_dirty = true;
|
ftp_ui_dirty = true;
|
||||||
break;
|
break;
|
||||||
case FTP_DOWNLOAD_START:
|
case FTP_DOWNLOAD_START:
|
||||||
Serial.printf("[FTP] Download start: %s\n", name);
|
Serial.printf("[FTP] Download start: %s\n", n);
|
||||||
ftp_transfer = true;
|
ftp_transfer = true;
|
||||||
ftp_ui_state = FTP_ST_TRANSFERRING;
|
ftp_ui_state = FTP_ST_TRANSFERRING;
|
||||||
ftp_ui_dirty = true;
|
ftp_ui_dirty = true;
|
||||||
@@ -167,14 +168,14 @@ void ftpTransferCallback(FtpTransferOperation ftpOperation, const char *name, ui
|
|||||||
case FTP_DOWNLOAD:
|
case FTP_DOWNLOAD:
|
||||||
break; // Ongoing — silent to avoid serial flood
|
break; // Ongoing — silent to avoid serial flood
|
||||||
case FTP_TRANSFER_STOP:
|
case FTP_TRANSFER_STOP:
|
||||||
Serial.printf("[FTP] Transfer done: %s (%u bytes)\n", name, transferredSize);
|
Serial.printf("[FTP] Transfer done: %s (%lu bytes)\n", n, (unsigned long)transferredSize);
|
||||||
ftp_transfer = false;
|
ftp_transfer = false;
|
||||||
ftp_ui_state = ftp_client_on ? FTP_ST_CONNECTED : FTP_ST_IDLE;
|
ftp_ui_state = ftp_client_on ? FTP_ST_CONNECTED : FTP_ST_IDLE;
|
||||||
ftp_ui_dirty = true;
|
ftp_ui_dirty = true;
|
||||||
ftp_sd_dirty = true;
|
ftp_sd_dirty = true;
|
||||||
break;
|
break;
|
||||||
case FTP_TRANSFER_ERROR:
|
case FTP_TRANSFER_ERROR:
|
||||||
Serial.printf("[FTP] Transfer error: %s\n", name);
|
Serial.printf("[FTP] Transfer error: %s\n", n);
|
||||||
ftp_transfer = false;
|
ftp_transfer = false;
|
||||||
ftp_ui_state = ftp_client_on ? FTP_ST_CONNECTED : FTP_ST_IDLE;
|
ftp_ui_state = ftp_client_on ? FTP_ST_CONNECTED : FTP_ST_IDLE;
|
||||||
ftp_ui_dirty = true;
|
ftp_ui_dirty = true;
|
||||||
|
|||||||
Reference in New Issue
Block a user