> Le 8 mars 2017 à 12:15, Willy Tarreau <[email protected]> a écrit :
> 
> On Wed, Mar 08, 2017 at 12:01:39PM +0100, Emmanuel Hocdet wrote:
>> No because the block can be truncated, sample must be stored in a variable 
>> size buffer
>> to fix that. Do fingerprint earlier avoid such manipulation.
>> With this example it's now easy to add another sample. I would do it as 
>> needed :)
> 
> The problem is that in order to fit your very specific need, you would
> force everyone to store an untruncated sha256, which is a cryptographically
> safe hash, for something which doesn't warrant such a use at all. Since you
> are the one who *wants* this cryptographically safe hash, you are the one
> who has to take the cost of this specific use case. So let's just have a
> 1kB or so buffer to record the complete cipher string and apply your hash
> to it. That way it fits all purposes : those who don't need to apply crypto
> on this stuff will just store the minimum amount of info and those who have
> specific needs have to pay the cost.
> 

Yep, it’s why i will eventualy add a sample TLSfingerprint  to only compute 
cryptographically 
hash with all TLS informations. It will not impact others users and will not 
eat unneeded buffers.

> 
> 
>> 
>>>>>> For the code:
>>>>>> ssl->msg_callback_arg is considering as ssl internal. It should be a 
>>>>>> very good
>>>>>> think to avoid internal structures/undocumented call usage to try to 
>>>>>> control the 
>>>>>> beast or limit painful compatibilities.
>>>>>> In this case SSL_set_ex_data and SSL_get_ex_data will do the job.
>>>>> 
>>>>> Ah yes definitely, thanks for reporting this. I guess that openssl 1.1 
>>>>> will
>>>>> complain with a warning because of this.
>>>>> 
>>>>>> I will try to fix the patch, it breaks my compile environment.
>>>>> 
>>>> 
>>>> and the patch:
>>> 
>>> Thanks. Hmmm comments below :
>>> 
>>> @@ -4541,13 +4522,8 @@ static int ssl_sock_from_buf(struct connection 
>>> *conn, struct buffer *buf, int fl
>>> }
>>> 
>>> static void ssl_sock_close(struct connection *conn) {
>>> -   struct ssl_capture *capture;
>>> 
>>>     if (conn->xprt_ctx) {
>>> -#if OPENSSL_VERSION_NUMBER >= 0x00907000L
>>> -           capture = SSL_get_msg_callback_arg(conn->xprt_ctx);
>>> -           pool_free2(pool2_ssl_capture, capture);
>>> -#endif
>>> 
>>> This strongly looks like a memory leak to me, it looks like instead
>>> you want this :
>>> 
>>>             capture = SSL_get_ex_data(conn->xprt_ctx, 
>>> ssl_capture_ptr_index);
>>>             pool_free2(pool2_ssl_capture, capture);
>> 
>> It's done via callback when SSL is freeing:
>>             ssl_capture_ptr_index = SSL_CTX_get_ex_new_index(0, NULL, NULL, 
>> NULL, ssl_sock_capture_free_func);
>> (SSL_CTX_get_ex_new_index/SSL_get_ex_new_index do exactly the same job)
> 
> Ah OK I didn't notice this one.
> 
> However as I said to Thierry, please don't add "if (ptr)" before
> a pool_free2(), we have the same semantics as free() which is a
> NOP on NULL on all supported operating systems. If you want I can
> change it myself and merge.
> 
Ok, you can do the change.

>> And patch candidate to apply next.
> 
> This one looks good to me.
> 

Manu


Reply via email to