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 Tjoelker 2020-04-28 20:34:27 +00:00
parent fc88ecd31a
commit 9f9c9549fd

View File

@ -50,6 +50,13 @@ __FBSDID("$FreeBSD$");
#include <stdlib.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.
*/
@ -59,9 +66,9 @@ ckmalloc(size_t nbytes)
{
pointer p;
INTOFF;
if (!is_int_on())
badalloc("Unsafe ckmalloc() call\n");
p = malloc(nbytes);
INTON;
if (p == NULL)
error("Out of space");
return p;
@ -75,9 +82,9 @@ ckmalloc(size_t nbytes)
pointer
ckrealloc(pointer p, int nbytes)
{
INTOFF;
if (!is_int_on())
badalloc("Unsafe ckrealloc() call\n");
p = realloc(p, nbytes);
INTON;
if (p == NULL)
error("Out of space");
return p;
@ -86,9 +93,9 @@ ckrealloc(pointer p, int nbytes)
void
ckfree(pointer p)
{
INTOFF;
if (!is_int_on())
badalloc("Unsafe ckfree() call\n");
free(p);
INTON;
}