mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-08-10 09:07:02 +02:00
MEDIUM: connection: add a flag to hold the transport layer
When we start logging SSL information, we need the SSL struct to be present even past the conn_xprt_close() call. In order to achieve this, we should use refcounting on the connection and the transport layer. At the moment it's not worth using plain refcounting as only the logs require this, so instead of real refcounting we just use a flag which will be set by the log subsystem when SSL data need to be logged. What happens then is that the xprt->close() call is ignored and the transport layer is closed again during session_free(), after the log line is emitted.
This commit is contained in:
parent
91083f5c8f
commit
1e954913de
@ -46,11 +46,13 @@ static inline int conn_xprt_init(struct connection *conn)
|
||||
}
|
||||
|
||||
/* Calls the close() function of the transport layer if any, and always unsets
|
||||
* the transport layer.
|
||||
* the transport layer. However this is not done if the CO_FL_XPRT_TRACKED flag
|
||||
* is set, which allows logs to take data from the transport layer very late if
|
||||
* needed.
|
||||
*/
|
||||
static inline void conn_xprt_close(struct connection *conn)
|
||||
{
|
||||
if (conn->xprt) {
|
||||
if (conn->xprt && !(conn->flags & CO_FL_XPRT_TRACKED)) {
|
||||
if (conn->xprt->close)
|
||||
conn->xprt->close(conn);
|
||||
conn->xprt = NULL;
|
||||
|
@ -145,6 +145,12 @@ enum {
|
||||
* as DATA or SOCK on some implementations.
|
||||
*/
|
||||
CO_FL_POLL_SOCK = CO_FL_HANDSHAKE | CO_FL_WAIT_L4_CONN | CO_FL_WAIT_L6_CONN,
|
||||
|
||||
/* This last flag indicates that the transport layer is used (for instance
|
||||
* by logs) and must not be cleared yet. The last call to conn_xprt_close()
|
||||
* must be done after clearing this flag.
|
||||
*/
|
||||
CO_FL_XPRT_TRACKED = 0x80000000,
|
||||
};
|
||||
|
||||
/* target types */
|
||||
|
@ -548,6 +548,10 @@ static void session_free(struct session *s)
|
||||
|
||||
http_end_txn(s);
|
||||
|
||||
/* ensure the client-side transport layer is destroyed */
|
||||
s->si[0].conn.flags &= ~CO_FL_XPRT_TRACKED;
|
||||
conn_xprt_close(&s->si[0].conn);
|
||||
|
||||
for (i = 0; i < s->store_count; i++) {
|
||||
if (!s->store[i].ts)
|
||||
continue;
|
||||
|
Loading…
Reference in New Issue
Block a user