On 11/6/18 8:59 AM, Claudio Jeker wrote:
> On Tue, Nov 06, 2018 at 08:21:57AM +0100, Martijn van Duren wrote:
>> ping
>>
>> On 10/24/18 10:27 AM, Martijn van Duren wrote:
>>> In my previous ldap mail I proclaimed that we should encode whitespace. 
>>> Reading rfc2849 a bit further, encoding a string with leading space is  
>>> mandatory by SAFE-INIT-CHAR. This is needed because of the definition
>>> of value-spec, which allows additional space, colon, and less-than
>>> after the colon separating the AttributeDescription.
>>>
>>> The code below adds these definitions. I also changed the outlen
>>> calculation because it at least fails b64_ntop on inlen == 1.
>>>
>>> OK?
> 
> See inline.
> 
>>> martijn@
>>>
>>> Index: ldapclient.c
>>> ===================================================================
>>> RCS file: /cvs/src/usr.bin/ldap/ldapclient.c,v
>>> retrieving revision 1.5
>>> diff -u -p -r1.5 ldapclient.c
>>> --- ldapclient.c    23 Oct 2018 08:28:34 -0000      1.5
>>> +++ ldapclient.c    24 Oct 2018 08:21:27 -0000
>>> @@ -404,8 +404,13 @@ ldapc_printattr(struct ldapc *ldap, cons
>>>              * in SAFE-STRINGs. String value that do not match the
>>>              * criteria must be encoded as Base64.
>>>              */
>>> -           for (cp = (const unsigned char *)value;
>>> -               encode == 0 &&*cp != '\0'; cp++) {
>>> +           cp = (const unsigned char *)value;
>>> +           /* !SAFE-INIT-CHAR: SAFE-CHAR minus %x20 %x3A %x3C */
>>> +           if (*cp == ' ' ||
>>> +               *cp == ':' ||
>>> +               *cp == '<')
>>> +                   encode = 1;
>>> +           for (; encode == 0 &&*cp != '\0'; cp++) {
>                                      ^ missing space
> 
>>>                     /* !SAFE-CHAR %x01-09 / %x0B-0C / %x0E-7F */
>>>                     if (*cp > 127 ||
>>>                         *cp == '\0' ||
> 
> The *cp == '\0' check here is strange since that is part of the for loop
> termination check.

See my other diff. The check for '\0' in the for-loop is incorrect,
since a attribute is transferred as an OCTETSTRING, but isn't required
to be an LDAPSTRING, AKA an UTF-8 string. (RFC4511 4.1.5)
> 
>>> @@ -421,7 +426,7 @@ ldapc_printattr(struct ldapc *ldap, cons
>>>                     }
>>>             } else {
>>>                     inlen = strlen(value);
>>> -                   outlen = inlen * 2 + 1;
>>> +                   outlen = (((inlen + 2) / 3) * 4) + 1;
> 
> I'm surprised that there is no macro to calculate the length of a base64
> string. Anyway math is right.
> 
>>>  
>>>                     if ((out = calloc(1, outlen)) == NULL ||
>>>                         b64_ntop(value, inlen, out, outlen) == -1) {
>>>
>>
> 
> OK claudio
> 

Reply via email to