From c3669e3266e56a7a478b0a7235ce80d6ba137c46 Mon Sep 17 00:00:00 2001 From: Amos Jeffries Date: Sat, 12 Dec 2009 03:15:28 +1300 Subject: [PATCH] Bug 2395: FTP errors not displayed * Fix PUT and other errors hanging * Fix assertion "entry->store_status == STORE_PENDING" caused by FTP * Several variable-shadowing cases resolved for the fix. --- src/ftp.cc | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/src/ftp.cc b/src/ftp.cc index be6a163d50..ef075b0241 100644 --- a/src/ftp.cc +++ b/src/ftp.cc @@ -3497,10 +3497,11 @@ FtpStateData::failed(err_type error, int xerrno) void FtpStateData::failedErrorMessage(err_type error, int xerrno) { - ErrorState *err; + ErrorState *ftperr; const char *command, *reply; + /* Translate FTP errors into HTTP errors */ - err = NULL; + ftperr = NULL; switch (error) { @@ -3514,12 +3515,12 @@ FtpStateData::failedErrorMessage(err_type error, int xerrno) if (ctrl.replycode > 500) if (password_url) - err = errorCon(ERR_FTP_FORBIDDEN, HTTP_FORBIDDEN, fwd->request); + ftperr = errorCon(ERR_FTP_FORBIDDEN, HTTP_FORBIDDEN, fwd->request); else - err = errorCon(ERR_FTP_FORBIDDEN, HTTP_UNAUTHORIZED, fwd->request); + ftperr = errorCon(ERR_FTP_FORBIDDEN, HTTP_UNAUTHORIZED, fwd->request); else if (ctrl.replycode == 421) - err = errorCon(ERR_FTP_UNAVAILABLE, HTTP_SERVICE_UNAVAILABLE, fwd->request); + ftperr = errorCon(ERR_FTP_UNAVAILABLE, HTTP_SERVICE_UNAVAILABLE, fwd->request); break; @@ -3527,7 +3528,7 @@ FtpStateData::failedErrorMessage(err_type error, int xerrno) case SENT_RETR: if (ctrl.replycode == 550) - err = errorCon(ERR_FTP_NOT_FOUND, HTTP_NOT_FOUND, fwd->request); + ftperr = errorCon(ERR_FTP_NOT_FOUND, HTTP_NOT_FOUND, fwd->request); break; @@ -3538,20 +3539,20 @@ FtpStateData::failedErrorMessage(err_type error, int xerrno) break; case ERR_READ_TIMEOUT: - err = errorCon(error, HTTP_GATEWAY_TIMEOUT, fwd->request); + ftperr = errorCon(error, HTTP_GATEWAY_TIMEOUT, fwd->request); break; default: - err = errorCon(error, HTTP_BAD_GATEWAY, fwd->request); + ftperr = errorCon(error, HTTP_BAD_GATEWAY, fwd->request); break; } - if (err == NULL) - err = errorCon(ERR_FTP_FAILURE, HTTP_BAD_GATEWAY, fwd->request); + if (ftperr == NULL) + ftperr = errorCon(ERR_FTP_FAILURE, HTTP_BAD_GATEWAY, fwd->request); - err->xerrno = xerrno; + ftperr->xerrno = xerrno; - err->ftp.server_msg = ctrl.message; + ftperr->ftp.server_msg = ctrl.message; ctrl.message = NULL; if (old_request) @@ -3568,12 +3569,13 @@ FtpStateData::failedErrorMessage(err_type error, int xerrno) reply = ctrl.last_reply; if (command) - err->ftp.request = xstrdup(command); + ftperr->ftp.request = xstrdup(command); if (reply) - err->ftp.reply = xstrdup(reply); + ftperr->ftp.reply = xstrdup(reply); - fwd->fail(err); + entry->replaceHttpReply( ftperr->BuildHttpReply() ); + errorStateFree(ftperr); } /// \ingroup ServerProtocolFTPInternal @@ -3615,7 +3617,8 @@ ftpSendReply(FtpStateData * ftpState) else err->ftp.reply = xstrdup(""); - errorAppendEntry(ftpState->entry, err); + ftpState->entry->replaceHttpReply( err->BuildHttpReply() ); + errorStateFree(err); ftpSendQuit(ftpState); } -- 2.47.2