]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MEDIUM: session: use the pointer to the origin instead of s->si[0].end
authorWilly Tarreau <w@1wt.eu>
Fri, 3 Apr 2015 17:19:59 +0000 (19:19 +0200)
committerWilly Tarreau <w@1wt.eu>
Mon, 6 Apr 2015 09:34:29 +0000 (11:34 +0200)
When s->si[0].end was dereferenced as a connection or anything in
order to retrieve information about the originating session, we'll
now use sess->origin instead so that when we have to chain multiple
streams in HTTP/2, we'll keep accessing the same origin.

src/backend.c
src/dumpstats.c
src/frontend.c
src/hlua.c
src/log.c
src/proto_http.c
src/proto_tcp.c
src/ssl_sock.c
src/stream.c

index 921dad04cef59328ffaca0a87a2992ced274ca59..2c2a61e7a7287c9208693fae73cec0ee0c64e573 100644 (file)
@@ -607,7 +607,7 @@ int assign_server(struct stream *s)
 
                        switch (s->be->lbprm.algo & BE_LB_PARM) {
                        case BE_LB_HASH_SRC:
-                               conn = objt_conn(s->si[0].end);
+                               conn = objt_conn(strm_sess(s)->origin);
                                if (conn && conn->addr.from.ss_family == AF_INET) {
                                        srv = get_server_sh(s->be,
                                                            (void *)&((struct sockaddr_in *)&conn->addr.from)->sin_addr,
@@ -746,7 +746,7 @@ int assign_server(struct stream *s)
  */
 int assign_server_address(struct stream *s)
 {
-       struct connection *cli_conn = objt_conn(s->si[0].end);
+       struct connection *cli_conn = objt_conn(strm_sess(s)->origin);
        struct connection *srv_conn = objt_conn(s->si[1].end);
 
 #ifdef DEBUG_FULL
@@ -966,7 +966,7 @@ static void assign_tproxy_address(struct stream *s)
        case CO_SRC_TPROXY_CLI:
        case CO_SRC_TPROXY_CIP:
                /* FIXME: what can we do if the client connects in IPv6 or unix socket ? */
-               cli_conn = objt_conn(s->si[0].end);
+               cli_conn = objt_conn(strm_sess(s)->origin);
                if (cli_conn)
                        srv_conn->addr.from = cli_conn->addr.from;
                else
@@ -1074,7 +1074,7 @@ int connect_server(struct stream *s)
                srv_conn->send_proxy_ofs = 0;
                if (objt_server(s->target) && objt_server(s->target)->pp_opts) {
                        srv_conn->send_proxy_ofs = 1; /* must compute size */
-                       cli_conn = objt_conn(s->si[0].end);
+                       cli_conn = objt_conn(strm_sess(s)->origin);
                        if (cli_conn)
                                conn_get_to_addr(cli_conn);
                }
index 1562078ab7bad883410631ceebd27bb504dd7566..2aed81a71173c4cdb91ada48440178ebe6b5de24 100644 (file)
@@ -5022,7 +5022,7 @@ static int stats_dump_full_sess_to_buffer(struct stream_interface *si, struct st
                             sess->uniq_id,
                             strm_sess(sess)->listener && strm_sess(sess)->listener->proto->name ? strm_sess(sess)->listener->proto->name : "?");
 
-               conn = objt_conn(sess->si[0].end);
+               conn = objt_conn(strm_sess(sess)->origin);
                switch (conn ? addr_to_str(&conn->addr.from, pn, sizeof(pn)) : AF_UNSPEC) {
                case AF_INET:
                case AF_INET6:
@@ -5604,7 +5604,7 @@ static int stats_dump_sess_to_buffer(struct stream_interface *si)
                                     strm_sess(curr_sess)->listener->proto->name);
 
 
-                       conn = objt_conn(curr_sess->si[0].end);
+                       conn = objt_conn(strm_sess(curr_sess)->origin);
                        switch (conn ? addr_to_str(&conn->addr.from, pn, sizeof(pn)) : AF_UNSPEC) {
                        case AF_INET:
                        case AF_INET6:
index 1b3abfa05dfc9f11eb72ec9cef1f620012265db4..caf0fc238d181c9ccdd9ada0a5524ac73d590bed 100644 (file)
@@ -55,7 +55,7 @@
 int frontend_accept(struct stream *s)
 {
        struct session *sess = s->sess;
-       struct connection *conn = __objt_conn(s->si[0].end);
+       struct connection *conn = __objt_conn(sess->origin);
        struct listener *l = sess->listener;
        struct proxy *fe = sess->fe;
 
index 363c09b28c64ab88dfef1760cde635a36cc28bbc..650051abe1f380a6da7553f9699f9fce0902daac 100644 (file)
@@ -3505,7 +3505,7 @@ __LJMP static int hlua_txn_set_tos(lua_State *L)
        htxn = MAY_LJMP(hlua_checktxn(L, 1));
        tos = MAY_LJMP(luaL_checkinteger(L, 2));
 
-       if ((cli_conn = objt_conn(htxn->s->si[0].end)) && conn_ctrl_ready(cli_conn))
+       if ((cli_conn = objt_conn(htxn->s->sess->origin)) && conn_ctrl_ready(cli_conn))
                inet_set_tos(cli_conn->t.sock.fd, cli_conn->addr.from, tos);
 
        return 0;
@@ -3522,7 +3522,7 @@ __LJMP static int hlua_txn_set_mark(lua_State *L)
        htxn = MAY_LJMP(hlua_checktxn(L, 1));
        mark = MAY_LJMP(luaL_checkinteger(L, 2));
 
-       if ((cli_conn = objt_conn(htxn->s->si[0].end)) && conn_ctrl_ready(cli_conn))
+       if ((cli_conn = objt_conn(htxn->s->sess->origin)) && conn_ctrl_ready(cli_conn))
                setsockopt(cli_conn->t.sock.fd, SOL_SOCKET, SO_MARK, &mark, sizeof(mark));
 #endif
        return 0;
index 80ac98956121507c95273b7b345ea87d7c817024..d2f8ad55908f16dbb30097b11ae5e5a914b603ce 100644 (file)
--- a/src/log.c
+++ b/src/log.c
@@ -986,7 +986,7 @@ int build_logline(struct stream *s, char *dst, size_t maxsize, struct list *list
                                break;
 
                        case LOG_FMT_CLIENTIP:  // %ci
-                               conn = objt_conn(s->si[0].end);
+                               conn = objt_conn(sess->origin);
                                if (conn)
                                        ret = lf_ip(tmplog, (struct sockaddr *)&conn->addr.from, dst + maxsize - tmplog, tmp);
                                else
@@ -998,7 +998,7 @@ int build_logline(struct stream *s, char *dst, size_t maxsize, struct list *list
                                break;
 
                        case LOG_FMT_CLIENTPORT:  // %cp
-                               conn = objt_conn(s->si[0].end);
+                               conn = objt_conn(sess->origin);
                                if (conn) {
                                        if (conn->addr.from.ss_family == AF_UNIX) {
                                                ret = ltoa_o(sess->listener->luid, tmplog, dst + maxsize - tmplog);
@@ -1017,7 +1017,7 @@ int build_logline(struct stream *s, char *dst, size_t maxsize, struct list *list
                                break;
 
                        case LOG_FMT_FRONTENDIP: // %fi
-                               conn = objt_conn(s->si[0].end);
+                               conn = objt_conn(sess->origin);
                                if (conn) {
                                        conn_get_to_addr(conn);
                                        ret = lf_ip(tmplog, (struct sockaddr *)&conn->addr.to, dst + maxsize - tmplog, tmp);
@@ -1032,7 +1032,7 @@ int build_logline(struct stream *s, char *dst, size_t maxsize, struct list *list
                                break;
 
                        case  LOG_FMT_FRONTENDPORT: // %fp
-                               conn = objt_conn(s->si[0].end);
+                               conn = objt_conn(sess->origin);
                                if (conn) {
                                        conn_get_to_addr(conn);
                                        if (conn->addr.to.ss_family == AF_UNIX)
@@ -1193,7 +1193,7 @@ int build_logline(struct stream *s, char *dst, size_t maxsize, struct list *list
 #ifdef USE_OPENSSL
                        case LOG_FMT_SSL_CIPHER: // %sslc
                                src = NULL;
-                               conn = objt_conn(s->si[0].end);
+                               conn = objt_conn(sess->origin);
                                if (conn) {
                                        if (sess->listener->xprt == &ssl_sock)
                                                src = ssl_sock_get_cipher_name(conn);
@@ -1207,7 +1207,7 @@ int build_logline(struct stream *s, char *dst, size_t maxsize, struct list *list
 
                        case LOG_FMT_SSL_VERSION: // %sslv
                                src = NULL;
-                               conn = objt_conn(s->si[0].end);
+                               conn = objt_conn(sess->origin);
                                if (conn) {
                                        if (sess->listener->xprt == &ssl_sock)
                                                src = ssl_sock_get_proto_version(conn);
index 0c7bbc4e810ea9c218697b8a858d22e05f6e9c79..3e874701ce5dd1762704328d07c78a18c3795d0e 100644 (file)
@@ -2772,12 +2772,13 @@ int http_wait_for_request(struct stream *s, struct channel *req, int an_bit)
                req->flags |= CF_READ_DONTWAIT; /* try to get back here ASAP */
                s->res.flags &= ~CF_EXPECT_MORE; /* speed up sending a previous response */
 #ifdef TCP_QUICKACK
-               if (sess->listener->options & LI_O_NOQUICKACK && req->buf->i && objt_conn(s->si[0].end) && conn_ctrl_ready(__objt_conn(s->si[0].end))) {
+               if (sess->listener->options & LI_O_NOQUICKACK && req->buf->i &&
+                   objt_conn(sess->origin) && conn_ctrl_ready(__objt_conn(sess->origin))) {
                        /* We need more data, we have to re-enable quick-ack in case we
                         * previously disabled it, otherwise we might cause the client
                         * to delay next data.
                         */
-                       setsockopt(__objt_conn(s->si[0].end)->t.sock.fd, IPPROTO_TCP, TCP_QUICKACK, &one, sizeof(one));
+                       setsockopt(__objt_conn(sess->origin)->t.sock.fd, IPPROTO_TCP, TCP_QUICKACK, &one, sizeof(one));
                }
 #endif
 
@@ -3325,6 +3326,7 @@ static int http_transform_header(struct stream* s, struct http_msg *msg,
 enum rule_result
 http_req_get_intercept_rule(struct proxy *px, struct list *rules, struct stream *s, struct http_txn *txn)
 {
+       struct session *sess = strm_sess(s);
        struct connection *cli_conn;
        struct http_req_rule *rule;
        struct hdr_ctx ctx;
@@ -3400,13 +3402,13 @@ resume_execution:
                        break;
 
                case HTTP_REQ_ACT_SET_TOS:
-                       if ((cli_conn = objt_conn(s->si[0].end)) && conn_ctrl_ready(cli_conn))
+                       if ((cli_conn = objt_conn(sess->origin)) && conn_ctrl_ready(cli_conn))
                                inet_set_tos(cli_conn->t.sock.fd, cli_conn->addr.from, rule->arg.tos);
                        break;
 
                case HTTP_REQ_ACT_SET_MARK:
 #ifdef SO_MARK
-                       if ((cli_conn = objt_conn(s->si[0].end)) && conn_ctrl_ready(cli_conn))
+                       if ((cli_conn = objt_conn(sess->origin)) && conn_ctrl_ready(cli_conn))
                                setsockopt(cli_conn->t.sock.fd, SOL_SOCKET, SO_MARK, &rule->arg.mark, sizeof(rule->arg.mark));
 #endif
                        break;
@@ -3577,7 +3579,7 @@ resume_execution:
                                                                       t->data_arg[STKTABLE_DT_HTTP_REQ_RATE].u, 1);
 
                                        stkctr_set_flags(&s->stkctr[http_req_trk_idx(rule->action)], STKCTR_TRACK_CONTENT);
-                                       if (strm_sess(s)->fe != s->be)
+                                       if (sess->fe != s->be)
                                                stkctr_set_flags(&s->stkctr[http_req_trk_idx(rule->action)], STKCTR_TRACK_BACKEND);
                                }
                        }
@@ -3600,6 +3602,7 @@ resume_execution:
 static enum rule_result
 http_res_get_intercept_rule(struct proxy *px, struct list *rules, struct stream *s, struct http_txn *txn)
 {
+       struct session *sess = strm_sess(s);
        struct connection *cli_conn;
        struct http_res_rule *rule;
        struct hdr_ctx ctx;
@@ -3647,13 +3650,13 @@ resume_execution:
                        break;
 
                case HTTP_RES_ACT_SET_TOS:
-                       if ((cli_conn = objt_conn(s->si[0].end)) && conn_ctrl_ready(cli_conn))
+                       if ((cli_conn = objt_conn(sess->origin)) && conn_ctrl_ready(cli_conn))
                                inet_set_tos(cli_conn->t.sock.fd, cli_conn->addr.from, rule->arg.tos);
                        break;
 
                case HTTP_RES_ACT_SET_MARK:
 #ifdef SO_MARK
-                       if ((cli_conn = objt_conn(s->si[0].end)) && conn_ctrl_ready(cli_conn))
+                       if ((cli_conn = objt_conn(sess->origin)) && conn_ctrl_ready(cli_conn))
                                setsockopt(cli_conn->t.sock.fd, SOL_SOCKET, SO_MARK, &rule->arg.mark, sizeof(rule->arg.mark));
 #endif
                        break;
@@ -8589,6 +8592,7 @@ void http_capture_bad_message(struct error_snapshot *es, struct stream *s,
                               struct http_msg *msg,
                              enum ht_state state, struct proxy *other_end)
 {
+       struct session *sess = strm_sess(s);
        struct channel *chn = msg->chn;
        int len1, len2;
 
@@ -8610,8 +8614,8 @@ void http_capture_bad_message(struct error_snapshot *es, struct stream *s,
        es->sid  = s->uniq_id;
        es->srv  = objt_server(s->target);
        es->oe   = other_end;
-       if (objt_conn(s->si[0].end))
-               es->src  = __objt_conn(s->si[0].end)->addr.from;
+       if (objt_conn(sess->origin))
+               es->src  = __objt_conn(sess->origin)->addr.from;
        else
                memset(&es->src, 0, sizeof(es->src));
 
@@ -8765,10 +8769,12 @@ unsigned int http_get_fhdr(const struct http_msg *msg, const char *hname, int hl
  */
 void debug_hdr(const char *dir, struct stream *s, const char *start, const char *end)
 {
+       struct session *sess = strm_sess(s);
        int max;
+
        chunk_printf(&trash, "%08x:%s.%s[%04x:%04x]: ", s->uniq_id, s->be->id,
                      dir,
-                    objt_conn(s->si[0].end) ? (unsigned short)objt_conn(s->si[0].end)->t.sock.fd : -1,
+                    objt_conn(sess->origin) ? (unsigned short)objt_conn(sess->origin)->t.sock.fd : -1,
                     objt_conn(s->si[1].end) ? (unsigned short)objt_conn(s->si[1].end)->t.sock.fd : -1);
 
        for (max = 0; start + max < end; max++)
@@ -10585,7 +10591,8 @@ smp_fetch_base32_src(struct proxy *px, struct stream *l4, void *l7, unsigned int
                      const struct arg *args, struct sample *smp, const char *kw, void *private)
 {
        struct chunk *temp;
-       struct connection *cli_conn = objt_conn(l4->si[0].end);
+       struct session *sess = strm_sess(l4);
+       struct connection *cli_conn = objt_conn(sess->origin);
 
        if (!cli_conn)
                return 0;
@@ -11374,7 +11381,8 @@ smp_fetch_url32_src(struct proxy *px, struct stream *l4, void *l7, unsigned int
                      const struct arg *args, struct sample *smp, const char *kw, void *private)
 {
        struct chunk *temp;
-       struct connection *cli_conn = objt_conn(l4->si[0].end);
+       struct session *sess = strm_sess(l4);
+       struct connection *cli_conn = objt_conn(sess->origin);
 
        if (!smp_fetch_url32(px, l4, l7, opt, args, smp, kw, private))
                return 0;
index 67404cfe54a06976652de7adb37505cd4b2174cf..6a67785a47196d25242f9334930e67c07f7ab866 100644 (file)
@@ -1366,7 +1366,7 @@ int tcp_exec_req_rules(struct stream *s)
        struct tcp_rule *rule;
        struct stksess *ts;
        struct stktable *t = NULL;
-       struct connection *conn = objt_conn(s->si[0].end);
+       struct connection *conn = objt_conn(sess->origin);
        int result = 1;
        enum acl_test_res ret;
 
@@ -1968,7 +1968,8 @@ static int
 smp_fetch_src(struct proxy *px, struct stream *l4, void *l7, unsigned int opt,
               const struct arg *args, struct sample *smp, const char *kw, void *private)
 {
-       struct connection *cli_conn = objt_conn(l4->si[0].end);
+       struct session *sess = strm_sess(l4);
+       struct connection *cli_conn = objt_conn(sess->origin);
 
        if (!cli_conn)
                return 0;
@@ -1995,7 +1996,8 @@ static int
 smp_fetch_sport(struct proxy *px, struct stream *l4, void *l7, unsigned int opt,
                 const struct arg *args, struct sample *smp, const char *k, void *private)
 {
-       struct connection *cli_conn = objt_conn(l4->si[0].end);
+       struct session *sess = strm_sess(l4);
+       struct connection *cli_conn = objt_conn(sess->origin);
 
        if (!cli_conn)
                return 0;
@@ -2013,7 +2015,8 @@ static int
 smp_fetch_dst(struct proxy *px, struct stream *l4, void *l7, unsigned int opt,
               const struct arg *args, struct sample *smp, const char *kw, void *private)
 {
-       struct connection *cli_conn = objt_conn(l4->si[0].end);
+       struct session *sess = strm_sess(l4);
+       struct connection *cli_conn = objt_conn(sess->origin);
 
        if (!cli_conn)
                return 0;
@@ -2042,7 +2045,8 @@ static int
 smp_fetch_dport(struct proxy *px, struct stream *l4, void *l7, unsigned int opt,
                 const struct arg *args, struct sample *smp, const char *kw, void *private)
 {
-       struct connection *cli_conn = objt_conn(l4->si[0].end);
+       struct session *sess = strm_sess(l4);
+       struct connection *cli_conn = objt_conn(sess->origin);
 
        if (!cli_conn)
                return 0;
index f695309f385c0bc3f8a944b16907d015b3972742..39d759ed129a934344187a2570b2f348b8d04224 100644 (file)
@@ -77,6 +77,7 @@
 #include <proto/proxy.h>
 #include <proto/shctx.h>
 #include <proto/ssl_sock.h>
+#include <proto/stream.h>
 #include <proto/task.h>
 
 /* Warning, these are bits, not integers! */
@@ -3087,11 +3088,12 @@ smp_fetch_ssl_fc_has_crt(struct proxy *px, struct stream *l4, void *l7, unsigned
                          const struct arg *args, struct sample *smp, const char *kw, void *private)
 {
        struct connection *conn;
+       struct session *sess = l4->sess;
 
        if (!l4)
                return 0;
 
-       conn = objt_conn(l4->si[0].end);
+       conn = objt_conn(sess->origin);
        if (!conn || conn->xprt != &ssl_sock)
                return 0;
 
@@ -3119,12 +3121,13 @@ smp_fetch_ssl_x_der(struct proxy *px, struct stream *l4, void *l7, unsigned int
        X509 *crt = NULL;
        int ret = 0;
        struct chunk *smp_trash;
+       struct session *sess = strm_sess(l4);
        struct connection *conn;
 
        if (!l4)
                return 0;
 
-       conn = objt_conn(l4->si[0].end);
+       conn = objt_conn(sess->origin);
        if (!conn || conn->xprt != &ssl_sock)
                return 0;
 
@@ -3167,12 +3170,13 @@ smp_fetch_ssl_x_serial(struct proxy *px, struct stream *l4, void *l7, unsigned i
        X509 *crt = NULL;
        int ret = 0;
        struct chunk *smp_trash;
+       struct session *sess = strm_sess(l4);
        struct connection *conn;
 
        if (!l4)
                return 0;
 
-       conn = objt_conn(l4->si[0].end);
+       conn = objt_conn(sess->origin);
        if (!conn || conn->xprt != &ssl_sock)
                return 0;
 
@@ -3216,12 +3220,13 @@ smp_fetch_ssl_x_sha1(struct proxy *px, struct stream *l4, void *l7, unsigned int
        const EVP_MD *digest;
        int ret = 0;
        struct chunk *smp_trash;
+       struct session *sess = strm_sess(l4);
        struct connection *conn;
 
        if (!l4)
                return 0;
 
-       conn = objt_conn(l4->si[0].end);
+       conn = objt_conn(sess->origin);
        if (!conn || conn->xprt != &ssl_sock)
                return 0;
 
@@ -3263,12 +3268,13 @@ smp_fetch_ssl_x_notafter(struct proxy *px, struct stream *l4, void *l7, unsigned
        X509 *crt = NULL;
        int ret = 0;
        struct chunk *smp_trash;
+       struct session *sess = strm_sess(l4);
        struct connection *conn;
 
        if (!l4)
                return 0;
 
-       conn = objt_conn(l4->si[0].end);
+       conn = objt_conn(sess->origin);
        if (!conn || conn->xprt != &ssl_sock)
                return 0;
 
@@ -3311,12 +3317,13 @@ smp_fetch_ssl_x_i_dn(struct proxy *px, struct stream *l4, void *l7, unsigned int
        X509_NAME *name;
        int ret = 0;
        struct chunk *smp_trash;
+       struct session *sess = strm_sess(l4);
        struct connection *conn;
 
        if (!l4)
                return 0;
 
-       conn = objt_conn(l4->si[0].end);
+       conn = objt_conn(sess->origin);
        if (!conn || conn->xprt != &ssl_sock)
                return 0;
 
@@ -3373,12 +3380,13 @@ smp_fetch_ssl_x_notbefore(struct proxy *px, struct stream *l4, void *l7, unsigne
        X509 *crt = NULL;
        int ret = 0;
        struct chunk *smp_trash;
+       struct session *sess = strm_sess(l4);
        struct connection *conn;
 
        if (!l4)
                return 0;
 
-       conn = objt_conn(l4->si[0].end);
+       conn = objt_conn(sess->origin);
        if (!conn || conn->xprt != &ssl_sock)
                return 0;
 
@@ -3421,12 +3429,13 @@ smp_fetch_ssl_x_s_dn(struct proxy *px, struct stream *l4, void *l7, unsigned int
        X509_NAME *name;
        int ret = 0;
        struct chunk *smp_trash;
+       struct session *sess = strm_sess(l4);
        struct connection *conn;
 
        if (!l4)
                return 0;
 
-       conn = objt_conn(l4->si[0].end);
+       conn = objt_conn(sess->origin);
        if (!conn || conn->xprt != &ssl_sock)
                return 0;
 
@@ -3477,12 +3486,13 @@ smp_fetch_ssl_c_used(struct proxy *px, struct stream *l4, void *l7, unsigned int
                         const struct arg *args, struct sample *smp, const char *kw, void *private)
 {
        X509 *crt;
+       struct session *sess = strm_sess(l4);
        struct connection *conn;
 
        if (!l4)
                return 0;
 
-       conn = objt_conn(l4->si[0].end);
+       conn = objt_conn(sess->origin);
        if (!conn || conn->xprt != &ssl_sock)
                return 0;
 
@@ -3512,12 +3522,13 @@ smp_fetch_ssl_x_version(struct proxy *px, struct stream *l4, void *l7, unsigned
 {
        int cert_peer = (kw[4] == 'c') ? 1 : 0;
        X509 *crt;
+       struct session *sess = strm_sess(l4);
        struct connection *conn;
 
        if (!l4)
                return 0;
 
-       conn = objt_conn(l4->si[0].end);
+       conn = objt_conn(sess->origin);
        if (!conn || conn->xprt != &ssl_sock)
                return 0;
 
@@ -3553,12 +3564,13 @@ smp_fetch_ssl_x_sig_alg(struct proxy *px, struct stream *l4, void *l7, unsigned
        int cert_peer = (kw[4] == 'c') ? 1 : 0;
        X509 *crt;
        int nid;
+       struct session *sess = strm_sess(l4);
        struct connection *conn;
 
        if (!l4)
                return 0;
 
-       conn = objt_conn(l4->si[0].end);
+       conn = objt_conn(sess->origin);
        if (!conn || conn->xprt != &ssl_sock)
                return 0;
 
@@ -3605,12 +3617,13 @@ smp_fetch_ssl_x_key_alg(struct proxy *px, struct stream *l4, void *l7, unsigned
        int cert_peer = (kw[4] == 'c') ? 1 : 0;
        X509 *crt;
        int nid;
+       struct session *sess = strm_sess(l4);
        struct connection *conn;
 
        if (!l4)
                return 0;
 
-       conn = objt_conn(l4->si[0].end);
+       conn = objt_conn(sess->origin);
        if (!conn || conn->xprt != &ssl_sock)
                return 0;
 
@@ -3667,7 +3680,8 @@ smp_fetch_ssl_fc_has_sni(struct proxy *px, struct stream *l4, void *l7, unsigned
                          const struct arg *args, struct sample *smp, const char *kw, void *private)
 {
 #ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
-       struct connection *conn = objt_conn(l4->si[0].end);
+       struct session *sess = strm_sess(l4);
+       struct connection *conn = objt_conn(sess->origin);
 
        smp->type = SMP_T_BOOL;
        smp->data.uint = (conn && conn->xprt == &ssl_sock) &&
@@ -3774,6 +3788,7 @@ smp_fetch_ssl_fc_npn(struct proxy *px, struct stream *l4, void *l7, unsigned int
                      const struct arg *args, struct sample *smp, const char *kw, void *private)
 {
        struct connection *conn;
+       struct session *sess = strm_sess(l4);
 
        smp->flags = SMP_F_CONST;
        smp->type = SMP_T_STR;
@@ -3781,7 +3796,7 @@ smp_fetch_ssl_fc_npn(struct proxy *px, struct stream *l4, void *l7, unsigned int
        if (!l4)
                return 0;
 
-       conn = objt_conn(l4->si[0].end);
+       conn = objt_conn(sess->origin);
        if (!conn || !conn->xprt_ctx || conn->xprt != &ssl_sock)
                return 0;
 
@@ -3802,6 +3817,7 @@ smp_fetch_ssl_fc_alpn(struct proxy *px, struct stream *l4, void *l7, unsigned in
                       const struct arg *args, struct sample *smp, const char *kw, void *private)
 {
        struct connection *conn;
+       struct session *sess = strm_sess(l4);
 
        smp->flags = SMP_F_CONST;
        smp->type = SMP_T_STR;
@@ -3809,7 +3825,7 @@ smp_fetch_ssl_fc_alpn(struct proxy *px, struct stream *l4, void *l7, unsigned in
        if (!l4)
                return 0;
 
-       conn = objt_conn(l4->si[0].end);
+       conn = objt_conn(sess->origin);
        if (!conn || !conn->xprt_ctx || conn->xprt != &ssl_sock)
                return 0;
 
@@ -3898,6 +3914,7 @@ smp_fetch_ssl_fc_sni(struct proxy *px, struct stream *l4, void *l7, unsigned int
 {
 #ifdef SSL_CTRL_SET_TLSEXT_HOSTNAME
        struct connection *conn;
+       struct session *sess = strm_sess(l4);
 
        smp->flags = SMP_F_CONST;
        smp->type = SMP_T_STR;
@@ -3905,7 +3922,7 @@ smp_fetch_ssl_fc_sni(struct proxy *px, struct stream *l4, void *l7, unsigned int
        if (!l4)
                return 0;
 
-       conn = objt_conn(l4->si[0].end);
+       conn = objt_conn(sess->origin);
        if (!conn || !conn->xprt_ctx || conn->xprt != &ssl_sock)
                return 0;
 
@@ -3968,12 +3985,13 @@ static int
 smp_fetch_ssl_c_ca_err(struct proxy *px, struct stream *l4, void *l7, unsigned int opt,
                        const struct arg *args, struct sample *smp, const char *kw, void *private)
 {
+       struct session *sess = strm_sess(l4);
        struct connection *conn;
 
        if (!l4)
                return 0;
 
-       conn = objt_conn(l4->si[0].end);
+       conn = objt_conn(sess->origin);
        if (!conn || conn->xprt != &ssl_sock)
                return 0;
 
@@ -3994,12 +4012,13 @@ static int
 smp_fetch_ssl_c_ca_err_depth(struct proxy *px, struct stream *l4, void *l7, unsigned int opt,
                              const struct arg *args, struct sample *smp, const char *kw, void *private)
 {
+       struct session *sess = strm_sess(l4);
        struct connection *conn;
 
        if (!l4)
                return 0;
 
-       conn = objt_conn(l4->si[0].end);
+       conn = objt_conn(sess->origin);
        if (!conn || conn->xprt != &ssl_sock)
                return 0;
 
@@ -4020,12 +4039,13 @@ static int
 smp_fetch_ssl_c_err(struct proxy *px, struct stream *l4, void *l7, unsigned int opt,
                     const struct arg *args, struct sample *smp, const char *kw, void *private)
 {
+       struct session *sess = strm_sess(l4);
        struct connection *conn;
 
        if (!l4)
                return 0;
 
-       conn = objt_conn(l4->si[0].end);
+       conn = objt_conn(sess->origin);
        if (!conn || conn->xprt != &ssl_sock)
                return 0;
 
@@ -4046,12 +4066,13 @@ static int
 smp_fetch_ssl_c_verify(struct proxy *px, struct stream *l4, void *l7, unsigned int opt,
                        const struct arg *args, struct sample *smp, const char *kw, void *private)
 {
+       struct session *sess = strm_sess(l4);
        struct connection *conn;
 
        if (!l4)
                return 0;
 
-       conn = objt_conn(l4->si[0].end);
+       conn = objt_conn(sess->origin);
        if (!conn || conn->xprt != &ssl_sock)
                return 0;
 
index 357e5615a807d317b6dea68eaaaf2bb30036286e..70c07a7789ea50fb90393ad9d2c9ba5a78507a29 100644 (file)
@@ -592,9 +592,10 @@ int stream_complete(struct stream *s)
 static void stream_free(struct stream *s)
 {
        struct http_txn *txn = &s->txn;
-       struct proxy *fe = strm_sess(s)->fe;
+       struct session *sess = strm_sess(s);
+       struct proxy *fe = sess->fe;
        struct bref *bref, *back;
-       struct connection *cli_conn = objt_conn(s->si[0].end);
+       struct connection *cli_conn = objt_conn(sess->origin);
        int i;
 
        if (s->pend_pos)
@@ -2910,6 +2911,7 @@ void stream_shutdown(struct stream *stream, int why)
 struct stkctr *
 smp_fetch_sc_stkctr(struct stream *l4, const struct arg *args, const char *kw)
 {
+       struct session *sess = strm_sess(l4);
        static struct stkctr stkctr;
        struct stksess *stksess;
        unsigned int num = kw[2] - '0';
@@ -2923,7 +2925,7 @@ smp_fetch_sc_stkctr(struct stream *l4, const struct arg *args, const char *kw)
        }
        else if (num > 9) { /* src_* variant, args[0] = table */
                struct stktable_key *key;
-               struct connection *conn = objt_conn(l4->si[0].end);
+               struct connection *conn = objt_conn(sess->origin);
 
                if (!conn)
                        return NULL;
@@ -3144,7 +3146,8 @@ static int
 smp_fetch_src_updt_conn_cnt(struct proxy *px, struct stream *l4, void *l7, unsigned int opt,
                             const struct arg *args, struct sample *smp, const char *kw, void *private)
 {
-       struct connection *conn = objt_conn(l4->si[0].end);
+       struct session *sess = strm_sess(l4);
+       struct connection *conn = objt_conn(sess->origin);
        struct stksess *ts;
        struct stktable_key *key;
        void *ptr;