From: Amos Jeffries Date: Sun, 29 Jul 2012 06:10:44 +0000 (+1200) Subject: Bug 3580: IDENT request makes squid crash X-Git-Tag: sourceformat-review-1~155 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fdde4c47c2c251b5cdf63c6c60a8a595ef3dccea;p=thirdparty%2Fsquid.git Bug 3580: IDENT request makes squid crash --- diff --git a/src/ident/Ident.cc b/src/ident/Ident.cc index 46d97b851f..f5e37e454a 100644 --- a/src/ident/Ident.cc +++ b/src/ident/Ident.cc @@ -68,6 +68,7 @@ typedef struct _IdentStateData { // TODO: make these all a series of Async job calls. They are self-contained callbacks now. static IOCB ReadReply; +static IOCB WriteFeedback; static CLCB Close; static CTCB Timeout; static CNCB ConnectDone; @@ -154,8 +155,9 @@ Ident::ConnectDone(const Comm::ConnectionPointer &conn, comm_err_t status, int x mb.Printf("%d, %d\r\n", conn->remote.GetPort(), conn->local.GetPort()); - AsyncCall::Pointer nil; - Comm::Write(conn, &mb, nil); + AsyncCall::Pointer writeCall = commCbCall(5,4, "Ident::WriteFeedback", + CommIoCbPtrFun(Ident::WriteFeedback, state)); + Comm::Write(conn, &mb, writeCall); AsyncCall::Pointer readCall = commCbCall(5,4, "Ident::ReadReply", CommIoCbPtrFun(Ident::ReadReply, state)); comm_read(conn, state->buf, IDENT_BUFSIZE, readCall); @@ -164,6 +166,18 @@ Ident::ConnectDone(const Comm::ConnectionPointer &conn, comm_err_t status, int x commSetConnTimeout(conn, Ident::TheConfig.timeout, timeoutCall); } +void +Ident::WriteFeedback(const Comm::ConnectionPointer &conn, char *buf, size_t len, comm_err_t flag, int xerrno, void *data) +{ + debugs(30, 5, HERE << conn << ": Wrote IDENT request " << len << " bytes."); + + // TODO handle write errors better. retry or abort? + if (flag != COMM_OK) { + debugs(30, 2, HERE << conn << " err-flags=" << flag << " IDENT write error: " << xstrerr(xerrno)); + conn->close(); + } +} + void Ident::ReadReply(const Comm::ConnectionPointer &conn, char *buf, size_t len, comm_err_t flag, int xerrno, void *data) { @@ -251,6 +265,7 @@ Ident::Start(const Comm::ConnectionPointer &conn, IDCB * callback, void *data) state->conn = conn->copyDetails(); // NP: use random port for secure outbound to IDENT_PORT state->conn->local.SetPort(0); + state->conn->remote.SetPort(IDENT_PORT); ClientAdd(state, callback, data); hash_join(ident_hash, &state->hash);