Am 18.04.21 um 11:11 schrieb Gert Doering:
> Hi,
> 
> I would have merged this now, but it breaks ENABLE_ASYNC_PUSH... and
> while at it, I have more questions.
> 
> On Sun, Mar 28, 2021 at 02:02:40PM +0200, Arne Schwabe wrote:
> [..]
>> Patch V2: also rename context_auth to multi_state, explain a bit why this
>>           change is done.
> [..]
>> diff --git a/src/openvpn/forward.c b/src/openvpn/forward.c
>> index 6f7a50048..e3890f395 100644
>> --- a/src/openvpn/forward.c
>> +++ b/src/openvpn/forward.c
>> @@ -544,7 +544,7 @@ encrypt_sign(struct context *c, bool comp_frag)
>>       * Drop non-TLS outgoing packet if client-connect script/plugin
>>       * has not yet succeeded.
>>       */
>> -    if (c->c2.context_auth != CAS_SUCCEEDED)
>> +    if (c->c2.tls_multi && c->c2.tls_multi->multi_state != CAS_SUCCEEDED)
>>      {
>>          c->c2.buf.len = 0;
>>      }
> 
> This code assumes that c2.tls_multi can be NULL, otherwise the check is
> not needed.  OTOH, *if* it is NULL, I think we should actually drop the
> packet, because then it's certainly not CAS_SUCCEEDED.  So maybe make
> this:
> 
>> +    if (!c->c2.tls_multi || c->c2.tls_multi->multi_state != CAS_SUCCEEDED)
> 
> (two instances in forward.c)


Yes these are all "We always check multi_state unless we have no tls at
all (!c->c2.tls_multi) then we skip all TLS related checks. I will add
comments about this in the v3.

> 
>>  #if defined(ENABLE_ASYNC_PUSH)
>> -            if (is_cas_pending(mi->context.c2.context_auth)
>> +            if (is_cas_pending(mi->context.c2.authenticated)
>>                  && mi->client_connect_defer_state.deferred_ret_file)
>>              {
>>                  add_inotify_file_watch(m, mi, m->top.c2.inotify_fd,
> 
> This was overlooked, and the second line should be
> 
>> +            if (is_cas_pending(mi->context.c2.tls_multi->multi_state)
> 
> I think.  But this is a code change, so I'm not doing this on my own.
> 
> With this change, the code compiles and passes my server side torture
> chamber...

Yes. That is the correct change.


> 
> Test sets succeeded: 1 1a 1b 1c 1d 1e 2 2a 2b 2c 2g 2d 2e 2f 2z1 2z2 3 4 4a 
> 4b 5 5a 5b 5c 5d 5v1 5v2 5v3 5w1 5w2 5w3 5w4 5x1 5x2 5x3 5x4 6 7 7x 7y 8 8a 9 
> 9a.
> Test sets failed: 1x 2w 2x 2y.
> 
> (The failed tests are all "MTU <-> NCP non-AEAD" related, so "as expected")
> 
> 
>> diff --git a/src/openvpn/push.c b/src/openvpn/push.c
>> index 18d7c1e00..b43ffa364 100644
>> --- a/src/openvpn/push.c
>> +++ b/src/openvpn/push.c
>> @@ -854,14 +854,14 @@ process_incoming_push_request(struct context *c)
>>  {
>>      int ret = PUSH_MSG_ERROR;
>>  
>> -    if ((c->c2.tls_multi && tls_authentication_status(c->c2.tls_multi, 0) 
>> == TLS_AUTHENTICATION_FAILED)
>> -        || c->c2.context_auth == CAS_FAILED)
>> +    if (tls_authentication_status(c->c2.tls_multi, 0) == 
>> TLS_AUTHENTICATION_FAILED
>> +        || c->c2.tls_multi->multi_state == CAS_FAILED)
> 
> I wonder if the removal of the "if ((c->c2.tls_multi &&" part here is
> safe.  Is this guaranteed to be non-null even for the p2p-tls case?

Yes. TLS session all live in the multi structure. And client is already
basically p2p tls mode.


> I have added a case to the test rig for a "mode tls-server" server,
> and client instances that run with "--client" or "--tls-client" - so,
> asking for a PUSH or not.  These did not cause a server crash, so it
> seems "it is not NULL".  But it would be nice to be sure, though :-)


Yes. All control channel and multi related code always has multi defined.

Arne



_______________________________________________
Openvpn-devel mailing list
Openvpn-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openvpn-devel

Reply via email to