Add efree() for consistency with emalloc() et al. Allows us to rely

on C89 behavior (free(NULL) is valid) even on K&R.
This commit is contained in:
Todd C. Miller
2005-03-29 14:29:47 +00:00
parent 9efe91fa1e
commit 304dc46d7f
19 changed files with 107 additions and 125 deletions

View File

@@ -116,7 +116,7 @@ alias_add(name, type, members)
a->type = type;
a->first_member = members;
if (rbinsert(aliases, a)) {
free(a);
efree(a);
snprintf(errbuf, sizeof(errbuf), "Alias `%s' already defined", name);
return(errbuf);
}
@@ -156,11 +156,10 @@ alias_free(v)
for (m = a->first_member; m != NULL; m = next) {
next = m->next;
if (m->name != NULL)
free(m->name);
free(m);
efree(m->name);
efree(m);
}
free(a);
efree(a);
}
/*

11
alloc.c
View File

@@ -211,3 +211,14 @@ evasprintf(ret, format, args)
errorx(1, "unable to allocate memory");
return(len);
}
/*
* Wrapper for free(3) so we can depend on C89 semantics.
*/
void
efree(ptr)
VOID *ptr;
{
if (ptr != NULL)
free(ptr);
}

10
check.c
View File

@@ -100,9 +100,8 @@ check_user(override)
}
if (status != TS_ERROR)
update_timestamp(timestampdir, timestampfile);
free(timestampdir);
if (timestampfile)
free(timestampfile);
efree(timestampdir);
efree(timestampfile);
}
/*
@@ -551,7 +550,6 @@ remove_timestamp(remove)
}
}
free(timestampdir);
if (timestampfile)
free(timestampfile);
efree(timestampdir);
efree(timestampfile);
}

View File

@@ -362,10 +362,8 @@ init_defaults()
for (def = sudo_defs_table; def->name; def++) {
switch (def->type & T_MASK) {
case T_STR:
if (def->sd_un.str) {
free(def->sd_un.str);
efree(def->sd_un.str);
def->sd_un.str = NULL;
}
break;
case T_LIST:
list_op(NULL, 0, def, freeall);
@@ -621,8 +619,7 @@ store_str(val, def, op)
int op;
{
if (def->sd_un.str)
free(def->sd_un.str);
efree(def->sd_un.str);
if (op == FALSE)
def->sd_un.str = NULL;
else
@@ -771,8 +768,8 @@ list_op(val, len, def, op)
for (cur = def->sd_un.list; cur; ) {
tmp = cur;
cur = tmp->next;
free(tmp->value);
free(tmp);
efree(tmp->value);
efree(tmp);
}
def->sd_un.list = NULL;
return;
@@ -789,8 +786,8 @@ list_op(val, len, def, op)
prev->next = cur->next;
else
def->sd_un.list = cur->next;
free(cur->value);
free(cur);
efree(cur->value);
efree(cur);
break;
}
}

View File

@@ -120,7 +120,7 @@ find_path(infile, outfile, sbp, path)
path = n + 1;
} while (n);
free(origpath);
efree(origpath);
/*
* Check current dir if dot was in the PATH

45
gram.c
View File

@@ -664,35 +664,31 @@ init_parser(path, quiet)
for (us = userspecs; us != NULL; us = next) {
for (m = us->user; m != NULL; m = next) {
next = m->next;
if (m->name != NULL)
free(m->name);
free(m);
efree(m->name);
efree(m);
}
for (priv = us->privileges; priv != NULL; priv = next) {
for (m = priv->hostlist; m != NULL; m = next) {
next = m->next;
if (m->name != NULL)
free(m->name);
free(m);
efree(m->name);
efree(m);
}
for (cs = priv->cmndlist; cs != NULL; cs = next) {
for (m = cs->runaslist; m != NULL; m = next) {
next = m->next;
if (m->name != NULL)
free(m->name);
free(m);
efree(m->name);
efree(m);
}
if (cs->cmnd->name != NULL)
free(cs->cmnd->name);
free(cs->cmnd);
efree(cs->cmnd->name);
efree(cs->cmnd);
next = cs->next;
free(cs);
efree(cs);
}
next = priv->next;
free(priv);
efree(priv);
}
next = us->next;
free(us);
efree(us);
}
userspecs = NULL;
@@ -701,24 +697,21 @@ init_parser(path, quiet)
if (d->binding != lastbinding) {
for (m = d->binding; m != NULL; m = next) {
next = m->next;
if (m->name != NULL)
free(m->name);
free(m);
efree(m->name);
efree(m);
}
lastbinding = d->binding;
}
next = d->next;
free(d->var);
if (d->val != NULL)
free(d->val);
free(d);
efree(d->var);
efree(d->val);
efree(d);
}
defaults = NULL;
init_aliases();
if (sudoers != NULL)
free(sudoers);
efree(sudoers);
sudoers = estrdup(path);
parse_error = FALSE;
@@ -726,7 +719,7 @@ init_parser(path, quiet)
sudolineno = 1;
verbose = !quiet;
}
#line 678 "gram.c"
#line 671 "gram.c"
/* allocate initial stack or double stack size, up to YYMAXDEPTH */
#if defined(__cplusplus) || defined(__STDC__)
static int yygrowstack(void)
@@ -1371,7 +1364,7 @@ case 84:
NEW_MEMBER(yyval.member, yyvsp[0].string, WORD);
}
break;
#line 1323 "gram.c"
#line 1316 "gram.c"
}
yyssp -= yym;
yystate = *yyssp;

