134192Sjdp/*- 234192Sjdp * Copyright 1996-1998 John D. Polstra. 334192Sjdp * All rights reserved. 434192Sjdp * 534192Sjdp * Redistribution and use in source and binary forms, with or without 634192Sjdp * modification, are permitted provided that the following conditions 734192Sjdp * are met: 834192Sjdp * 1. Redistributions of source code must retain the above copyright 934192Sjdp * notice, this list of conditions and the following disclaimer. 1034192Sjdp * 2. Redistributions in binary form must reproduce the above copyright 1134192Sjdp * notice, this list of conditions and the following disclaimer in the 1234192Sjdp * documentation and/or other materials provided with the distribution. 1334192Sjdp * 1434192Sjdp * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 1534192Sjdp * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 1634192Sjdp * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 1734192Sjdp * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 1834192Sjdp * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 1934192Sjdp * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2034192Sjdp * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2134192Sjdp * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2234192Sjdp * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2334192Sjdp * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2434192Sjdp * 2550476Speter * $FreeBSD$ 2634192Sjdp */ 2734192Sjdp 2834192Sjdp#include <stddef.h> 2934192Sjdp#include <stdlib.h> 3034192Sjdp#include <string.h> 31225152Skib#include <unistd.h> 32225152Skib#include "rtld.h" 33225152Skib#include "rtld_printf.h" 3434192Sjdp 3534192Sjdpvoid * 36233307Skibxcalloc(size_t number, size_t size) 3734192Sjdp{ 38233307Skib void *p; 39233307Skib 40233307Skib p = calloc(number, size); 41233307Skib if (p == NULL) { 42233307Skib rtld_fdputstr(STDERR_FILENO, "Out of memory\n"); 43233307Skib _exit(1); 44233307Skib } 45233307Skib return (p); 4634192Sjdp} 4734192Sjdp 4834192Sjdpvoid * 4934192Sjdpxmalloc(size_t size) 5034192Sjdp{ 5134192Sjdp void *p = malloc(size); 52225152Skib if (p == NULL) { 53225152Skib rtld_fdputstr(STDERR_FILENO, "Out of memory\n"); 54225152Skib _exit(1); 55225152Skib } 5634192Sjdp return p; 5734192Sjdp} 5834192Sjdp 5934192Sjdpchar * 60233357Skibxstrdup(const char *str) 6134192Sjdp{ 62233357Skib char *copy; 63233357Skib size_t len; 64233357Skib 65233357Skib len = strlen(str) + 1; 66233357Skib copy = xmalloc(len); 67233357Skib memcpy(copy, str, len); 68233357Skib return (copy); 6934192Sjdp} 70259043Skib 71259043Skibvoid * 72259043Skibmalloc_aligned(size_t size, size_t align) 73259043Skib{ 74259043Skib void *mem, *res; 75259043Skib 76262334Sdavidxu if (align < sizeof(void *)) 77262334Sdavidxu align = sizeof(void *); 78262277Sdavidxu 79262277Sdavidxu mem = xmalloc(size + sizeof(void *) + align - 1); 80262277Sdavidxu res = (void *)round((uintptr_t)mem + sizeof(void *), align); 81259043Skib *(void **)((uintptr_t)res - sizeof(void *)) = mem; 82259043Skib return (res); 83259043Skib} 84259043Skib 85259043Skibvoid 86259043Skibfree_aligned(void *ptr) 87259043Skib{ 88259043Skib void *mem; 89259043Skib uintptr_t x; 90259043Skib 91259043Skib if (ptr == NULL) 92259043Skib return; 93259043Skib x = (uintptr_t)ptr; 94259043Skib x -= sizeof(void *); 95259043Skib mem = *(void **)x; 96259043Skib free(mem); 97259043Skib} 98