11305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood/* $OpenBSD: xmalloc.c,v 1.27 2006/08/03 03:34:42 deraadt Exp $ */ 21305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood/* 31305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Author: Tatu Ylonen <ylo@cs.hut.fi> 41305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland 51305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * All rights reserved 61305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * Versions of malloc and friends that check their results, and never return 71305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * failure (they call fatal if they encounter an error). 81305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * 91305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * As far as I am concerned, the code I have written for this software 101305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * can be used freely for any purpose. Any derived versions of this 111305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * software must be clearly marked as such, and if the derived work is 121305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * incompatible with the protocol description in the RFC file, it must be 131305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood * called by a name other than "ssh" or "Secure Shell". 141305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood */ 151305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 161305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "includes.h" 171305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 181305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include <sys/param.h> 191305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include <stdarg.h> 201305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include <stdio.h> 211305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include <stdlib.h> 221305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include <string.h> 231305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 241305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "xmalloc.h" 251305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood#include "log.h" 261305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 271305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid * 281305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodxmalloc(size_t size) 291305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 301305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood void *ptr; 311305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 321305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (size == 0) 331305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood fatal("xmalloc: zero size"); 341305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood ptr = malloc(size); 351305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (ptr == NULL) 361305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood fatal("xmalloc: out of memory (allocating %lu bytes)", (u_long) size); 371305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return ptr; 381305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 391305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 401305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid * 411305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodxcalloc(size_t nmemb, size_t size) 421305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 431305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood void *ptr; 441305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 451305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (size == 0 || nmemb == 0) 461305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood fatal("xcalloc: zero size"); 471305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (SIZE_T_MAX / nmemb < size) 481305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood fatal("xcalloc: nmemb * size > SIZE_T_MAX"); 491305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood ptr = calloc(nmemb, size); 501305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (ptr == NULL) 511305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood fatal("xcalloc: out of memory (allocating %lu bytes)", 521305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood (u_long)(size * nmemb)); 531305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return ptr; 541305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 551305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 561305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid * 571305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodxrealloc(void *ptr, size_t nmemb, size_t size) 581305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 591305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood void *new_ptr; 601305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood size_t new_size = nmemb * size; 611305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 621305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (new_size == 0) 631305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood fatal("xrealloc: zero size"); 641305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (SIZE_T_MAX / nmemb < size) 651305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood fatal("xrealloc: nmemb * size > SIZE_T_MAX"); 661305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (ptr == NULL) 671305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood new_ptr = malloc(new_size); 681305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood else 691305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood new_ptr = realloc(ptr, new_size); 701305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (new_ptr == NULL) 711305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood fatal("xrealloc: out of memory (new_size %lu bytes)", 721305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood (u_long) new_size); 731305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return new_ptr; 741305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 751305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 761305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodvoid 771305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodxfree(void *ptr) 781305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 791305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (ptr == NULL) 801305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood fatal("xfree: NULL pointer given as argument"); 811305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood free(ptr); 821305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 831305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 841305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodchar * 851305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodxstrdup(const char *str) 861305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 871305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood size_t len; 881305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood char *cp; 891305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 901305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood len = strlen(str) + 1; 911305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood cp = xmalloc(len); 921305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood strlcpy(cp, str, len); 931305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return cp; 941305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 951305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 961305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodint 971305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwoodxasprintf(char **ret, const char *fmt, ...) 981305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood{ 991305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood va_list ap; 1001305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood int i; 1011305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1021305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood va_start(ap, fmt); 1031305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood i = vasprintf(ret, fmt, ap); 1041305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood va_end(ap); 1051305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1061305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood if (i < 0 || *ret == NULL) 1071305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood fatal("xasprintf: could not allocate memory"); 1081305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood 1091305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood return (i); 1101305e95ba6ff9fa202d0818caf10405df4b0f648Mike Lockwood} 111