sh: Assert INTOFF rather than applying it in ck*

As I noted in https://reviews.freebsd.org/D22756, INTOFF should be in effect
when calling ckmalloc/ckrealloc/ckfree to avoid memory leaks and double
frees. Therefore, change the functions to check if INTOFF is in effect
instead of applying it.

Reviewed by:	bdrewery
Differential Revision:	https://reviews.freebsd.org/D24599
This commit is contained in:
jilles 2020-04-28 20:34:27 +00:00
parent ba5c497845
commit 0b1d4f8660

View File

@ -50,6 +50,13 @@ __FBSDID("$FreeBSD$");
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include <unistd.h>
static void
badalloc(const char *message)
{
write(2, message, strlen(message));
abort();
}
/* /*
* Like malloc, but returns an error when out of space. * Like malloc, but returns an error when out of space.
*/ */
@ -59,9 +66,9 @@ ckmalloc(size_t nbytes)
{ {
pointer p; pointer p;
INTOFF; if (!is_int_on())
badalloc("Unsafe ckmalloc() call\n");
p = malloc(nbytes); p = malloc(nbytes);
INTON;
if (p == NULL) if (p == NULL)
error("Out of space"); error("Out of space");
return p; return p;
@ -75,9 +82,9 @@ ckmalloc(size_t nbytes)
pointer pointer
ckrealloc(pointer p, int nbytes) ckrealloc(pointer p, int nbytes)
{ {
INTOFF; if (!is_int_on())
badalloc("Unsafe ckrealloc() call\n");
p = realloc(p, nbytes); p = realloc(p, nbytes);
INTON;
if (p == NULL) if (p == NULL)
error("Out of space"); error("Out of space");
return p; return p;
@ -86,9 +93,9 @@ ckrealloc(pointer p, int nbytes)
void void
ckfree(pointer p) ckfree(pointer p)
{ {
INTOFF; if (!is_int_on())
badalloc("Unsafe ckfree() call\n");
free(p); free(p);
INTON;
} }