Home | History | Annotate | Download | only in openssh
      1 /* $OpenBSD: xmalloc.c,v 1.27 2006/08/03 03:34:42 deraadt Exp $ */
      2 /*
      3  * Author: Tatu Ylonen <ylo (at) cs.hut.fi>
      4  * Copyright (c) 1995 Tatu Ylonen <ylo (at) cs.hut.fi>, Espoo, Finland
      5  *                    All rights reserved
      6  * Versions of malloc and friends that check their results, and never return
      7  * failure (they call fatal if they encounter an error).
      8  *
      9  * As far as I am concerned, the code I have written for this software
     10  * can be used freely for any purpose.  Any derived versions of this
     11  * software must be clearly marked as such, and if the derived work is
     12  * incompatible with the protocol description in the RFC file, it must be
     13  * called by a name other than "ssh" or "Secure Shell".
     14  */
     15 
     16 #include "includes.h"
     17 
     18 #include <sys/param.h>
     19 #include <stdarg.h>
     20 #include <stdio.h>
     21 #include <stdlib.h>
     22 #include <string.h>
     23 
     24 #include "xmalloc.h"
     25 #include "log.h"
     26 
     27 void *
     28 xmalloc(size_t size)
     29 {
     30 	void *ptr;
     31 
     32 	if (size == 0)
     33 		fatal("xmalloc: zero size");
     34 	ptr = malloc(size);
     35 	if (ptr == NULL)
     36 		fatal("xmalloc: out of memory (allocating %lu bytes)", (u_long) size);
     37 	return ptr;
     38 }
     39 
     40 void *
     41 xcalloc(size_t nmemb, size_t size)
     42 {
     43 	void *ptr;
     44 
     45 	if (size == 0 || nmemb == 0)
     46 		fatal("xcalloc: zero size");
     47 	if (SIZE_T_MAX / nmemb < size)
     48 		fatal("xcalloc: nmemb * size > SIZE_T_MAX");
     49 	ptr = calloc(nmemb, size);
     50 	if (ptr == NULL)
     51 		fatal("xcalloc: out of memory (allocating %lu bytes)",
     52 		    (u_long)(size * nmemb));
     53 	return ptr;
     54 }
     55 
     56 void *
     57 xrealloc(void *ptr, size_t nmemb, size_t size)
     58 {
     59 	void *new_ptr;
     60 	size_t new_size = nmemb * size;
     61 
     62 	if (new_size == 0)
     63 		fatal("xrealloc: zero size");
     64 	if (SIZE_T_MAX / nmemb < size)
     65 		fatal("xrealloc: nmemb * size > SIZE_T_MAX");
     66 	if (ptr == NULL)
     67 		new_ptr = malloc(new_size);
     68 	else
     69 		new_ptr = realloc(ptr, new_size);
     70 	if (new_ptr == NULL)
     71 		fatal("xrealloc: out of memory (new_size %lu bytes)",
     72 		    (u_long) new_size);
     73 	return new_ptr;
     74 }
     75 
     76 void
     77 xfree(void *ptr)
     78 {
     79 	if (ptr == NULL)
     80 		fatal("xfree: NULL pointer given as argument");
     81 	free(ptr);
     82 }
     83 
     84 char *
     85 xstrdup(const char *str)
     86 {
     87 	size_t len;
     88 	char *cp;
     89 
     90 	len = strlen(str) + 1;
     91 	cp = xmalloc(len);
     92 	strlcpy(cp, str, len);
     93 	return cp;
     94 }
     95 
     96 int
     97 xasprintf(char **ret, const char *fmt, ...)
     98 {
     99 	va_list ap;
    100 	int i;
    101 
    102 	va_start(ap, fmt);
    103 	i = vasprintf(ret, fmt, ap);
    104 	va_end(ap);
    105 
    106 	if (i < 0 || *ret == NULL)
    107 		fatal("xasprintf: could not allocate memory");
    108 
    109 	return (i);
    110 }
    111