1cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* xmalloc.c -- malloc with out of memory checking 2cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 3cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 4cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 1999, 2000, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. 5cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 6cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project This program is free software; you can redistribute it and/or modify 7cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project it under the terms of the GNU General Public License as published by 8cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project the Free Software Foundation; either version 2, or (at your option) 9cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project any later version. 10cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 11cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project This program is distributed in the hope that it will be useful, 12cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project but WITHOUT ANY WARRANTY; without even the implied warranty of 13cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project GNU General Public License for more details. 15cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 16cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project You should have received a copy of the GNU General Public License 17cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project along with this program; if not, write to the Free Software Foundation, 18cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ 19cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 20cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifdef HAVE_CONFIG_H 21cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# include <config.h> 22cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif 23cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 24cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include "xalloc.h" 25cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 26cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <stdlib.h> 27cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#include <string.h> 28cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 29cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#ifndef SIZE_MAX 30cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project# define SIZE_MAX ((size_t) -1) 31cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif 32cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 33cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* 1 if calloc is known to be compatible with GNU calloc. This 34cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project matters if we are not also using the calloc module, which defines 35cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project HAVE_CALLOC and supports the GNU API even on non-GNU platforms. */ 36cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#if defined HAVE_CALLOC || defined __GLIBC__ 37cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectenum { HAVE_GNU_CALLOC = 1 }; 38cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#else 39cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectenum { HAVE_GNU_CALLOC = 0 }; 40cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project#endif 41cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 42cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Allocate an array of N objects, each with S bytes of memory, 43cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project dynamically, with error checking. S must be nonzero. */ 44cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 45cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic inline void * 46cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectxnmalloc_inline (size_t n, size_t s) 47cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 48cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project void *p; 49cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (xalloc_oversized (n, s) || (! (p = malloc (n * s)) && n != 0)) 50cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project xalloc_die (); 51cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return p; 52cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 53cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 54cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid * 55cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectxnmalloc (size_t n, size_t s) 56cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 57cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return xnmalloc_inline (n, s); 58cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 59cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 60cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Allocate N bytes of memory dynamically, with error checking. */ 61cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 62cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid * 63cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectxmalloc (size_t n) 64cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 65cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return xnmalloc_inline (n, 1); 66cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 67cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 68cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Change the size of an allocated block of memory P to an array of N 69cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project objects each of S bytes, with error checking. S must be nonzero. */ 70cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 71cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic inline void * 72cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectxnrealloc_inline (void *p, size_t n, size_t s) 73cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 74cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (xalloc_oversized (n, s) || (! (p = realloc (p, n * s)) && n != 0)) 75cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project xalloc_die (); 76cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return p; 77cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 78cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 79cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid * 80cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectxnrealloc (void *p, size_t n, size_t s) 81cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 82cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return xnrealloc_inline (p, n, s); 83cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 84cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 85cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Change the size of an allocated block of memory P to N bytes, 86cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project with error checking. */ 87cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 88cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid * 89cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectxrealloc (void *p, size_t n) 90cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 91cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return xnrealloc_inline (p, n, 1); 92cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 93cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 94cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 95cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* If P is null, allocate a block of at least *PN such objects; 96cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project otherwise, reallocate P so that it contains more than *PN objects 97cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project each of S bytes. *PN must be nonzero unless P is null, and S must 98cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project be nonzero. Set *PN to the new number of objects, and return the 99cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project pointer to the new block. *PN is never set to zero, and the 100cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project returned pointer is never null. 101cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 102cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project Repeated reallocations are guaranteed to make progress, either by 103cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project allocating an initial block with a nonzero size, or by allocating a 104cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project larger block. 105cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 106cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project In the following implementation, nonzero sizes are doubled so that 107cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project repeated reallocations have O(N log N) overall cost rather than 108cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project O(N**2) cost, but the specification for this function does not 109cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project guarantee that sizes are doubled. 110cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 111cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project Here is an example of use: 112cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 113cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int *p = NULL; 114cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project size_t used = 0; 115cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project size_t allocated = 0; 116cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 117cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project void 118cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project append_int (int value) 119cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 120cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (used == allocated) 121cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project p = x2nrealloc (p, &allocated, sizeof *p); 122cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project p[used++] = value; 123cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 124cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 125cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project This causes x2nrealloc to allocate a block of some nonzero size the 126cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project first time it is called. 127cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 128cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project To have finer-grained control over the initial size, set *PN to a 129cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project nonzero value before calling this function with P == NULL. For 130cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project example: 131cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 132cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project int *p = NULL; 133cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project size_t used = 0; 134cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project size_t allocated = 0; 135cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project size_t allocated1 = 1000; 136cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 137cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project void 138cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project append_int (int value) 139cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 140cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (used == allocated) 141cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 142cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project p = x2nrealloc (p, &allocated1, sizeof *p); 143cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project allocated = allocated1; 144cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 145cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project p[used++] = value; 146cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 147cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 148cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project */ 149cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 150cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectstatic inline void * 151cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectx2nrealloc_inline (void *p, size_t *pn, size_t s) 152cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 153cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project size_t n = *pn; 154cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 155cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (! p) 156cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 157cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (! n) 158cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 159cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* The approximate size to use for initial small allocation 160cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project requests, when the invoking code specifies an old size of 161cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project zero. 64 bytes is the largest "small" request for the 162cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project GNU C library malloc. */ 163cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project enum { DEFAULT_MXFAST = 64 }; 164cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 165cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project n = DEFAULT_MXFAST / s; 166cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project n += !n; 167cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 168cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 169cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project else 170cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project { 171cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if (SIZE_MAX / 2 / s < n) 172cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project xalloc_die (); 173cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project n *= 2; 174cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project } 175cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 176cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project *pn = n; 177cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return xrealloc (p, n * s); 178cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 179cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 180cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid * 181cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectx2nrealloc (void *p, size_t *pn, size_t s) 182cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 183cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return x2nrealloc_inline (p, pn, s); 184cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 185cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 186cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* If P is null, allocate a block of at least *PN bytes; otherwise, 187cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project reallocate P so that it contains more than *PN bytes. *PN must be 188cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project nonzero unless P is null. Set *PN to the new block's size, and 189cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return the pointer to the new block. *PN is never set to zero, and 190cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project the returned pointer is never null. */ 191cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 192cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid * 193cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectx2realloc (void *p, size_t *pn) 194cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 195cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return x2nrealloc_inline (p, pn, 1); 196cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 197cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 198cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Allocate S bytes of zeroed memory dynamically, with error checking. 199cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project There's no need for xnzalloc (N, S), since it would be equivalent 200cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project to xcalloc (N, S). */ 201cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 202cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid * 203cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectxzalloc (size_t s) 204cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 205cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return memset (xmalloc (s), 0, s); 206cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 207cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 208cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Allocate zeroed memory for N elements of S bytes, with error 209cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project checking. S must be nonzero. */ 210cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 211cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid * 212cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectxcalloc (size_t n, size_t s) 213cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 214cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project void *p; 215cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project /* Test for overflow, since some calloc implementations don't have 216cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project proper overflow checks. But omit overflow and size-zero tests if 217cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project HAVE_GNU_CALLOC, since GNU calloc catches overflow and never 218cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project returns NULL if successful. */ 219cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project if ((! HAVE_GNU_CALLOC && xalloc_oversized (n, s)) 220cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project || (! (p = calloc (n, s)) && (HAVE_GNU_CALLOC || n != 0))) 221cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project xalloc_die (); 222cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return p; 223cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 224cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 225cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Clone an object P of size S, with error checking. There's no need 226cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project for xnmemdup (P, N, S), since xmemdup (P, N * S) works without any 227cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project need for an arithmetic overflow check. */ 228cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 229cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectvoid * 230cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectxmemdup (void const *p, size_t s) 231cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 232cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return memcpy (xmalloc (s), p, s); 233cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 234cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 235cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project/* Clone STRING. */ 236cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project 237cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectchar * 238cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Projectxstrdup (char const *string) 239cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project{ 240cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project return xmemdup (string, strlen (string) + 1); 241cea198a11f15a2eb071d98491ca9a8bc8cebfbc4The Android Open Source Project} 242