- change memset before free to explicit_bzero
 - change ordinary memset's to bzero
 - change if(!data) malloc else realloc to realloc
 - explicit_bzero on downsize instead of memset

Possible an advantage (the only?) of the previous allocator was this
memset would have never been optimised out.

Sorry for the git patch 

diff --git a/lib/libssl/src/crypto/buffer/buffer.c
b/lib/libssl/src/crypto/buffer/buffer.c index 486d6fe..fde718f 100644
--- a/lib/libssl/src/crypto/buffer/buffer.c
+++ b/lib/libssl/src/crypto/buffer/buffer.c
@@ -88,7 +88,7 @@ BUF_MEM_free(BUF_MEM *a)
                return;
 
        if (a->data != NULL) {
-               memset(a->data, 0, (unsigned int)a->max);
+               explicit_bzero(a->data, a->max);
                free(a->data);
        }
        free(a);
@@ -105,7 +105,7 @@ BUF_MEM_grow(BUF_MEM *str, size_t len)
                return (len);
        }
        if (str->max >= len) {
-               memset(&str->data[str->length], 0, len - str->length);
+               bzero(&str->data[str->length], len - str->length);
                str->length = len;
                return (len);
        }
@@ -115,17 +115,15 @@ BUF_MEM_grow(BUF_MEM *str, size_t len)
                return 0;
        }
        n = (len + 3) / 3 * 4;
-       if (str->data == NULL)
-               ret = malloc(n);
-       else
-               ret = realloc(str->data, n);
+       ret = realloc(str->data, n);
+
        if (ret == NULL) {
                BUFerr(BUF_F_BUF_MEM_GROW, ERR_R_MALLOC_FAILURE);
                len = 0;
        } else {
                str->data = ret;
                str->max = n;
-               memset(&str->data[str->length], 0, len - str->length);
+               bzero(&str->data[str->length], len - str->length);
                str->length = len;
        }
        return (len);
@@ -138,12 +136,12 @@ BUF_MEM_grow_clean(BUF_MEM *str, size_t len)
        size_t n;
 
        if (str->length >= len) {
-               memset(&str->data[len], 0, str->length - len);
+               explicit_bzero(&str->data[len], str->length - len);
                str->length = len;
                return (len);
        }
        if (str->max >= len) {
-               memset(&str->data[str->length], 0, len - str->length);
+               bzero(&str->data[str->length], len - str->length);
                str->length = len;
                return (len);
        }
@@ -166,7 +164,7 @@ BUF_MEM_grow_clean(BUF_MEM *str, size_t len)
        } else {
                str->data = ret;
                str->max = n;
-               memset(&str->data[str->length], 0, len - str->length);
+               bzero(&str->data[str->length], len - str->length);
                str->length = len;
        }
        return (len);

Reply via email to