From: hno <> Date: Fri, 20 Jun 2003 00:18:46 +0000 (+0000) Subject: 2003-05-11 19:30 hno X-Git-Tag: SQUID_3_0_PRE1~116 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=7ec0ff5c44adf0bce6326c3264ec133c881592cb;p=thirdparty%2Fsquid.git 2003-05-11 19:30 hno Adds a cbdata fence to clientReadBody() to make sure there is no instabilities in PUT/POST due to aborted or failed requests. (the same Squid-2.5 commit also includes cosmetic signed/unsigned cleanup not committed here) --- diff --git a/src/client_side.cc b/src/client_side.cc index 2d2dc26ca9..bd5ef6fc87 100644 --- a/src/client_side.cc +++ b/src/client_side.cc @@ -1,6 +1,6 @@ /* - * $Id: client_side.cc,v 1.638 2003/06/18 12:34:51 robertc Exp $ + * $Id: client_side.cc,v 1.639 2003/06/19 18:18:46 hno Exp $ * * DEBUG: section 33 Client-side Routines * AUTHOR: Duane Wessels @@ -2375,7 +2375,7 @@ clientReadBody(request_t * request, char *buf, size_t size, CBCB * callback, conn->fd, (unsigned long int) conn->body.size_left, (unsigned long int) conn->in.notYetUsed, callback, request); conn->body.callback = callback; - conn->body.cbdata = cbdata; + conn->body.cbdata = cbdataReference(cbdata); conn->body.buf = buf; conn->body.bufsize = size; conn->body.request = requestLink(request); @@ -2458,9 +2458,10 @@ ClientBody::processBuffer() } /* Invoke callback function */ - void *cbdata = conn->body.cbdata; + void *cbdata; - callback(buf, size, cbdata); + if (cbdataReferenceValidDone(conn->body.cbdata, &cbdata)) + callback(buf, size, cbdata); if (request != NULL) { requestUnlink(request); /* Linked in clientReadBody */ @@ -2487,7 +2488,7 @@ clientReadBodyAbortHandler(char *buf, ssize_t size, void *data) conn->body.callback = clientReadBodyAbortHandler; conn->body.buf = bodyAbortBuf; conn->body.bufsize = sizeof(bodyAbortBuf); - conn->body.cbdata = data; + conn->body.cbdata = cbdataReference(data); } } @@ -2498,7 +2499,6 @@ clientAbortBody(request_t * request) ConnStateData *conn = request->body_connection; char *buf; CBCB *callback; - void *cbdata; request->body_connection = NULL; if (!conn || conn->body.size_left <= 0) @@ -2507,13 +2507,16 @@ clientAbortBody(request_t * request) if (conn->body.callback != NULL) { buf = conn->body.buf; callback = conn->body.callback; - cbdata = conn->body.cbdata; assert(request == conn->body.request); conn->body.buf = NULL; conn->body.callback = NULL; conn->body.cbdata = NULL; conn->body.request = NULL; - callback(buf, -1, cbdata); /* Signal abort to clientReadBody caller */ + void *cbdata; + + if (cbdataReferenceValidDone(conn->body.cbdata, &cbdata)) + callback(buf, -1, cbdata); /* Signal abort to clientReadBody caller */ + requestUnlink(request); }