On 16/08/17 04:15, Steffan Karger wrote:
> Hi,
> 
> On 12-08-17 06:05, Antonio Quartulli wrote:
>> From: Antonio Quartulli <anto...@openvpn.net>
>>
>> The problem is visible when compiling with -O2:
>>
>> ntlm.c: In function ‘ntlm_phase_3’:
>> ntlm.c:305:9: warning: dereferencing type-punned pointer will break 
>> strict-aliasing rules [-Wstrict-aliasing]
>>          if ((*((long *)&buf2[0x14]) & 0x00800000) == 0x00800000)
>>
>> The spec suggests to interpret those 4 bytes as a long, but
>> this needs to be done carefully.
>>
>> Signed-off-by: Antonio Quartulli <anto...@openvpn.net>
>> ---
>>
>> I have tried to make the statement more clear and "aliasing safe" at the same
>> time. However, this is only compiled tested as I have no way to test the 
>> whole
>> NTLM thing. Sorry :(
>>
>> Cheers,
>>
>>  src/openvpn/ntlm.c | 3 ++-
>>  1 file changed, 2 insertions(+), 1 deletion(-)
>>
>> diff --git a/src/openvpn/ntlm.c b/src/openvpn/ntlm.c
>> index 65c1cbf5..a251c11d 100644
>> --- a/src/openvpn/ntlm.c
>> +++ b/src/openvpn/ntlm.c
>> @@ -302,7 +302,8 @@ ntlm_phase_3(const struct http_proxy_info *p, const char 
>> *phase_2,
>>          /* Add target information block to the blob */
>>  
>>          /* Check for Target Information block */
>> -        if ((*((long *)&buf2[0x14]) & 0x00800000) == 0x00800000)
>> +        unsigned long *flags = (unsigned long *)(buf2 + 0x14);
>> +        if ((*flags & htonl(0x00800000)) == htonl(0x00800000))
>>          {
>>              tib_len = buf2[0x28];            /* Get Target Information 
>> block size */
>>              if (tib_len > 96)
>>
> 
> 
> I *think* this will break the functionality.  Consider the following
> test code:
> 
> #include <arpa/inet.h>
> #include <stdio.h>
> 
> int main(char *argv[], int argc)
> {
>     unsigned char buf[4] = {0, 0, 0x80, 0};
> 
>     if ((*((long *)&buf[0]) & 0x00800000) == 0x00800000)
>         printf("old: true\n");
>     else
>         printf("old: false\n");
> 
>     unsigned long *flags = (unsigned long *)(buf);
>     if ((*flags & htonl(0x00800000)) == htonl(0x00800000))
>         printf("new: true\n");
>     else
>         printf("new: false\n");
> 
>     return 0;
> }
> 
> On amd64, this prints:
> 
> old: true
> new: false
> 
> I'd expect some 'ntohl' call in this code somewhere, but that assumes
> that the NTLM spec was designed somewhat sane and uses network byte order...
> 

Right, that's also what I imagined, otherwise the code as it is wouldn't
work on every platform (not sure it does on LE archs)

> For now, I'd suggest to stick to just fixing the type-punned dereference
> and leave out any htonl/ntohl calls.
> 

yeah, might be safer. Will send v2.

Cheers,


-- 
Antonio Quartulli

Attachment: signature.asc
Description: OpenPGP digital signature

------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Openvpn-devel mailing list
Openvpn-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/openvpn-devel

Reply via email to