Mercurial > hg > nginx
view auto/cc/clang @ 8963:5acd0d89d8c2 quic
QUIC: fixed handling stream input buffers.
Previously, ngx_quic_write_chain() treated each input buffer as a memory
buffer, which is not always the case. Special buffers were not skipped, which
is especially important when hitting the input byte limit.
The issue manifested itself with ngx_quic_write_chain() returning a non-empty
chain consisting of a special last_buf buffer when called from QUIC stream
send_chain(). In order for this to happen, input byte limit should be equal to
the chain length, and the input chain should end with an empty last_buf buffer.
An easy way to achieve this is the following:
location /empty {
return 200;
}
When this non-empty chain was returned from send_chain(), it signalled to the
caller that input was blocked, while in fact it wasn't. This prevented HTTP
request from finalization, which prevented QUIC from sending STREAM FIN to
the client. The QUIC stream was then reset after a timeout.
Now special buffers are skipped and send_chain() returns NULL in the case
above, which signals to the caller a successful operation.
Also, original byte limit is now passed to ngx_quic_write_chain() from
send_chain() instead of actual chain length to make sure it's never zero.
author | Roman Arutyunyan <arut@nginx.com> |
---|---|
date | Thu, 13 Jan 2022 11:23:53 +0300 |
parents | ceab908790c4 |
children |
line wrap: on
line source
# Copyright (C) Nginx, Inc. # clang NGX_CLANG_VER=`$CC -v 2>&1 | grep 'version' 2>&1 \ | sed -n -e 's/^.*clang version \(.*\)/\1/p' \ -e 's/^.*LLVM version \(.*\)/\1/p'` echo " + clang version: $NGX_CLANG_VER" have=NGX_COMPILER value="\"clang $NGX_CLANG_VER\"" . auto/define CC_TEST_FLAGS="-pipe" # optimizations #NGX_CLANG_OPT="-O2" #NGX_CLANG_OPT="-Oz" NGX_CLANG_OPT="-O" case $CPU in pentium) # optimize for Pentium CPU_OPT="-march=pentium" NGX_CPU_CACHE_LINE=32 ;; pentiumpro | pentium3) # optimize for Pentium Pro, Pentium II and Pentium III CPU_OPT="-march=pentiumpro" NGX_CPU_CACHE_LINE=32 ;; pentium4) # optimize for Pentium 4 CPU_OPT="-march=pentium4" NGX_CPU_CACHE_LINE=128 ;; athlon) # optimize for Athlon CPU_OPT="-march=athlon" NGX_CPU_CACHE_LINE=64 ;; opteron) # optimize for Opteron CPU_OPT="-march=opteron" NGX_CPU_CACHE_LINE=64 ;; esac CC_AUX_FLAGS="$CC_AUX_FLAGS $CPU_OPT" CFLAGS="$CFLAGS -pipe $CPU_OPT" if [ ".$PCRE_OPT" = "." ]; then PCRE_OPT="-O2 -pipe $CPU_OPT" else PCRE_OPT="$PCRE_OPT -pipe" fi if [ ".$ZLIB_OPT" = "." ]; then ZLIB_OPT="-O2 -pipe $CPU_OPT" else ZLIB_OPT="$ZLIB_OPT -pipe" fi # warnings CFLAGS="$CFLAGS $NGX_CLANG_OPT -Wall -Wextra -Wpointer-arith" CFLAGS="$CFLAGS -Wconditional-uninitialized" #CFLAGS="$CFLAGS -Wmissing-prototypes" # we have a lot of unused function arguments CFLAGS="$CFLAGS -Wno-unused-parameter" # deprecated system OpenSSL library on OS X if [ "$NGX_SYSTEM" = "Darwin" ]; then CFLAGS="$CFLAGS -Wno-deprecated-declarations" fi # stop on warning CFLAGS="$CFLAGS -Werror" # debug CFLAGS="$CFLAGS -g" if [ ".$CPP" = "." ]; then CPP="$CC -E" fi