X-Git-Url: http://andersk.mit.edu/gitweb/openssh.git/blobdiff_plain/8efc0c151a0f57612e1aa0abb5b7d536db4cf76a..HEAD:/xmalloc.c diff --git a/xmalloc.c b/xmalloc.c index 4a8d190c..9985b4cc 100644 --- a/xmalloc.c +++ b/xmalloc.c @@ -1,56 +1,110 @@ +/* $OpenBSD: xmalloc.c,v 1.27 2006/08/03 03:34:42 deraadt Exp $ */ /* + * Author: Tatu Ylonen + * Copyright (c) 1995 Tatu Ylonen , Espoo, Finland + * All rights reserved + * Versions of malloc and friends that check their results, and never return + * failure (they call fatal if they encounter an error). + * + * As far as I am concerned, the code I have written for this software + * can be used freely for any purpose. Any derived versions of this + * software must be clearly marked as such, and if the derived work is + * incompatible with the protocol description in the RFC file, it must be + * called by a name other than "ssh" or "Secure Shell". + */ -xmalloc.c - -Author: Tatu Ylonen +#include "includes.h" -Copyright (c) 1995 Tatu Ylonen , Espoo, Finland - All rights reserved +#include +#include +#include +#include +#include -Created: Mon Mar 20 21:23:10 1995 ylo +#include "xmalloc.h" +#include "log.h" -Versions of malloc and friends that check their results, and never return -failure (they call fatal if they encounter an error). +void * +xmalloc(size_t size) +{ + void *ptr; -*/ + if (size == 0) + fatal("xmalloc: zero size"); + ptr = malloc(size); + if (ptr == NULL) + fatal("xmalloc: out of memory (allocating %lu bytes)", (u_long) size); + return ptr; +} -#include "includes.h" -RCSID("$Id$"); +void * +xcalloc(size_t nmemb, size_t size) +{ + void *ptr; -#include "ssh.h" + if (size == 0 || nmemb == 0) + fatal("xcalloc: zero size"); + if (SIZE_T_MAX / nmemb < size) + fatal("xcalloc: nmemb * size > SIZE_T_MAX"); + ptr = calloc(nmemb, size); + if (ptr == NULL) + fatal("xcalloc: out of memory (allocating %lu bytes)", + (u_long)(size * nmemb)); + return ptr; +} -void *xmalloc(size_t size) +void * +xrealloc(void *ptr, size_t nmemb, size_t size) { - void *ptr = malloc(size); - if (ptr == NULL) - fatal("xmalloc: out of memory (allocating %d bytes)", (int)size); - return ptr; + void *new_ptr; + size_t new_size = nmemb * size; + + if (new_size == 0) + fatal("xrealloc: zero size"); + if (SIZE_T_MAX / nmemb < size) + fatal("xrealloc: nmemb * size > SIZE_T_MAX"); + if (ptr == NULL) + new_ptr = malloc(new_size); + else + new_ptr = realloc(ptr, new_size); + if (new_ptr == NULL) + fatal("xrealloc: out of memory (new_size %lu bytes)", + (u_long) new_size); + return new_ptr; } -void *xrealloc(void *ptr, size_t new_size) +void +xfree(void *ptr) { - void *new_ptr; - - if (ptr == NULL) - fatal("xrealloc: NULL pointer given as argument"); - new_ptr = realloc(ptr, new_size); - if (new_ptr == NULL) - fatal("xrealloc: out of memory (new_size %d bytes)", (int)new_size); - return new_ptr; + if (ptr == NULL) + fatal("xfree: NULL pointer given as argument"); + free(ptr); } -void xfree(void *ptr) +char * +xstrdup(const char *str) { - if (ptr == NULL) - fatal("xfree: NULL pointer given as argument"); - free(ptr); + size_t len; + char *cp; + + len = strlen(str) + 1; + cp = xmalloc(len); + strlcpy(cp, str, len); + return cp; } -char *xstrdup(const char *str) +int +xasprintf(char **ret, const char *fmt, ...) { - int len = strlen(str) + 1; + va_list ap; + int i; + + va_start(ap, fmt); + i = vasprintf(ret, fmt, ap); + va_end(ap); + + if (i < 0 || *ret == NULL) + fatal("xasprintf: could not allocate memory"); - char *cp = xmalloc(len); - strlcpy(cp, str, len); - return cp; + return (i); }