Annotation of embedaddon/curl/lib/strdup.c, revision 1.1
1.1 ! misho 1: /***************************************************************************
! 2: * _ _ ____ _
! 3: * Project ___| | | | _ \| |
! 4: * / __| | | | |_) | |
! 5: * | (__| |_| | _ <| |___
! 6: * \___|\___/|_| \_\_____|
! 7: *
! 8: * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
! 9: *
! 10: * This software is licensed as described in the file COPYING, which
! 11: * you should have received as part of this distribution. The terms
! 12: * are also available at https://curl.haxx.se/docs/copyright.html.
! 13: *
! 14: * You may opt to use, copy, modify, merge, publish, distribute and/or sell
! 15: * copies of the Software, and permit persons to whom the Software is
! 16: * furnished to do so, under the terms of the COPYING file.
! 17: *
! 18: * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
! 19: * KIND, either express or implied.
! 20: *
! 21: ***************************************************************************/
! 22:
! 23: #include "curl_setup.h"
! 24:
! 25: #include <curl/curl.h>
! 26:
! 27: #include "strdup.h"
! 28: #include "curl_memory.h"
! 29:
! 30: /* The last #include file should be: */
! 31: #include "memdebug.h"
! 32:
! 33: #ifndef HAVE_STRDUP
! 34: char *curlx_strdup(const char *str)
! 35: {
! 36: size_t len;
! 37: char *newstr;
! 38:
! 39: if(!str)
! 40: return (char *)NULL;
! 41:
! 42: len = strlen(str);
! 43:
! 44: if(len >= ((size_t)-1) / sizeof(char))
! 45: return (char *)NULL;
! 46:
! 47: newstr = malloc((len + 1)*sizeof(char));
! 48: if(!newstr)
! 49: return (char *)NULL;
! 50:
! 51: memcpy(newstr, str, (len + 1)*sizeof(char));
! 52:
! 53: return newstr;
! 54:
! 55: }
! 56: #endif
! 57:
! 58: /***************************************************************************
! 59: *
! 60: * Curl_memdup(source, length)
! 61: *
! 62: * Copies the 'source' data to a newly allocated buffer (that is
! 63: * returned). Copies 'length' bytes.
! 64: *
! 65: * Returns the new pointer or NULL on failure.
! 66: *
! 67: ***************************************************************************/
! 68: void *Curl_memdup(const void *src, size_t length)
! 69: {
! 70: void *buffer = malloc(length);
! 71: if(!buffer)
! 72: return NULL; /* fail */
! 73:
! 74: memcpy(buffer, src, length);
! 75:
! 76: return buffer;
! 77: }
! 78:
! 79: /***************************************************************************
! 80: *
! 81: * Curl_saferealloc(ptr, size)
! 82: *
! 83: * Does a normal realloc(), but will free the data pointer if the realloc
! 84: * fails. If 'size' is non-zero, it will free the data and return a failure.
! 85: *
! 86: * This convenience function is provided and used to help us avoid a common
! 87: * mistake pattern when we could pass in a zero, catch the NULL return and end
! 88: * up free'ing the memory twice.
! 89: *
! 90: * Returns the new pointer or NULL on failure.
! 91: *
! 92: ***************************************************************************/
! 93: void *Curl_saferealloc(void *ptr, size_t size)
! 94: {
! 95: void *datap = realloc(ptr, size);
! 96: if(size && !datap)
! 97: /* only free 'ptr' if size was non-zero */
! 98: free(ptr);
! 99: return datap;
! 100: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>