#define MAX_ALPN_SIZE 16
struct path_parameters {
+ __decl_thread(HA_RWLOCK_T param_lock);
char nego_alpn[MAX_ALPN_SIZE];
};
* that this is skipped in TCP mode as we only want mux-pt
* anyway.
*/
- if (IS_HTX_STRM(s) && srv && srv->use_ssl &&
- (srv->ssl_ctx.alpn_str || srv->ssl_ctx.npn_str) &&
- srv->path_params.nego_alpn[0] == 0)
- may_start_mux_now = 0;
+ if (srv) {
+ HA_RWLOCK_RDLOCK(SERVER_LOCK, &srv->path_params.param_lock);
+ if (IS_HTX_STRM(s) && srv->use_ssl &&
+ (srv->ssl_ctx.alpn_str || srv->ssl_ctx.npn_str) &&
+ srv->path_params.nego_alpn[0] == 0)
+ may_start_mux_now = 0;
+ HA_RWLOCK_RDUNLOCK(SERVER_LOCK, &srv->path_params.param_lock);
+ }
#endif
/* process the case where the server requires the PROXY protocol to be sent */
static void srv_reset_path_parameters(struct server *s)
{
+ HA_RWLOCK_WRLOCK(SERVER_LOCK, &s->path_params.param_lock);
s->path_params.nego_alpn[0] = 0;
+ HA_RWLOCK_WRUNLOCK(SERVER_LOCK, &s->path_params.param_lock);
}
const char *srv_op_st_chg_cause(enum srv_op_st_chg_cause cause)
sv->next = srv;
}
+ HA_RWLOCK_INIT(&srv->path_params.param_lock);
/* please don't put default server settings here, they are set in
* proxy_preset_defaults().
*/
const char *alpn;
int len;
- if (ssl_sock_get_alpn(conn, ctx, &alpn, &len)) {
- srv = objt_server(conn->target);
- if (srv && len < sizeof(srv->path_params.nego_alpn)) {
+ srv = objt_server(conn->target);
+ if (srv && ssl_sock_get_alpn(conn, ctx, &alpn, &len)) {
+ if (len < sizeof(srv->path_params.nego_alpn) &&
+ (len != strlen(srv->path_params.nego_alpn) ||
+ memcmp(&srv->path_params.nego_alpn, alpn, len) != 0)) {
+ HA_RWLOCK_WRLOCK(SERVER_LOCK, &srv->path_params.param_lock);
memcpy(&srv->path_params.nego_alpn, alpn, len);
srv->path_params.nego_alpn[len] = 0;
+ HA_RWLOCK_WRUNLOCK(SERVER_LOCK, &srv->path_params.param_lock);
}
}
}