> Am 07.02.2022 um 11:31 schrieb Graham Leggett <minf...@sharp.fm>:
> 
> On 07 Feb 2022, at 12:18, Stefan Eissing <ste...@eissing.org> wrote:
> 
>>>> Is the http2 code doing anything to work around mod_ssl trying to read, 
>>>> failing, throwing away the error, and then pretending nothing happened?
>>> 
>>> The http2 code doesn't try to work around mod_ssl, instead it does the same 
>>> as mod_ssl, which is that it performs an operation but throws away the 
>>> error:
>>> 
>>> https://github.com/apache/httpd/blob/1598f7aebd59acc7494389a3903a33c5e38a5460/modules/http2/h2_c2.c#L632
>>> 
>>> This hook is sorted APR_HOOK_FIRST, which means h2_c2_hook_process() runs 
>>> first, then passes the connection to mod_ssl, which then returns AGAIN, but 
>>> AGAIN is now thrown away inside h2_c2_hook_process(), and now we’re off the 
>>> rails from this point on and we can expect our socket to be stuck in a 
>>> weird state.
>>> 
>>> The http1 code has the same problem, but runs APR_HOOK_LAST, which means 
>>> mod_ssl’s handshake is completely done before http1 touches the connection.
>>> 
>>> I think to fix this test, we need to make sure http2 runs after mod_ssl.
>> 
>> It does.
>> 
>> h2_c1.c:
>> 
>> static const char* const mod_reqtimeout[] = { "mod_ssl.c", 
>> "mod_reqtimeout.c", NULL};
>> 
>> void h2_c1_register_hooks(void)
>> {
>>    /* Our main processing needs to run quite late. Definitely after mod_ssl,
>>     * as we need its connection filters, but also before reqtimeout as its
>>     * method of timeouts is specific to HTTP/1.1 (as of now).
>>     * The core HTTP/1 processing run as REALLY_LAST, so we will have
>>     * a chance to take over before it.
>>     */
>>    ap_hook_process_connection(h2_c1_hook_process_connection,
>>                               mod_reqtimeout, NULL, APR_HOOK_LAST);
>>    ...
>> 
>> 
>> In my understanding this is how it should work. When mod_ssl's 
>> process_connection fails, it should return OK to prevent further hooks to 
>> run.
>> 
>> AP_IMPLEMENT_HOOK_RUN_FIRST(int,process_connection,(conn_rec 
>> *c),(c),DECLINED)
>> 
>> process_connection is a RUN_FIRST. So the first hook that returns OK, 
>> terminates it.
>> 
>> If mod_ssl returns OK in case of handshake errors, the connection is done. 
>> That is my read of it.
> 
> There are two parts that hook into the process_connection hook, the code 
> you’ve cited above, and this code:
> 
> void h2_c2_register_hooks(void)
> {
>     /* When the connection processing actually starts, we might
>      * take over, if the connection is for a h2 stream.
>      */
>     ap_hook_process_connection(h2_c2_hook_process,
>                                NULL, NULL, APR_HOOK_FIRST);
> 
> Looks like this code is running before mod_ssl somehow.
> 
> Is there a way to run the httpd under test in either lldb or gdb?

The names "h2_c1..." and "h2_c2..." indicate, that the former operates on 
"primary" connections, e.g. the ones from a client where SSL is applied, and 
"secondary" connections (c->master != NULL), e.g. where h2 requests are 
processed and SSL is not involved.

> 
> Regards,
> Graham
> —
> 

Reply via email to