From b4e293558266d9ae2f7971c682ac0846972005f8 Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun Date: Fri, 5 Mar 2010 18:08:11 +0100 Subject: waitress: Abort reading if server closes connection Caused infinite loops under certain circumstances. --- libwaitress/src/waitress.c | 4 ++++ libwaitress/src/waitress.h | 5 +++-- 2 files changed, 7 insertions(+), 2 deletions(-) (limited to 'libwaitress') diff --git a/libwaitress/src/waitress.c b/libwaitress/src/waitress.c index 26ed493..70a1547 100644 --- a/libwaitress/src/waitress.c +++ b/libwaitress/src/waitress.c @@ -394,6 +394,10 @@ WaitressReturn_t WaitressFetchCall (WaitressHandle_t *waith) { nextLine = recvBuf; while (hdrParseMode != HDRM_FINISHED) { READ_RET (recvBuf+bufFilled, sizeof (recvBuf)-1 - bufFilled, &recvSize); + if (recvSize == 0) { + /* connection closed too early */ + CLOSE_RET (WAITRESS_RET_CONNECTION_CLOSED); + } bufFilled += recvSize; memset (recvBuf+bufFilled, 0, sizeof (recvBuf) - bufFilled); thisLine = recvBuf; diff --git a/libwaitress/src/waitress.h b/libwaitress/src/waitress.h index 5c266ae..5fa1874 100644 --- a/libwaitress/src/waitress.h +++ b/libwaitress/src/waitress.h @@ -55,8 +55,9 @@ typedef enum {WAITRESS_RET_ERR = 0, WAITRESS_RET_OK, WAITRESS_RET_STATUS_UNKNOWN WAITRESS_RET_NOTFOUND, WAITRESS_RET_FORBIDDEN, WAITRESS_RET_CONNECT_REFUSED, WAITRESS_RET_SOCK_ERR, WAITRESS_RET_GETADDR_ERR, WAITRESS_RET_CB_ABORT, WAITRESS_RET_HDR_OVERFLOW, - WAITRESS_RET_PARTIAL_FILE, WAITRESS_RET_TIMEOUT, WAITRESS_RET_READ_ERR} - WaitressReturn_t; + WAITRESS_RET_PARTIAL_FILE, WAITRESS_RET_TIMEOUT, WAITRESS_RET_READ_ERR, + WAITRESS_RET_CONNECTION_CLOSED +} WaitressReturn_t; void WaitressInit (WaitressHandle_t *); void WaitressFree (WaitressHandle_t *); -- cgit v1.2.3