diff options
Diffstat (limited to 'crypto/buffer')
| -rw-r--r-- | crypto/buffer/buf_str.c | 21 | ||||
| -rw-r--r-- | crypto/buffer/buffer.h | 6 | 
2 files changed, 20 insertions, 7 deletions
| diff --git a/crypto/buffer/buf_str.c b/crypto/buffer/buf_str.c index fdde3d7db4ba..233af246e4c5 100644 --- a/crypto/buffer/buf_str.c +++ b/crypto/buffer/buf_str.c @@ -58,12 +58,13 @@  #include <stdio.h>  #include "cryptlib.h" +#include <limits.h>  #include <openssl/buffer.h>  char *BUF_strdup(const char *str)  {      if (str == NULL) -        return (NULL); +        return NULL;      return BUF_strndup(str, strlen(str));  } @@ -72,14 +73,20 @@ char *BUF_strndup(const char *str, size_t siz)      char *ret;      if (str == NULL) -        return (NULL); +        return NULL; + +    if (siz >= INT_MAX) +        return NULL;      ret = OPENSSL_malloc(siz + 1);      if (ret == NULL) {          BUFerr(BUF_F_BUF_STRNDUP, ERR_R_MALLOC_FAILURE); -        return (NULL); +        return NULL;      } -    BUF_strlcpy(ret, str, siz + 1); + +    memcpy(ret, str, siz); +    ret[siz] = '\0'; +      return (ret);  } @@ -87,13 +94,13 @@ void *BUF_memdup(const void *data, size_t siz)  {      void *ret; -    if (data == NULL) -        return (NULL); +    if (data == NULL || siz >= INT_MAX) +        return NULL;      ret = OPENSSL_malloc(siz);      if (ret == NULL) {          BUFerr(BUF_F_BUF_MEMDUP, ERR_R_MALLOC_FAILURE); -        return (NULL); +        return NULL;      }      return memcpy(ret, data, siz);  } diff --git a/crypto/buffer/buffer.h b/crypto/buffer/buffer.h index 632df93c657c..89183adb4a8e 100644 --- a/crypto/buffer/buffer.h +++ b/crypto/buffer/buffer.h @@ -85,7 +85,13 @@ void BUF_MEM_free(BUF_MEM *a);  int BUF_MEM_grow(BUF_MEM *str, size_t len);  int BUF_MEM_grow_clean(BUF_MEM *str, size_t len);  char *BUF_strdup(const char *str); + +/* + * Like strndup, but in addition, explicitly guarantees to never read past the + * first |siz| bytes of |str|. + */  char *BUF_strndup(const char *str, size_t siz); +  void *BUF_memdup(const void *data, size_t siz);  void BUF_reverse(unsigned char *out, const unsigned char *in, size_t siz); | 
