Add BUF_strndup() and BUF_memdup(). Not currently used, but I've code
authorRichard Levitte <levitte@openssl.org>
Tue, 29 Apr 2003 22:08:57 +0000 (22:08 +0000)
committerRichard Levitte <levitte@openssl.org>
Tue, 29 Apr 2003 22:08:57 +0000 (22:08 +0000)
that uses them that I'll commit in a few days.

CHANGES
crypto/buffer/buf_err.c
crypto/buffer/buffer.c
crypto/buffer/buffer.h

diff --git a/CHANGES b/CHANGES
index 2a926d19173032e2852606496c97a9f2744e4e5a..9a416dea6bbfa9d8e2f3985dbdea7c2a9b2355dd 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -4,6 +4,12 @@
 
  Changes between 0.9.7a and 0.9.8  [xx XXX xxxx]
 
+  *) Add the functions BUF_strndup() and BUF_memdup().  BUF_strndup()
+     works like BUF_strdup() but can be used to duplicate a portion of
+     a string.  The copy gets NUL-terminated.  BUF_memdup() duplicates
+     a memory area.
+     [Richard Levitte]
+
   *) Add the function sk_find_ex() which works like sk_find(), but will
      return an index to an element even if an exact match couldn't be
      found.  The index is guaranteed to point at the element where the
index 6559060784cb2a34d6b5bb85d383f8ac8c1f4031..73702f0f102df9d3add0ac465147948e03e06583 100644 (file)
@@ -1,6 +1,6 @@
 /* crypto/buffer/buf_err.c */
 /* ====================================================================
- * Copyright (c) 1999 The OpenSSL Project.  All rights reserved.
+ * Copyright (c) 1999-2003 The OpenSSL Project.  All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
 #include <stdio.h>
 #include <openssl/err.h>
 #include <openssl/buffer.h>
-#include <openssl/opensslconf.h> /* To see if OPENSSL_NO_ERR is defined */
 
 /* BEGIN ERROR CODES */
 #ifndef OPENSSL_NO_ERR
 static ERR_STRING_DATA BUF_str_functs[]=
        {
+{ERR_PACK(0,BUF_F_BUF_MEMDUP,0),       "BUF_memdup"},
 {ERR_PACK(0,BUF_F_BUF_MEM_GROW,0),     "BUF_MEM_grow"},
 {ERR_PACK(0,BUF_F_BUF_MEM_NEW,0),      "BUF_MEM_new"},
 {ERR_PACK(0,BUF_F_BUF_STRDUP,0),       "BUF_strdup"},
+{ERR_PACK(0,BUF_F_BUF_STRNDUP,0),      "BUF_strndup"},
 {0,NULL}
        };
 
index d96487e7dbd06a2955516b91a1029bf7fbd6dfe7..03ebf23a14a03ef8145c07bc4887f7ff5f1c16d8 100644 (file)
@@ -163,23 +163,42 @@ int BUF_MEM_grow_clean(BUF_MEM *str, int len)
        }
 
 char *BUF_strdup(const char *str)
+       {
+       if (str == NULL) return(NULL);
+       return BUF_strndup(str, strlen(str));
+       }
+
+char *BUF_strndup(const char *str, size_t siz)
        {
        char *ret;
-       int n;
 
        if (str == NULL) return(NULL);
 
-       n=strlen(str);
-       ret=OPENSSL_malloc(n+1);
+       ret=OPENSSL_malloc(siz+1);
        if (ret == NULL) 
                {
-               BUFerr(BUF_F_BUF_STRDUP,ERR_R_MALLOC_FAILURE);
+               BUFerr(BUF_F_BUF_STRNDUP,ERR_R_MALLOC_FAILURE);
                return(NULL);
                }
-       memcpy(ret,str,n+1);
+       BUF_strlcpy(ret,str,siz+1);
        return(ret);
        }
 
+void *BUF_memdup(const void *data, size_t siz)
+       {
+       void *ret;
+
+       if (data == NULL) return(NULL);
+
+       ret=OPENSSL_malloc(siz);
+       if (ret == NULL) 
+               {
+               BUFerr(BUF_F_BUF_MEMDUP,ERR_R_MALLOC_FAILURE);
+               return(NULL);
+               }
+       return memcpy(ret, data, siz);
+       }       
+
 size_t BUF_strlcpy(char *dst, const char *src, size_t size)
        {
        size_t l = 0;
index 465dc34f3fea5696d723b17ce6b021eb00e31452..164f8aa6ee50bea4c3036c508933bb39e49b455d 100644 (file)
@@ -78,6 +78,8 @@ void  BUF_MEM_free(BUF_MEM *a);
 int    BUF_MEM_grow(BUF_MEM *str, int len);
 int    BUF_MEM_grow_clean(BUF_MEM *str, int len);
 char * BUF_strdup(const char *str);
+char * BUF_strndup(const char *str, size_t siz);
+void * BUF_memdup(const void *data, size_t siz);
 
 /* safe string functions */
 size_t BUF_strlcpy(char *dst,const char *src,size_t siz);
@@ -93,9 +95,11 @@ void ERR_load_BUF_strings(void);
 /* Error codes for the BUF functions. */
 
 /* Function codes. */
+#define BUF_F_BUF_MEMDUP                                103
 #define BUF_F_BUF_MEM_GROW                              100
 #define BUF_F_BUF_MEM_NEW                               101
 #define BUF_F_BUF_STRDUP                                102
+#define BUF_F_BUF_STRNDUP                               104
 
 /* Reason codes. */