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