From b90d70bed57b01566f208eb0cc6eac6116a6925f Mon Sep 17 00:00:00 2001 From: Lago Date: Fri, 3 Apr 2026 23:19:10 +0200 Subject: [PATCH] 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. --- src/main.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index cf9c9e5..d09743d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -150,15 +150,16 @@ void ftpCallback(FtpOperation ftpOperation, uint32_t freeSpace, uint32_t totalSp * Called during file transfer operations. */ void ftpTransferCallback(FtpTransferOperation ftpOperation, const char *name, uint32_t transferredSize) { + const char *n = (name && name[0]) ? name : "?"; switch (ftpOperation) { case FTP_UPLOAD_START: - Serial.printf("[FTP] Upload start: %s\n", name); + Serial.printf("[FTP] Upload start: %s\n", n); ftp_transfer = true; ftp_ui_state = FTP_ST_TRANSFERRING; ftp_ui_dirty = true; break; case FTP_DOWNLOAD_START: - Serial.printf("[FTP] Download start: %s\n", name); + Serial.printf("[FTP] Download start: %s\n", n); ftp_transfer = true; ftp_ui_state = FTP_ST_TRANSFERRING; ftp_ui_dirty = true; @@ -167,14 +168,14 @@ void ftpTransferCallback(FtpTransferOperation ftpOperation, const char *name, ui case FTP_DOWNLOAD: break; // Ongoing — silent to avoid serial flood 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_ui_state = ftp_client_on ? FTP_ST_CONNECTED : FTP_ST_IDLE; ftp_ui_dirty = true; ftp_sd_dirty = true; break; case FTP_TRANSFER_ERROR: - Serial.printf("[FTP] Transfer error: %s\n", name); + Serial.printf("[FTP] Transfer error: %s\n", n); ftp_transfer = false; ftp_ui_state = ftp_client_on ? FTP_ST_CONNECTED : FTP_ST_IDLE; ftp_ui_dirty = true;