On 18 Apr 2024, at 15:57, Yann Ylavic <ylavic....@gmail.com> wrote:

>> could be:
>> APR_DECLARE(apr_status_t) apr_buffer_str_set(apr_buffer_t *buf,
>>                                             char *str, apr_size_t len)
>> {
>>    if (len == APR_BUFFER_STRING) {
>>        len = str ? strlen(str) : 0;
>>    }
>>    if (len > APR_BUFFER_MAX) {
>>        return APR_EINVAL;
>>    }
>> 
>>    if (!str) {
>>        buf->d.str = NULL;
>>        buf->size = 0;
>>    }
>>    else {
>>        buf->d.str = str;
>>        buf->size = len;
>>    }
>>    buf->size |= ~APR_BUFFER_MAX;
> 
> The above conditional is not even needed, just:
>      buf->d.str = str;
>      buf->size = len | ~APR_BUFFER_MAX;
> works too.

Hmmm…

In the current implementation apr_buffer_alloc() is the simple case (absolute 
value of buf->size) and apr_buffer_len() is the complicated case.

Swapping them round as you’ve suggested makes a lot of sense, as we len far 
more often than we alloc.

We still have the case that alloc is one larger than len, so the real limit is 
SIZE_MAX/2-1. We can probably detect this with a simple mask, let me ponder.

All of this is a private implementation detail, your point this needs to be 
emphasized is spot on.

The only thing public about apr_buffer_t is sizeof, nothing else.

Regards,
Graham
—



Reply via email to