Changeset View
Changeset View
Standalone View
Standalone View
libexec/rtld-elf/xmalloc.c
Show All 21 Lines | |||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | ||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
* | * | ||||
* $FreeBSD$ | * $FreeBSD$ | ||||
*/ | */ | ||||
#include <sys/param.h> | |||||
#include <stddef.h> | #include <stddef.h> | ||||
#include <stdlib.h> | #include <stdlib.h> | ||||
#include <string.h> | #include <string.h> | ||||
#include <unistd.h> | #include <unistd.h> | ||||
#include "rtld.h" | #include "rtld.h" | ||||
#include "rtld_printf.h" | #include "rtld_printf.h" | ||||
#include "rtld_malloc.h" | #include "rtld_malloc.h" | ||||
#include "rtld_libc.h" | #include "rtld_libc.h" | ||||
Show All 33 Lines | xstrdup(const char *str) | ||||
len = strlen(str) + 1; | len = strlen(str) + 1; | ||||
copy = xmalloc(len); | copy = xmalloc(len); | ||||
memcpy(copy, str, len); | memcpy(copy, str, len); | ||||
return (copy); | return (copy); | ||||
} | } | ||||
void * | void * | ||||
malloc_aligned(size_t size, size_t align) | malloc_aligned(size_t size, size_t align, size_t offset) | ||||
{ | { | ||||
void *mem, *res; | char *mem, *res; | ||||
uintptr_t x; | |||||
offset &= align - 1; | |||||
if (align < sizeof(void *)) | if (align < sizeof(void *)) | ||||
align = sizeof(void *); | align = sizeof(void *); | ||||
mem = xmalloc(size + sizeof(void *) + align - 1); | mem = xmalloc(roundup(size, align) + roundup(sizeof(void *), | ||||
res = (void *)round((uintptr_t)mem + sizeof(void *), align); | align) + offset); | ||||
*(void **)((uintptr_t)res - sizeof(void *)) = mem; | x = roundup((uintptr_t)mem + sizeof(void *), align); | ||||
x += offset; | |||||
res = (void *)x; | |||||
x -= sizeof(void *); | |||||
memcpy((void *)x, &mem, sizeof(mem)); | |||||
return (res); | return (res); | ||||
} | } | ||||
void | void | ||||
free_aligned(void *ptr) | free_aligned(void *ptr) | ||||
{ | { | ||||
void *mem; | void *mem; | ||||
uintptr_t x; | uintptr_t x; | ||||
if (ptr == NULL) | if (ptr == NULL) | ||||
return; | return; | ||||
x = (uintptr_t)ptr; | x = (uintptr_t)ptr; | ||||
x -= sizeof(void *); | x -= sizeof(void *); | ||||
mem = *(void **)x; | memcpy(&mem, (void *)x, sizeof(mem)); | ||||
free(mem); | free(mem); | ||||
} | } |