version 1.10, 2007/10/17 04:26:04 |
version 1.11, 2008/11/14 11:58:08 |
|
|
/* |
/* |
* Copyright (c) 1999-2005 Todd C. Miller <Todd.Miller@courtesan.com> |
* Copyright (c) 1999-2005, 2007 |
|
* Todd C. Miller <Todd.Miller@courtesan.com> |
* |
* |
* Permission to use, copy, modify, and distribute this software for any |
* Permission to use, copy, modify, and distribute this software for any |
* purpose with or without fee is hereby granted, provided that the above |
* purpose with or without fee is hereby granted, provided that the above |
|
|
#if defined(HAVE_MALLOC_H) && !defined(STDC_HEADERS) |
#if defined(HAVE_MALLOC_H) && !defined(STDC_HEADERS) |
# include <malloc.h> |
# include <malloc.h> |
#endif /* HAVE_MALLOC_H && !STDC_HEADERS */ |
#endif /* HAVE_MALLOC_H && !STDC_HEADERS */ |
#ifdef HAVE_ERR_H |
|
# include <err.h> |
|
#else |
|
# include "emul/err.h" |
|
#endif /* HAVE_ERR_H */ |
|
#ifdef HAVE_INTTYPES_H |
#ifdef HAVE_INTTYPES_H |
# include <inttypes.h> |
# include <inttypes.h> |
#endif |
#endif |
|
|
#include "sudo.h" |
#include "sudo.h" |
|
|
#ifndef lint |
#ifndef lint |
__unused static const char rcsid[] = "$Sudo: alloc.c,v 1.23.2.4 2007/09/11 12:20:15 millert Exp $"; |
__unused static const char rcsid[] = "$Sudo: alloc.c,v 1.33 2008/11/09 14:13:12 millert Exp $"; |
#endif /* lint */ |
#endif /* lint */ |
|
|
/* |
/* |
|
|
* emalloc() calls the system malloc(3) and exits with an error if |
* emalloc() calls the system malloc(3) and exits with an error if |
* malloc(3) fails. |
* malloc(3) fails. |
*/ |
*/ |
VOID * |
void * |
emalloc(size) |
emalloc(size) |
size_t size; |
size_t size; |
{ |
{ |
VOID *ptr; |
void *ptr; |
|
|
if (size == 0) |
if (size == 0) |
errx(1, "internal error, tried to emalloc(0)"); |
errorx(1, "internal error, tried to emalloc(0)"); |
|
|
if ((ptr = (VOID *) malloc(size)) == NULL) |
if ((ptr = malloc(size)) == NULL) |
errx(1, "unable to allocate memory"); |
errorx(1, "unable to allocate memory"); |
return(ptr); |
return(ptr); |
} |
} |
|
|
|
|
* emalloc2() allocates nmemb * size bytes and exits with an error |
* emalloc2() allocates nmemb * size bytes and exits with an error |
* if overflow would occur or if the system malloc(3) fails. |
* if overflow would occur or if the system malloc(3) fails. |
*/ |
*/ |
VOID * |
void * |
emalloc2(nmemb, size) |
emalloc2(nmemb, size) |
size_t nmemb; |
size_t nmemb; |
size_t size; |
size_t size; |
{ |
{ |
VOID *ptr; |
void *ptr; |
|
|
if (nmemb == 0 || size == 0) |
if (nmemb == 0 || size == 0) |
errx(1, "internal error, tried to emalloc2(0)"); |
errorx(1, "internal error, tried to emalloc2(0)"); |
if (nmemb > SIZE_MAX / size) |
if (nmemb > SIZE_MAX / size) |
errx(1, "internal error, emalloc2() overflow"); |
errorx(1, "internal error, emalloc2() overflow"); |
|
|
size *= nmemb; |
size *= nmemb; |
if ((ptr = (VOID *) malloc(size)) == NULL) |
if ((ptr = malloc(size)) == NULL) |
errx(1, "unable to allocate memory"); |
errorx(1, "unable to allocate memory"); |
return(ptr); |
return(ptr); |
} |
} |
|
|
|
|
* realloc(3) fails. You can call erealloc() with a NULL pointer even |
* realloc(3) fails. You can call erealloc() with a NULL pointer even |
* if the system realloc(3) does not support this. |
* if the system realloc(3) does not support this. |
*/ |
*/ |
VOID * |
void * |
erealloc(ptr, size) |
erealloc(ptr, size) |
VOID *ptr; |
void *ptr; |
size_t size; |
size_t size; |
{ |
{ |
|
|
if (size == 0) |
if (size == 0) |
errx(1, "internal error, tried to erealloc(0)"); |
errorx(1, "internal error, tried to erealloc(0)"); |
|
|
ptr = ptr ? (VOID *) realloc(ptr, size) : (VOID *) malloc(size); |
ptr = ptr ? realloc(ptr, size) : malloc(size); |
if (ptr == NULL) |
if (ptr == NULL) |
errx(1, "unable to allocate memory"); |
errorx(1, "unable to allocate memory"); |
return(ptr); |
return(ptr); |
} |
} |
|
|
|
|
* You can call erealloc() with a NULL pointer even if the system realloc(3) |
* You can call erealloc() with a NULL pointer even if the system realloc(3) |
* does not support this. |
* does not support this. |
*/ |
*/ |
VOID * |
void * |
erealloc3(ptr, nmemb, size) |
erealloc3(ptr, nmemb, size) |
VOID *ptr; |
void *ptr; |
size_t nmemb; |
size_t nmemb; |
size_t size; |
size_t size; |
{ |
{ |
|
|
if (nmemb == 0 || size == 0) |
if (nmemb == 0 || size == 0) |
errx(1, "internal error, tried to erealloc3(0)"); |
errorx(1, "internal error, tried to erealloc3(0)"); |
if (nmemb > SIZE_MAX / size) |
if (nmemb > SIZE_MAX / size) |
errx(1, "internal error, erealloc3() overflow"); |
errorx(1, "internal error, erealloc3() overflow"); |
|
|
size *= nmemb; |
size *= nmemb; |
ptr = ptr ? (VOID *) realloc(ptr, size) : (VOID *) malloc(size); |
ptr = ptr ? realloc(ptr, size) : malloc(size); |
if (ptr == NULL) |
if (ptr == NULL) |
errx(1, "unable to allocate memory"); |
errorx(1, "unable to allocate memory"); |
return(ptr); |
return(ptr); |
} |
} |
|
|
|
|
va_end(ap); |
va_end(ap); |
|
|
if (len == -1) |
if (len == -1) |
errx(1, "unable to allocate memory"); |
errorx(1, "unable to allocate memory"); |
return(len); |
return(len); |
} |
} |
|
|
|
|
int len; |
int len; |
|
|
if ((len = vasprintf(ret, format, args)) == -1) |
if ((len = vasprintf(ret, format, args)) == -1) |
errx(1, "unable to allocate memory"); |
errorx(1, "unable to allocate memory"); |
return(len); |
return(len); |
} |
} |
|
|
|
|
*/ |
*/ |
void |
void |
efree(ptr) |
efree(ptr) |
VOID *ptr; |
void *ptr; |
{ |
{ |
if (ptr != NULL) |
if (ptr != NULL) |
free(ptr); |
free(ptr); |