From 693b23bb102ada09b2324804ababc3279d938589 Mon Sep 17 00:00:00 2001 From: Christopher Faulet Date: Mon, 28 Feb 2022 09:09:05 +0100 Subject: [PATCH] MEDIUM: tree-wide: Use unsafe conn-stream API when it is relevant The unsafe conn-stream API (__cs_*) is now used when we are sure the good endpoint or application is attached to the conn-stream. This avoids compiler warnings about possible null derefs. It also simplify the code and clear up any ambiguity about manipulated entities. --- include/haproxy/stream_interface.h | 21 +++++---------- src/check.c | 2 +- src/hlua.c | 3 +-- src/http_ana.c | 8 +++--- src/mux_fcgi.c | 4 +-- src/mux_h1.c | 4 +-- src/mux_pt.c | 18 ++++++------- src/proxy.c | 7 ++--- src/resolvers.c | 4 +-- src/stats.c | 37 +++++++++++---------------- src/stream.c | 41 ++++++++++++++---------------- src/stream_interface.c | 36 ++++++++++++++------------ src/tcpcheck.c | 4 +-- 13 files changed, 85 insertions(+), 104 deletions(-) diff --git a/include/haproxy/stream_interface.h b/include/haproxy/stream_interface.h index 88fc16f831..673a715f5f 100644 --- a/include/haproxy/stream_interface.h +++ b/include/haproxy/stream_interface.h @@ -55,18 +55,16 @@ void si_sync_send(struct stream_interface *si); /* returns the channel which receives data from this stream interface (input channel) */ static inline struct channel *si_ic(struct stream_interface *si) { - struct stream *strm = cs_strm(si->cs); + struct stream *strm = __cs_strm(si->cs); - ALREADY_CHECKED(strm); return ((si->flags & SI_FL_ISBACK) ? &(strm->res) : &(strm->req)); } /* returns the channel which feeds data to this stream interface (output channel) */ static inline struct channel *si_oc(struct stream_interface *si) { - struct stream *strm = cs_strm(si->cs); + struct stream *strm = __cs_strm(si->cs); - ALREADY_CHECKED(strm); return ((si->flags & SI_FL_ISBACK) ? &(strm->req) : &(strm->res)); } @@ -85,27 +83,22 @@ static inline struct buffer *si_ob(struct stream_interface *si) /* returns the stream associated to a stream interface */ static inline struct stream *si_strm(struct stream_interface *si) { - struct stream *strm = cs_strm(si->cs); - - ALREADY_CHECKED(strm); - return strm; + return __cs_strm(si->cs); } /* returns the task associated to this stream interface */ static inline struct task *si_task(struct stream_interface *si) { - struct stream *strm = cs_strm(si->cs); + struct stream *strm = __cs_strm(si->cs); - ALREADY_CHECKED(strm); return strm->task; } /* returns the stream interface on the other side. Used during forwarding. */ static inline struct stream_interface *si_opposite(struct stream_interface *si) { - struct stream *strm = cs_strm(si->cs); + struct stream *strm = __cs_strm(si->cs); - ALREADY_CHECKED(strm); return ((si->flags & SI_FL_ISBACK) ? strm->csf->si : strm->csb->si); } @@ -161,8 +154,8 @@ static inline void si_applet_release(struct stream_interface *si) { struct appctx *appctx; - appctx = cs_appctx(si->cs); - if (appctx && appctx->applet->release && !si_state_in(si->state, SI_SB_DIS|SI_SB_CLO)) + appctx = __cs_appctx(si->cs); + if (appctx->applet->release && !si_state_in(si->state, SI_SB_DIS|SI_SB_CLO)) appctx->applet->release(appctx); } diff --git a/src/check.c b/src/check.c index e4f2589f75..413ef3fdae 100644 --- a/src/check.c +++ b/src/check.c @@ -1019,7 +1019,7 @@ int httpchk_build_status_header(struct server *s, struct buffer *buf) static int wake_srv_chk(struct conn_stream *cs) { struct connection *conn; - struct check *check = cs_check(cs); + struct check *check = __cs_check(cs); struct email_alertq *q = container_of(check, typeof(*q), check); int ret = 0; diff --git a/src/hlua.c b/src/hlua.c index a69adbd0b4..3ca698e664 100644 --- a/src/hlua.c +++ b/src/hlua.c @@ -2684,8 +2684,7 @@ __LJMP static int hlua_socket_connect_yield(struct lua_State *L, int status, lua return 2; } - appctx = cs_appctx(s->csf); - ALREADY_CHECKED(appctx); + appctx = __cs_appctx(s->csf); /* Check for connection established. */ if (appctx->ctx.hlua_cosocket.connected) { diff --git a/src/http_ana.c b/src/http_ana.c index ff98a7bdd9..f33eb7790e 100644 --- a/src/http_ana.c +++ b/src/http_ana.c @@ -3878,12 +3878,10 @@ static int http_handle_stats(struct stream *s, struct channel *req) struct http_msg *msg = &txn->req; struct uri_auth *uri_auth = s->be->uri_auth; const char *h, *lookup, *end; - struct appctx *appctx; + struct appctx *appctx = __cs_appctx(s->csb); struct htx *htx; struct htx_sl *sl; - appctx = cs_appctx(s->csb); - ALREADY_CHECKED(appctx); memset(&appctx->ctx.stats, 0, sizeof(appctx->ctx.stats)); appctx->st1 = appctx->st2 = 0; appctx->ctx.stats.st_code = STAT_STATUS_INIT; @@ -5004,7 +5002,7 @@ static void http_debug_stline(const char *dir, struct stream *s, const struct ht chunk_printf(&trash, "%08x:%s.%s[%04x:%04x]: ", s->uniq_id, s->be->id, dir, objt_conn(sess->origin) ? (unsigned short)__objt_conn(sess->origin)->handle.fd : -1, - cs_conn(s->csb) ? (unsigned short)(cs_conn(s->csb))->handle.fd : -1); + cs_conn(s->csb) ? (unsigned short)(__cs_conn(s->csb))->handle.fd : -1); max = HTX_SL_P1_LEN(sl); UBOUND(max, trash.size - trash.data - 3); @@ -5035,7 +5033,7 @@ static void http_debug_hdr(const char *dir, struct stream *s, const struct ist n chunk_printf(&trash, "%08x:%s.%s[%04x:%04x]: ", s->uniq_id, s->be->id, dir, objt_conn(sess->origin) ? (unsigned short)__objt_conn(sess->origin)->handle.fd : -1, - cs_conn(s->csb) ? (unsigned short)(cs_conn(s->csb))->handle.fd : -1); + cs_conn(s->csb) ? (unsigned short)(__cs_conn(s->csb))->handle.fd : -1); max = n.len; UBOUND(max, trash.size - trash.data - 3); diff --git a/src/mux_fcgi.c b/src/mux_fcgi.c index d14a166e0b..419f084891 100644 --- a/src/mux_fcgi.c +++ b/src/mux_fcgi.c @@ -3314,9 +3314,9 @@ static void fcgi_strm_capture_bad_message(struct fcgi_conn *fconn, struct fcgi_s if (fstrm->cs && cs_strm(fstrm->cs)) { if (sess == NULL) - sess = cs_strm(fstrm->cs)->sess; + sess = __cs_strm(fstrm->cs)->sess; if (!(h1m->flags & H1_MF_RESP)) - other_end = cs_strm(fstrm->cs)->be; + other_end = __cs_strm(fstrm->cs)->be; else other_end = sess->fe; } else diff --git a/src/mux_h1.c b/src/mux_h1.c index bfa923a857..7de0862559 100644 --- a/src/mux_h1.c +++ b/src/mux_h1.c @@ -1353,9 +1353,9 @@ static void h1_capture_bad_message(struct h1c *h1c, struct h1s *h1s, if ((h1c->flags & H1C_F_ST_ATTACHED) && cs_strm(h1s->cs)) { if (sess == NULL) - sess = cs_strm(h1s->cs)->sess; + sess = __cs_strm(h1s->cs)->sess; if (!(h1m->flags & H1_MF_RESP)) - other_end = cs_strm(h1s->cs)->be; + other_end = __cs_strm(h1s->cs)->be; else other_end = sess->fe; } else diff --git a/src/mux_pt.c b/src/mux_pt.c index 1a706270f7..72c997d41d 100644 --- a/src/mux_pt.c +++ b/src/mux_pt.c @@ -406,7 +406,7 @@ static void mux_pt_destroy_meth(void *ctx) */ static void mux_pt_detach(struct conn_stream *cs) { - struct connection *conn = cs_conn(cs); + struct connection *conn = __cs_conn(cs); struct mux_pt_ctx *ctx; ALREADY_CHECKED(conn); @@ -444,7 +444,7 @@ static int mux_pt_avail_streams(struct connection *conn) static void mux_pt_shutr(struct conn_stream *cs, enum cs_shr_mode mode) { - struct connection *conn = cs_conn(cs); + struct connection *conn = __cs_conn(cs); TRACE_ENTER(PT_EV_STRM_SHUT, conn, cs); @@ -464,7 +464,7 @@ static void mux_pt_shutr(struct conn_stream *cs, enum cs_shr_mode mode) static void mux_pt_shutw(struct conn_stream *cs, enum cs_shw_mode mode) { - struct connection *conn = cs_conn(cs); + struct connection *conn = __cs_conn(cs); TRACE_ENTER(PT_EV_STRM_SHUT, conn, cs); @@ -496,7 +496,7 @@ static void mux_pt_shutw(struct conn_stream *cs, enum cs_shw_mode mode) */ static size_t mux_pt_rcv_buf(struct conn_stream *cs, struct buffer *buf, size_t count, int flags) { - struct connection *conn = cs_conn(cs); + struct connection *conn = __cs_conn(cs); size_t ret = 0; TRACE_ENTER(PT_EV_RX_DATA, conn, cs, buf, (size_t[]){count}); @@ -525,7 +525,7 @@ static size_t mux_pt_rcv_buf(struct conn_stream *cs, struct buffer *buf, size_t /* Called from the upper layer, to send data */ static size_t mux_pt_snd_buf(struct conn_stream *cs, struct buffer *buf, size_t count, int flags) { - struct connection *conn = cs_conn(cs); + struct connection *conn = __cs_conn(cs); size_t ret; TRACE_ENTER(PT_EV_TX_DATA, conn, cs, buf, (size_t[]){count}); @@ -546,7 +546,7 @@ static size_t mux_pt_snd_buf(struct conn_stream *cs, struct buffer *buf, size_t */ static int mux_pt_subscribe(struct conn_stream *cs, int event_type, struct wait_event *es) { - struct connection *conn = cs_conn(cs); + struct connection *conn = __cs_conn(cs); TRACE_POINT(PT_EV_RX_DATA|PT_EV_TX_DATA, conn, cs, 0, (size_t[]){event_type}); return conn->xprt->subscribe(conn, conn->xprt_ctx, event_type, es); @@ -558,7 +558,7 @@ static int mux_pt_subscribe(struct conn_stream *cs, int event_type, struct wait_ */ static int mux_pt_unsubscribe(struct conn_stream *cs, int event_type, struct wait_event *es) { - struct connection *conn = cs_conn(cs); + struct connection *conn = __cs_conn(cs); TRACE_POINT(PT_EV_RX_DATA|PT_EV_TX_DATA, conn, cs, 0, (size_t[]){event_type}); return conn->xprt->unsubscribe(conn, conn->xprt_ctx, event_type, es); @@ -568,7 +568,7 @@ static int mux_pt_unsubscribe(struct conn_stream *cs, int event_type, struct wai /* Send and get, using splicing */ static int mux_pt_rcv_pipe(struct conn_stream *cs, struct pipe *pipe, unsigned int count) { - struct connection *conn = cs_conn(cs); + struct connection *conn = __cs_conn(cs); int ret; TRACE_ENTER(PT_EV_RX_DATA, conn, cs, 0, (size_t[]){count}); @@ -589,7 +589,7 @@ static int mux_pt_rcv_pipe(struct conn_stream *cs, struct pipe *pipe, unsigned i static int mux_pt_snd_pipe(struct conn_stream *cs, struct pipe *pipe) { - struct connection *conn = cs_conn(cs); + struct connection *conn = __cs_conn(cs); int ret; TRACE_ENTER(PT_EV_TX_DATA, conn, cs, 0, (size_t[]){pipe->data}); diff --git a/src/proxy.c b/src/proxy.c index 4991d9457a..946fe13d59 100644 --- a/src/proxy.c +++ b/src/proxy.c @@ -2612,8 +2612,8 @@ static void dump_server_addr(const struct sockaddr_storage *addr, char *addr_str */ static int dump_servers_state(struct stream_interface *si) { - struct appctx *appctx = cs_appctx(si->cs); - struct proxy *px; + struct appctx *appctx = __cs_appctx(si->cs); + struct proxy *px = appctx->ctx.cli.p0; struct server *srv; char srv_addr[INET6_ADDRSTRLEN + 1]; char srv_agent_addr[INET6_ADDRSTRLEN + 1]; @@ -2622,9 +2622,6 @@ static int dump_servers_state(struct stream_interface *si) int bk_f_forced_id, srv_f_forced_id; char *srvrecord; - ALREADY_CHECKED(appctx); - px = appctx->ctx.cli.p0; - if (!appctx->ctx.cli.p1) appctx->ctx.cli.p1 = px->srv; diff --git a/src/resolvers.c b/src/resolvers.c index dff09fe6e3..e8117d8ed8 100644 --- a/src/resolvers.c +++ b/src/resolvers.c @@ -2586,7 +2586,7 @@ static int stats_dump_resolv_to_buffer(struct stream_interface *si, struct field *stats, size_t stats_count, struct list *stat_modules) { - struct appctx *appctx = cs_appctx(si->cs); + struct appctx *appctx = __cs_appctx(si->cs); struct channel *rep = si_ic(si); struct stats_module *mod; size_t idx = 0; @@ -2620,7 +2620,7 @@ int stats_dump_resolvers(struct stream_interface *si, struct field *stats, size_t stats_count, struct list *stat_modules) { - struct appctx *appctx = cs_appctx(si->cs); + struct appctx *appctx = __cs_appctx(si->cs); struct channel *rep = si_ic(si); struct resolvers *resolver = appctx->ctx.stats.obj1; struct dns_nameserver *ns = appctx->ctx.stats.obj2; diff --git a/src/stats.c b/src/stats.c index 854515b263..d15ce094d9 100644 --- a/src/stats.c +++ b/src/stats.c @@ -1812,7 +1812,7 @@ int stats_fill_fe_stats(struct proxy *px, struct field *stats, int len, */ static int stats_dump_fe_stats(struct stream_interface *si, struct proxy *px) { - struct appctx *appctx = cs_appctx(si->cs); + struct appctx *appctx = __cs_appctx(si->cs); struct field *stats = stat_l[STATS_DOMAIN_PROXY]; struct stats_module *mod; size_t stats_count = ST_F_TOTAL_FIELDS; @@ -1979,13 +1979,11 @@ int stats_fill_li_stats(struct proxy *px, struct listener *l, int flags, */ static int stats_dump_li_stats(struct stream_interface *si, struct proxy *px, struct listener *l) { - struct appctx *appctx = cs_appctx(si->cs); + struct appctx *appctx = __cs_appctx(si->cs); struct field *stats = stat_l[STATS_DOMAIN_PROXY]; struct stats_module *mod; size_t stats_count = ST_F_TOTAL_FIELDS; - ALREADY_CHECKED(appctx); - memset(stats, 0, sizeof(struct field) * stat_count[STATS_DOMAIN_PROXY]); if (!stats_fill_li_stats(px, l, appctx->ctx.stats.flags, stats, @@ -2492,13 +2490,11 @@ int stats_fill_sv_stats(struct proxy *px, struct server *sv, int flags, */ static int stats_dump_sv_stats(struct stream_interface *si, struct proxy *px, struct server *sv) { - struct appctx *appctx = cs_appctx(si->cs); + struct appctx *appctx = __cs_appctx(si->cs); struct stats_module *mod; struct field *stats = stat_l[STATS_DOMAIN_PROXY]; size_t stats_count = ST_F_TOTAL_FIELDS; - ALREADY_CHECKED(appctx); - memset(stats, 0, sizeof(struct field) * stat_count[STATS_DOMAIN_PROXY]); if (!stats_fill_sv_stats(px, sv, appctx->ctx.stats.flags, stats, @@ -2819,7 +2815,7 @@ int stats_fill_be_stats(struct proxy *px, int flags, struct field *stats, int le */ static int stats_dump_be_stats(struct stream_interface *si, struct proxy *px) { - struct appctx *appctx = cs_appctx(si->cs); + struct appctx *appctx = __cs_appctx(si->cs); struct field *stats = stat_l[STATS_DOMAIN_PROXY]; struct stats_module *mod; size_t stats_count = ST_F_TOTAL_FIELDS; @@ -2860,7 +2856,7 @@ static int stats_dump_be_stats(struct stream_interface *si, struct proxy *px) */ static void stats_dump_html_px_hdr(struct stream_interface *si, struct proxy *px) { - struct appctx *appctx = cs_appctx(si->cs); + struct appctx *appctx = __cs_appctx(si->cs); char scope_txt[STAT_SCOPE_TXT_MAXLEN + sizeof STAT_SCOPE_PATTERN]; struct stats_module *mod; int stats_module_len = 0; @@ -2969,7 +2965,8 @@ static void stats_dump_html_px_hdr(struct stream_interface *si, struct proxy *px */ static void stats_dump_html_px_end(struct stream_interface *si, struct proxy *px) { - struct appctx *appctx = cs_appctx(si->cs); + struct appctx *appctx = __cs_appctx(si->cs); + chunk_appendf(&trash, ""); if ((px->cap & PR_CAP_BE) && px->srv && (appctx->ctx.stats.flags & STAT_ADMIN)) { @@ -3011,7 +3008,7 @@ static void stats_dump_html_px_end(struct stream_interface *si, struct proxy *px int stats_dump_proxy_to_buffer(struct stream_interface *si, struct htx *htx, struct proxy *px, struct uri_auth *uri) { - struct appctx *appctx = cs_appctx(si->cs); + struct appctx *appctx = __cs_appctx(si->cs); struct stream *s = si_strm(si); struct channel *rep = si_ic(si); struct server *sv, *svs; /* server and server-state, server-state=server or server->track */ @@ -3384,7 +3381,7 @@ static void stats_dump_html_head(struct appctx *appctx, struct uri_auth *uri) */ static void stats_dump_html_info(struct stream_interface *si, struct uri_auth *uri) { - struct appctx *appctx = cs_appctx(si->cs); + struct appctx *appctx = __cs_appctx(si->cs); unsigned int up = (now.tv_sec - start_date.tv_sec); char scope_txt[STAT_SCOPE_TXT_MAXLEN + sizeof STAT_SCOPE_PATTERN]; const char *scope_ptr = stats_scope_ptr(appctx, si); @@ -3666,7 +3663,7 @@ static int stats_dump_proxies(struct stream_interface *si, struct htx *htx, struct uri_auth *uri) { - struct appctx *appctx = cs_appctx(si->cs); + struct appctx *appctx = __cs_appctx(si->cs); struct channel *rep = si_ic(si); struct proxy *px; @@ -3713,7 +3710,7 @@ static int stats_dump_proxies(struct stream_interface *si, static int stats_dump_stat_to_buffer(struct stream_interface *si, struct htx *htx, struct uri_auth *uri) { - struct appctx *appctx = cs_appctx(si->cs); + struct appctx *appctx = __cs_appctx(si->cs); struct channel *rep = si_ic(si); enum stats_domain domain = appctx->ctx.stats.domain; @@ -3815,7 +3812,7 @@ static int stats_dump_stat_to_buffer(struct stream_interface *si, struct htx *ht static int stats_process_http_post(struct stream_interface *si) { struct stream *s = si_strm(si); - struct appctx *appctx = cs_appctx(si->cs); + struct appctx *appctx = __cs_appctx(si->cs); struct proxy *px = NULL; struct server *sv = NULL; @@ -4151,7 +4148,7 @@ static int stats_send_http_headers(struct stream_interface *si, struct htx *htx) { struct stream *s = si_strm(si); struct uri_auth *uri = s->be->uri_auth; - struct appctx *appctx = cs_appctx(si->cs); + struct appctx *appctx = __cs_appctx(si->cs); struct htx_sl *sl; unsigned int flags; @@ -4205,12 +4202,10 @@ static int stats_send_http_redirect(struct stream_interface *si, struct htx *htx char scope_txt[STAT_SCOPE_TXT_MAXLEN + sizeof STAT_SCOPE_PATTERN]; struct stream *s = si_strm(si); struct uri_auth *uri = s->be->uri_auth; - struct appctx *appctx = cs_appctx(si->cs); + struct appctx *appctx = __cs_appctx(si->cs); struct htx_sl *sl; unsigned int flags; - ALREADY_CHECKED(appctx); - /* scope_txt = search pattern + search query, appctx->ctx.stats.scope_len is always <= STAT_SCOPE_TXT_MAXLEN */ scope_txt[0] = 0; if (appctx->ctx.stats.scope_len) { @@ -4522,9 +4517,7 @@ int stats_fill_info(struct field *info, int len, uint flags) */ static int stats_dump_info_to_buffer(struct stream_interface *si) { - struct appctx *appctx = cs_appctx(si->cs); - - ALREADY_CHECKED(appctx); + struct appctx *appctx = __cs_appctx(si->cs); if (!stats_fill_info(info, INF_TOTAL_FIELDS, appctx->ctx.stats.flags)) return 0; diff --git a/src/stream.c b/src/stream.c index 23d431233e..27b6863677 100644 --- a/src/stream.c +++ b/src/stream.c @@ -275,11 +275,10 @@ static void strm_trace(enum trace_level level, uint64_t mask, const struct trace */ int stream_upgrade_from_cs(struct conn_stream *cs, struct buffer *input) { - struct stream *s = cs_strm(cs); - - if (cs_conn_mux(cs)) { - const struct mux_ops *mux = DISGUISE(cs_conn_mux(cs)); + struct stream *s = __cs_strm(cs); + const struct mux_ops *mux = cs_conn_mux(cs); + if (mux) { if (mux->flags & MX_FL_HTX) s->flags |= SF_HTX; } @@ -989,7 +988,7 @@ enum act_return process_use_service(struct act_rule *rule, struct proxy *px, appctx->rule = rule; } else - appctx = cs_appctx(s->csb); + appctx = __cs_appctx(s->csb); /* Stops the applet scheduling, in case of the init function miss * some data. @@ -2140,10 +2139,10 @@ struct task *process_stream(struct task *t, void *context, unsigned int state) if (!(req->flags & (CF_KERN_SPLICING|CF_SHUTR)) && req->to_forward && (global.tune.options & GTUNE_USE_SPLICE) && - (cs_conn(si_f->cs) && cs_conn(si_f->cs)->xprt && cs_conn(si_f->cs)->xprt->rcv_pipe && - cs_conn(si_f->cs)->mux && cs_conn(si_f->cs)->mux->rcv_pipe) && - (cs_conn(si_b->cs) && cs_conn(si_b->cs)->xprt && cs_conn(si_b->cs)->xprt->snd_pipe && - cs_conn(si_b->cs)->mux && cs_conn(si_b->cs)->mux->snd_pipe) && + (cs_conn(si_f->cs) && __cs_conn(si_f->cs)->xprt && __cs_conn(si_f->cs)->xprt->rcv_pipe && + __cs_conn(si_f->cs)->mux && __cs_conn(si_f->cs)->mux->rcv_pipe) && + (cs_conn(si_b->cs) && __cs_conn(si_b->cs)->xprt && __cs_conn(si_b->cs)->xprt->snd_pipe && + __cs_conn(si_b->cs)->mux && __cs_conn(si_b->cs)->mux->snd_pipe) && (pipes_used < global.maxpipes) && (((sess->fe->options2|s->be->options2) & PR_O2_SPLIC_REQ) || (((sess->fe->options2|s->be->options2) & PR_O2_SPLIC_AUT) && @@ -2333,10 +2332,10 @@ struct task *process_stream(struct task *t, void *context, unsigned int state) if (!(res->flags & (CF_KERN_SPLICING|CF_SHUTR)) && res->to_forward && (global.tune.options & GTUNE_USE_SPLICE) && - (cs_conn(si_f->cs) && cs_conn(si_f->cs)->xprt && cs_conn(si_f->cs)->xprt->snd_pipe && - cs_conn(si_f->cs)->mux && cs_conn(si_f->cs)->mux->snd_pipe) && - (cs_conn(si_b->cs) && cs_conn(si_b->cs)->xprt && cs_conn(si_b->cs)->xprt->rcv_pipe && - cs_conn(si_b->cs)->mux && cs_conn(si_b->cs)->mux->rcv_pipe) && + (cs_conn(si_f->cs) && __cs_conn(si_f->cs)->xprt && __cs_conn(si_f->cs)->xprt->snd_pipe && + __cs_conn(si_f->cs)->mux && __cs_conn(si_f->cs)->mux->snd_pipe) && + (cs_conn(si_b->cs) && __cs_conn(si_b->cs)->xprt && __cs_conn(si_b->cs)->xprt->rcv_pipe && + __cs_conn(si_b->cs)->mux && __cs_conn(si_b->cs)->mux->rcv_pipe) && (pipes_used < global.maxpipes) && (((sess->fe->options2|s->be->options2) & PR_O2_SPLIC_RTR) || (((sess->fe->options2|s->be->options2) & PR_O2_SPLIC_AUT) && @@ -2413,8 +2412,8 @@ struct task *process_stream(struct task *t, void *context, unsigned int state) si_b->prev_state == SI_ST_EST) { chunk_printf(&trash, "%08x:%s.srvcls[%04x:%04x]\n", s->uniq_id, s->be->id, - cs_conn(si_f->cs) ? (unsigned short)cs_conn(si_f->cs)->handle.fd : -1, - cs_conn(si_b->cs) ? (unsigned short)cs_conn(si_b->cs)->handle.fd : -1); + cs_conn(si_f->cs) ? (unsigned short)__cs_conn(si_f->cs)->handle.fd : -1, + cs_conn(si_b->cs) ? (unsigned short)__cs_conn(si_b->cs)->handle.fd : -1); DISGUISE(write(1, trash.area, trash.data)); } @@ -2422,8 +2421,8 @@ struct task *process_stream(struct task *t, void *context, unsigned int state) si_f->prev_state == SI_ST_EST) { chunk_printf(&trash, "%08x:%s.clicls[%04x:%04x]\n", s->uniq_id, s->be->id, - cs_conn(si_f->cs) ? (unsigned short)cs_conn(si_f->cs)->handle.fd : -1, - cs_conn(si_b->cs) ? (unsigned short)cs_conn(si_b->cs)->handle.fd : -1); + cs_conn(si_f->cs) ? (unsigned short)__cs_conn(si_f->cs)->handle.fd : -1, + cs_conn(si_b->cs) ? (unsigned short)__cs_conn(si_b->cs)->handle.fd : -1); DISGUISE(write(1, trash.area, trash.data)); } } @@ -2490,8 +2489,8 @@ struct task *process_stream(struct task *t, void *context, unsigned int state) (!(global.mode & MODE_QUIET) || (global.mode & MODE_VERBOSE)))) { chunk_printf(&trash, "%08x:%s.closed[%04x:%04x]\n", s->uniq_id, s->be->id, - cs_conn(si_f->cs) ? (unsigned short)cs_conn(si_f->cs)->handle.fd : -1, - cs_conn(si_b->cs) ? (unsigned short)cs_conn(si_b->cs)->handle.fd : -1); + cs_conn(si_f->cs) ? (unsigned short)__cs_conn(si_f->cs)->handle.fd : -1, + cs_conn(si_b->cs) ? (unsigned short)__cs_conn(si_b->cs)->handle.fd : -1); DISGUISE(write(1, trash.area, trash.data)); } @@ -3093,7 +3092,7 @@ void list_services(FILE *out) */ static int stats_dump_full_strm_to_buffer(struct stream_interface *si, struct stream *strm) { - struct appctx *appctx = cs_appctx(si->cs); + struct appctx *appctx = __cs_appctx(si->cs); struct tm tm; extern const char *monthname[12]; char pn[INET6_ADDRSTRLEN]; @@ -3101,8 +3100,6 @@ static int stats_dump_full_strm_to_buffer(struct stream_interface *si, struct st struct connection *conn; struct appctx *tmpctx; - ALREADY_CHECKED(appctx); - chunk_reset(&trash); if (appctx->ctx.sess.section > 0 && appctx->ctx.sess.uid != strm->uniq_id) { diff --git a/src/stream_interface.c b/src/stream_interface.c index 4442b22295..21e9d08a30 100644 --- a/src/stream_interface.c +++ b/src/stream_interface.c @@ -387,12 +387,10 @@ int conn_si_send_proxy(struct connection *conn, unsigned int flag) */ if (cs && cs->data_cb == &si_conn_cb) { - struct stream *strm = cs_strm(cs); - ret = make_proxy_line(trash.area, trash.size, objt_server(conn->target), cs_conn(si_opposite(cs_si(cs))->cs), - strm); + cs_strm(cs)); } else { /* The target server expects a LOCAL line to be sent first. Retrieving @@ -595,7 +593,7 @@ static void stream_int_notify(struct stream_interface *si) */ static int si_cs_process(struct conn_stream *cs) { - struct connection *conn = cs_conn(cs); + struct connection *conn = __cs_conn(cs); struct stream_interface *si = cs_si(cs); struct channel *ic = si_ic(si); struct channel *oc = si_oc(si); @@ -683,14 +681,12 @@ static int si_cs_process(struct conn_stream *cs) */ int si_cs_send(struct conn_stream *cs) { - struct connection *conn = cs_conn(cs); + struct connection *conn = __cs_conn(cs); struct stream_interface *si = cs_si(cs); struct channel *oc = si_oc(si); int ret; int did_send = 0; - BUG_ON(!conn); - if (conn->flags & CO_FL_ERROR || cs->flags & (CS_FL_ERROR|CS_FL_ERR_PENDING)) { /* We're probably there because the tasklet was woken up, * but process_stream() ran before, detected there were an @@ -998,12 +994,12 @@ void si_update_both(struct stream_interface *si_f, struct stream_interface *si_b if (cs_appctx(si_f->cs) && ((si_rx_endp_ready(si_f) && !si_rx_blocked(si_f)) || (si_tx_endp_ready(si_f) && !si_tx_blocked(si_f)))) - appctx_wakeup(cs_appctx(si_f->cs)); + appctx_wakeup(__cs_appctx(si_f->cs)); if (cs_appctx(si_b->cs) && ((si_rx_endp_ready(si_b) && !si_rx_blocked(si_b)) || (si_tx_endp_ready(si_b) && !si_tx_blocked(si_b)))) - appctx_wakeup(cs_appctx(si_b->cs)); + appctx_wakeup(__cs_appctx(si_b->cs)); } /* @@ -1251,15 +1247,13 @@ static void stream_int_chk_snd_conn(struct stream_interface *si) */ int si_cs_recv(struct conn_stream *cs) { - struct connection *conn = cs_conn(cs); + struct connection *conn = __cs_conn(cs); struct stream_interface *si = cs_si(cs); struct channel *ic = si_ic(si); int ret, max, cur_read = 0; int read_poll = MAX_READ_POLL_LOOPS; int flags = 0; - BUG_ON(!conn); - /* If not established yet, do nothing. */ if (si->state != SI_ST_EST) return 0; @@ -1638,6 +1632,8 @@ void si_applet_wake_cb(struct stream_interface *si) { struct channel *ic = si_ic(si); + BUG_ON(cs_appctx(si->cs)); + /* If the applet wants to write and the channel is closed, it's a * broken pipe and it must be reported. */ @@ -1661,7 +1657,7 @@ void si_applet_wake_cb(struct stream_interface *si) */ if ((si_rx_endp_ready(si) && !si_rx_blocked(si)) || (si_tx_endp_ready(si) && !si_tx_blocked(si))) - appctx_wakeup(cs_appctx(si->cs)); + appctx_wakeup(__cs_appctx(si->cs)); } /* @@ -1676,6 +1672,8 @@ static void stream_int_shutr_applet(struct stream_interface *si) { struct channel *ic = si_ic(si); + BUG_ON(cs_appctx(si->cs)); + si_rx_shut_blk(si); if (ic->flags & CF_SHUTR) return; @@ -1710,6 +1708,8 @@ static void stream_int_shutw_applet(struct stream_interface *si) struct channel *ic = si_ic(si); struct channel *oc = si_oc(si); + BUG_ON(cs_appctx(si->cs)); + oc->flags &= ~CF_SHUTW_NOW; if (oc->flags & CF_SHUTW) return; @@ -1723,7 +1723,7 @@ static void stream_int_shutw_applet(struct stream_interface *si) } /* on shutw we always wake the applet up */ - appctx_wakeup(cs_appctx(si->cs)); + appctx_wakeup(__cs_appctx(si->cs)); switch (si->state) { case SI_ST_RDY: @@ -1761,13 +1761,15 @@ static void stream_int_chk_rcv_applet(struct stream_interface *si) { struct channel *ic = si_ic(si); + BUG_ON(cs_appctx(si->cs)); + DPRINTF(stderr, "%s: si=%p, si->state=%d ic->flags=%08x oc->flags=%08x\n", __FUNCTION__, si, si->state, ic->flags, si_oc(si)->flags); if (!ic->pipe) { /* (re)start reading */ - appctx_wakeup(cs_appctx(si->cs)); + appctx_wakeup(__cs_appctx(si->cs)); } } @@ -1776,6 +1778,8 @@ static void stream_int_chk_snd_applet(struct stream_interface *si) { struct channel *oc = si_oc(si); + BUG_ON(cs_appctx(si->cs)); + DPRINTF(stderr, "%s: si=%p, si->state=%d ic->flags=%08x oc->flags=%08x\n", __FUNCTION__, si, si->state, si_ic(si)->flags, oc->flags); @@ -1793,7 +1797,7 @@ static void stream_int_chk_snd_applet(struct stream_interface *si) if (!channel_is_empty(oc)) { /* (re)start sending */ - appctx_wakeup(cs_appctx(si->cs)); + appctx_wakeup(__cs_appctx(si->cs)); } } diff --git a/src/tcpcheck.c b/src/tcpcheck.c index 1b8199b1ce..ff1c32b5a9 100644 --- a/src/tcpcheck.c +++ b/src/tcpcheck.c @@ -1323,7 +1323,7 @@ enum tcpcheck_eval_ret tcpcheck_eval_send(struct check *check, struct tcpcheck_r enum tcpcheck_eval_ret ret = TCPCHK_EVAL_CONTINUE; struct tcpcheck_send *send = &rule->send; struct conn_stream *cs = check->cs; - struct connection *conn = cs_conn(cs); + struct connection *conn = __cs_conn(cs); struct buffer *tmp = NULL; struct htx *htx = NULL; int connection_hdr = 0; @@ -1533,7 +1533,7 @@ enum tcpcheck_eval_ret tcpcheck_eval_send(struct check *check, struct tcpcheck_r enum tcpcheck_eval_ret tcpcheck_eval_recv(struct check *check, struct tcpcheck_rule *rule) { struct conn_stream *cs = check->cs; - struct connection *conn = cs_conn(cs); + struct connection *conn = __cs_conn(cs); enum tcpcheck_eval_ret ret = TCPCHK_EVAL_CONTINUE; size_t max, read, cur_read = 0; int is_empty; -- 2.39.5