41
gram.y
View File

@@ -562,35 +562,31 @@ init_parser(path, quiet)
for (us = userspecs; us != NULL; us = next) {
for (m = us->user; m != NULL; m = next) {
next = m->next;
if (m->name != NULL)
free(m->name);
free(m);
efree(m->name);
efree(m);
}
for (priv = us->privileges; priv != NULL; priv = next) {
for (m = priv->hostlist; m != NULL; m = next) {
next = m->next;
if (m->name != NULL)
free(m->name);
free(m);
efree(m->name);
efree(m);
}
for (cs = priv->cmndlist; cs != NULL; cs = next) {
for (m = cs->runaslist; m != NULL; m = next) {
next = m->next;
if (m->name != NULL)
free(m->name);
free(m);
efree(m->name);
efree(m);
}
if (cs->cmnd->name != NULL)
free(cs->cmnd->name);
free(cs->cmnd);
efree(cs->cmnd->name);
efree(cs->cmnd);
next = cs->next;
free(cs);
efree(cs);
}
next = priv->next;
free(priv);
efree(priv);
}
next = us->next;
free(us);
efree(us);
}
userspecs = NULL;
@@ -599,24 +595,21 @@ init_parser(path, quiet)
if (d->binding != lastbinding) {
for (m = d->binding; m != NULL; m = next) {
next = m->next;
if (m->name != NULL)
free(m->name);
free(m);
efree(m->name);
efree(m);
}
lastbinding = d->binding;
}
next = d->next;
free(d->var);
if (d->val != NULL)
free(d->val);
free(d);
efree(d->var);
efree(d->val);
efree(d);
}
defaults = NULL;
init_aliases();
if (sudoers != NULL)
free(sudoers);
efree(sudoers);
sudoers = estrdup(path);
parse_error = FALSE;

View File

@@ -146,7 +146,7 @@ load_interfaces()
#ifdef HAVE_FREEIFADDRS
freeifaddrs(ifaddrs);
#else
free(ifaddrs);
efree(ifaddrs);
#endif
}
@@ -189,7 +189,7 @@ load_interfaces()
#else
if (ioctl(sock, SIOCGIFCONF, (caddr_t) ifconf) < 0) {
#endif /* _ISC */
free(ifconf_buf);
efree(ifconf_buf);
(void) close(sock);
return;
}
@@ -279,9 +279,9 @@ load_interfaces()
interfaces = (struct interface *) erealloc3(interfaces,
num_interfaces, sizeof(struct interface));
else
free(interfaces);
efree(interfaces);
}
free(ifconf_buf);
efree(ifconf_buf);
(void) close(sock);
}

