1
0
Fork 0
mirror of git://git.code.sf.net/p/cdesktopenv/code synced 2025-03-09 15:50:02 +00:00

Add more out of memory checks (re: 18529b88) (#192)

The referenced commit neglected to add checks for strdup() calls.
That calls malloc() as well, and is used a lot.

This commit switches to another strategy: it adds wrapper functions
for all the allocation macros that check if the allocation
succeeded, so those checks don't need to be done manually.

src/cmd/ksh93/include/defs.h,
src/cmd/ksh93/sh/init.c:
- Add sh_malloc(), sh_realloc(), sh_calloc(), sh_strdup(),
  sh_memdup() wrapper functions with success checks. Call nospace()
  to error out if allocation fails.
- Update new_of() macro to use sh_malloc().
- Define new sh_newof() macro to replace newof(); it uses
  sh_realloc().

All other changed files:
- Replace the relevant calls with the wrappers.
- Remove now-redundant success checks from 18529b88.
- The ERROR_PANIC error message calls are updated to inclusive-or
  ERROR_SYSTEM into the exit code argument, so libast's error()
  appends the human-readable version of errno in square brackets.
  See src/lib/libast/man/error.3

src/cmd/ksh93/edit/history.c:
- Include "defs.h" to get access to the wrappers even if KSHELL is
  not defined.
- Since we're here, fix a compile error that occurred with KSHELL
  undefined by updating the type definition of hist_fname[] to
  match that of history.h.

src/cmd/ksh93/bltins/enum.c:
- To get access to sh_newof(), include "defs.h" instead of
  <shell.h> (note that "defs.h" includes <shell.h> itself).

src/cmd/ksh93/Mamfile:
- enum.c: depend on defs.h instead of shell.h.
- enum.o: add an -I. flag in the compiler invocation so that defs.h
  can find its subsequent includes.

src/cmd/builtin/pty.c:
- Define one outofmemory() function and call that instead of
  repeating the error message call.
- outofmemory() never returns, so remove superfluous exit handling.

Co-authored-by: Martijn Dekker <martijn@inlv.org>
This commit is contained in:
Johnothan King 2021-02-27 13:21:58 -08:00 committed by GitHub
parent c928046aa9
commit 7ad274f8b6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
33 changed files with 261 additions and 371 deletions

View file

@ -266,7 +266,7 @@ Lex_t *sh_lexopen(Lex_t *lp, Shell_t *sp, int mode)
{
if(!lp)
{
lp = (Lex_t*)newof(0,Lex_t,1,0);
lp = (Lex_t*)sh_newof(0,Lex_t,1,0);
lp->sh = sp;
}
fcnotify(lex_advance,lp);
@ -1704,7 +1704,7 @@ static void nested_here(register Lex_t *lp)
base = stkfreeze(stkp,0);
if(lp->lexd.docend)
n = fcseek(0)-lp->lexd.docend;
iop = newof(0,struct ionod,1,lp->lexd.docextra+n+ARGVAL);
iop = sh_newof(0,struct ionod,1,lp->lexd.docextra+n+ARGVAL);
iop->iolst = lp->heredoc;
stkseek(stkp,ARGVAL);
if(lp->lexd.docextra)
@ -2485,9 +2485,7 @@ done:
static void setupalias(Lex_t *lp, const char *string,Namval_t *np)
{
register Sfio_t *iop, *base;
struct alias *ap = (struct alias*)malloc(sizeof(struct alias));
if(!ap)
sh_outofmemory();
struct alias *ap = (struct alias*)sh_malloc(sizeof(struct alias));
ap->disc = alias_disc;
ap->lp = lp;
ap->buf[1] = 0;
@ -2524,11 +2522,9 @@ static int stack_grow(Lex_t *lp)
{
lp->lexd.lex_max += STACK_ARRAY;
if(lp->lexd.lex_match)
lp->lexd.lex_match = (int*)realloc((char*)lp->lexd.lex_match,sizeof(int)*lp->lexd.lex_max);
lp->lexd.lex_match = (int*)sh_realloc((char*)lp->lexd.lex_match,sizeof(int)*lp->lexd.lex_max);
else
lp->lexd.lex_match = (int*)malloc(sizeof(int)*STACK_ARRAY);
if(!lp->lexd.lex_match)
sh_outofmemory();
lp->lexd.lex_match = (int*)sh_malloc(sizeof(int)*STACK_ARRAY);
return(1);
}