aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOmar Polo <op@omarpolo.com>2022-01-05 18:58:01 +0000
committerOmar Polo <op@omarpolo.com>2022-01-05 18:58:01 +0000
commit901905e0cf0f5f141461df7ea199711ea951c919 (patch)
tree44b419e53190319c4e0d48d9f5a006bd1656dda0
parent876a417023a6a38cc61f61bf3083305455a7f8ec (diff)
bail out of client_read if we've already decide what to do
libevent2 can still somehowe call client_read even in code paths that never enable reading from the evbuffer. Can't reproduce on the libevent in base on OpenBSD. It's a bit ugly, but it's a small workaround for something that otherwise *always* make gmid crash when linked against libevent2. (client_read works under the assumption that c->host != NULL, matched_proxy crashes otherwise.)
-rwxr-xr-xregress/regress1
-rw-r--r--regress/tests.sh8
-rw-r--r--server.c8
3 files changed, 17 insertions, 0 deletions
diff --git a/regress/regress b/regress/regress
index 0c8a4ae..6474e4f 100755
--- a/regress/regress
+++ b/regress/regress
@@ -53,5 +53,6 @@ run_test test_macro_expansion
run_test test_174_bugfix
run_test test_proxy_relay_to
run_test test_proxy_with_certs
+run_test test_unknown_host
tests_done
diff --git a/regress/tests.sh b/regress/tests.sh
index 398c458..9fae42d 100644
--- a/regress/tests.sh
+++ b/regress/tests.sh
@@ -362,3 +362,11 @@ test_proxy_with_certs() {
fetch /
check_reply "60 client certificate required" || return 1
}
+
+test_unknown_host() {
+ setup_simple_test '' ''
+
+ ggflags="-N -H foobar"
+ fetch /
+ check_reply '59 Wrong/malformed host or missing SNI'
+}
diff --git a/server.c b/server.c
index cd994fb..2f5912c 100644
--- a/server.c
+++ b/server.c
@@ -1004,6 +1004,14 @@ client_read(struct bufferevent *bev, void *d)
bufferevent_disable(bev, EVBUFFER_READ);
+ /*
+ * libevent2 can still somehow call this function, even
+ * though I never enable EV_READ in the bufferevent. If
+ * that's the case, bail out.
+ */
+ if (c->type != REQUEST_UNDECIDED)
+ return;
+
/* max url len + \r\n */
if (EVBUFFER_LENGTH(src) > 1024 + 2) {
log_err(c, "too much data received");