12
ldap.c
View File

@@ -260,8 +260,7 @@ sudo_ldap_check_command(ld, entry)
/* Match against ALL ? */
if (!strcasecmp(*p, "ALL")) {
ret = TRUE;
if (safe_cmnd)
free(safe_cmnd);
efree(safe_cmnd);
safe_cmnd = estrdup(user_cmnd);
if (ldap_conf.debug > 1)
printf(" MATCH!\n");
@@ -295,7 +294,7 @@ sudo_ldap_check_command(ld, entry)
printf(" not\n");
}
free(allowed_cmnd); /* cleanup */
efree(allowed_cmnd); /* cleanup */
}
if (v)
@@ -348,7 +347,7 @@ sudo_ldap_parse_options(ld, entry)
/* case var Boolean True */
set_default(var, NULL, TRUE);
}
free(var);
efree(var);
}
if (v)
@@ -524,7 +523,7 @@ sudo_ldap_read_config()
/* The following macros make the code much more readable */
#define MATCH_S(x,y) if (!strcasecmp(keyword,x)) \
{ if (y) free(y); y=estrdup(value); }
{ efree(y); y=estrdup(value); }
#define MATCH_I(x,y) if (!strcasecmp(keyword,x)) { y=atoi(value); }
#define MATCH_B(x,y) if (!strcasecmp(keyword,x)) { y=_atobool(value); }
@@ -905,8 +904,7 @@ sudo_ldap_check(v, pwflag)
if (ldap_conf.debug)
printf("nothing found for '%s'\n", filt);
}
if (filt)
free(filt);
efree(filt);
/* parse each entry returned from this most recent search */
entry = rc ? NULL : ldap_first_entry(ld, result);

View File

@@ -189,12 +189,12 @@ do_logfile(msg)
easprintf(&full_line, "Can't open log file: %s: %s",
def_logfile, strerror(errno));
send_mail(full_line);
free(full_line);
efree(full_line);
} else if (!lock_file(fileno(fp), SUDO_LOCK)) {
easprintf(&full_line, "Can't lock log file: %s: %s",
def_logfile, strerror(errno));
send_mail(full_line);
free(full_line);
efree(full_line);
} else {
if (def_loglinelen == 0) {
/* Don't pretty-print long log file lines (hard to grep) */
@@ -259,7 +259,7 @@ do_logfile(msg)
beg = NULL; /* exit condition */
}
}
free(full_line);
efree(full_line);
}
(void) fflush(fp);
(void) lock_file(fileno(fp), SUDO_UNLOCK);
@@ -330,7 +330,7 @@ log_auth(status, inform_user)
if (def_logfile)
do_logfile(logline);
free(logline);
efree(logline);
}
void
@@ -410,9 +410,9 @@ log_error(flags, fmt, va_alist)
if (def_logfile)
do_logfile(logline);
free(message);
efree(message);
if (logline != message)
free(logline);
efree(logline);
if (!ISSET(flags, NO_EXIT))
exit(1);

17
match.c
View File

@@ -293,8 +293,7 @@ command_matches(sudoers_cmnd, sudoers_args)
(!user_args && sudoers_args && !strcmp("\"\"", sudoers_args)) ||
(sudoers_args &&
fnmatch(sudoers_args, user_args ? user_args : "", 0) == 0)) {
if (safe_cmnd)
free(safe_cmnd);
efree(safe_cmnd);
safe_cmnd = estrdup(sudoers_cmnd);
return(TRUE);
} else
@@ -331,8 +330,7 @@ command_matches(sudoers_cmnd, sudoers_args)
if (user_stat == NULL ||
(user_stat->st_dev == sudoers_stat.st_dev &&
user_stat->st_ino == sudoers_stat.st_ino)) {
if (safe_cmnd)
free(safe_cmnd);
efree(safe_cmnd);
safe_cmnd = estrdup(*ap);
break;
}
@@ -345,8 +343,7 @@ command_matches(sudoers_cmnd, sudoers_args)
(!user_args && sudoers_args && !strcmp("\"\"", sudoers_args)) ||
(sudoers_args &&
fnmatch(sudoers_args, user_args ? user_args : "", 0) == 0)) {
if (safe_cmnd)
free(safe_cmnd);
efree(safe_cmnd);
safe_cmnd = estrdup(user_cmnd);
return(TRUE);
} else
@@ -382,8 +379,7 @@ command_matches(sudoers_cmnd, sudoers_args)
(!user_args && sudoers_args && !strcmp("\"\"", sudoers_args)) ||
(sudoers_args &&
fnmatch(sudoers_args, user_args ? user_args : "", 0) == 0)) {
if (safe_cmnd)
free(safe_cmnd);
efree(safe_cmnd);
safe_cmnd = estrdup(sudoers_cmnd);
return(TRUE);
} else
@@ -411,8 +407,7 @@ command_matches(sudoers_cmnd, sudoers_args)
continue;
if (user_stat->st_dev == sudoers_stat.st_dev &&
user_stat->st_ino == sudoers_stat.st_ino) {
if (safe_cmnd)
free(safe_cmnd);
efree(safe_cmnd);
safe_cmnd = estrdup(buf);
break;
}
@@ -581,7 +576,7 @@ netgr_matches(netgr, lhost, shost, user)
if (domain == (char *) -1) {
domain = (char *) emalloc(MAXHOSTNAMELEN);
if (getdomainname(domain, MAXHOSTNAMELEN) == -1 || *domain == '\0') {
free(domain);
efree(domain);
domain = NULL;
}
}

View File

@@ -363,7 +363,7 @@ rm_child(pid)
prev->next = cur->next;
else
children.first = cur->next;
free(cur);
efree(cur);
break;
}
prev = cur;

View File

@@ -290,11 +290,11 @@ sudo_fakepwuid(uid)
/* Store by uid and by name, overwriting cached version. */
if ((node = rbinsert(pwcache_byuid, pw)) != NULL) {
free(node->data);
efree(node->data);
node->data = (VOID *) pw;
}
if ((node = rbinsert(pwcache_byname, pw)) != NULL) {
free(node->data);
efree(node->data);
node->data = (VOID *) pw;
}
return(pw);
@@ -320,11 +320,11 @@ sudo_fakepwnam(user)
/* Store by uid and by name, overwriting cached version. */
if ((node = rbinsert(pwcache_byuid, pw)) != NULL) {
free(node->data);
efree(node->data);
node->data = (VOID *) pw;
}
if ((node = rbinsert(pwcache_byname, pw)) != NULL) {
free(node->data);
efree(node->data);
node->data = (VOID *) pw;
}
return(pw);
@@ -362,9 +362,9 @@ pw_free(v)
if (pw->pw_passwd != NULL) {
zero_bytes(pw->pw_passwd, strlen(pw->pw_passwd));
free(pw->pw_passwd);
efree(pw->pw_passwd);
}
free(pw);
efree(pw);
}
/*

View File

@@ -326,7 +326,7 @@ _rbdestroy(tree, node, destroy)
_rbdestroy(tree, node->right, destroy);
if (destroy != NULL)
destroy(node->data);
free(node);
efree(node);
}
}
@@ -340,7 +340,7 @@ rbdestroy(tree, destroy)
void (*destroy)__P((VOID *));
{
_rbdestroy(tree, rbfirst(tree), destroy);
free(tree);
efree(tree);
}
/*
@@ -379,7 +379,7 @@ rbdelete(tree, victim)
else
victim->parent->right = succ;
data = victim->data;
free(victim);
efree(victim);
} else {
pred = victim->left == rbnil(tree) ? victim->right : victim->left;
if (victim->parent == rbroot(tree)) {
@@ -394,7 +394,7 @@ rbdelete(tree, victim)
if (victim->color == black)
rbrepair(tree, pred);
data = victim->data;
free(victim);
efree(victim);
}
return(data);
}

4
sudo.c
View File

@@ -1091,8 +1091,8 @@ set_fqdn()
"unable to lookup %s via gethostbyname()", user_host);
} else {
if (user_shost != user_host)
free(user_shost);
free(user_host);
efree(user_shost);
efree(user_host);
user_host = estrdup(hp->h_name);
}
if ((p = strchr(user_host, '.'))) {

1
sudo.h
View File

@@ -237,6 +237,7 @@ int easprintf __P((char **, const char *, ...))
__printflike(2, 3);
int evasprintf __P((char **, const char *, va_list))
__printflike(2, 0);
void efree __P((VOID *));
void dump_defaults __P((void));
void dump_auth_methods __P((void));
void init_envtables __P((void));

5
toke.c
View File

@@ -2756,8 +2756,7 @@ fill_args(s, len, addspace)
(char *) realloc(yylval.command.args, arg_size) :
(char *) malloc(arg_size);
if (p == NULL) {
if (yylval.command.args != NULL)
free(yylval.command.args);
efree(yylval.command.args);
yyerror("unable to allocate memory");
return(FALSE);
} else
@@ -2833,7 +2832,7 @@ switch_buffer(path)
fclose(YY_CURRENT_BUFFER->yy_input_file);
yy_delete_buffer(YY_CURRENT_BUFFER);
yy_switch_to_buffer(state[depth].bs);
free(sudoers);
efree(sudoers);
sudoers = state[depth].path;
sudolineno = state[depth].lineno;
keepopen = FALSE;

5
toke.l
View File

@@ -508,8 +508,7 @@ fill_args(s, len, addspace)
(char *) realloc(yylval.command.args, arg_size) :
(char *) malloc(arg_size);
if (p == NULL) {
if (yylval.command.args != NULL)
free(yylval.command.args);
efree(yylval.command.args);
yyerror("unable to allocate memory");
return(FALSE);
} else
@@ -585,7 +584,7 @@ switch_buffer(path)
fclose(YY_CURRENT_BUFFER->yy_input_file);
yy_delete_buffer(YY_CURRENT_BUFFER);
yy_switch_to_buffer(state[depth].bs);
free(sudoers);
efree(sudoers);
sudoers = state[depth].path;
sudolineno = state[depth].lineno;
keepopen = FALSE;

View File

@@ -489,7 +489,7 @@ install_sudoers(sp)
* mv(1) in case sp->tpath and sp->path are on different file systems.
*/
if (rename(sp->tpath, sp->path) == 0) {
free(sp->tpath);
efree(sp->tpath);
sp->tpath = NULL;
} else {
if (errno == EXDEV) {
@@ -511,11 +511,11 @@ install_sudoers(sp)
warningx("command failed: '%s %s %s', %s unchanged",
_PATH_MV, sp->tpath, sp->path, sp->path);
(void) unlink(sp->tpath);
free(sp->tpath);
efree(sp->tpath);
sp->tpath = NULL;
return(FALSE);
}
free(sp->tpath);
efree(sp->tpath);
sp->tpath = NULL;
} else {
warning("error renaming %s, %s unchanged", sp->tpath, sp->path);
@@ -716,7 +716,7 @@ open_sudoers(path, keepopen)
entry->tpath = NULL;
if (entry->fd == -1) {
warning("%s", entry->path);
free(entry);
efree(entry);
return(NULL);
}
if (!lock_file(entry->fd, SUDO_TLOCK))
@@ -828,8 +828,7 @@ get_editor(args)
* find one that exists, is regular, and is executable.
*/
if (Editor == NULL || *Editor == '\0') {
if (EditorPath != NULL)
free(EditorPath);
efree(EditorPath);
EditorPath = estrdup(def_editor);
Editor = strtok(EditorPath, ":");
do {