on C89 behavior (free(NULL) is valid) even on K&R.
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);
}
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);
}
/*
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);
+}
}
if (status != TS_ERROR)
update_timestamp(timestampdir, timestampfile);
- free(timestampdir);
- if (timestampfile)
- free(timestampfile);
+ efree(timestampdir);
+ efree(timestampfile);
}
/*
}
}
- free(timestampdir);
- if (timestampfile)
- free(timestampfile);
+ efree(timestampdir);
+ efree(timestampfile);
}
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);
- def->sd_un.str = NULL;
- }
+ efree(def->sd_un.str);
+ def->sd_un.str = NULL;
break;
case T_LIST:
list_op(NULL, 0, def, freeall);
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
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;
prev->next = cur->next;
else
def->sd_un.list = cur->next;
- free(cur->value);
- free(cur);
+ efree(cur->value);
+ efree(cur);
break;
}
}
path = n + 1;
} while (n);
- free(origpath);
+ efree(origpath);
/*
* Check current dir if dot was in the PATH
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;
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;
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)
NEW_MEMBER(yyval.member, yyvsp[0].string, WORD);
}
break;
-#line 1323 "gram.c"
+#line 1316 "gram.c"
}
yyssp -= yym;
yystate = *yyssp;
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;
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;
#ifdef HAVE_FREEIFADDRS
freeifaddrs(ifaddrs);
#else
- free(ifaddrs);
+ efree(ifaddrs);
#endif
}
#else
if (ioctl(sock, SIOCGIFCONF, (caddr_t) ifconf) < 0) {
#endif /* _ISC */
- free(ifconf_buf);
+ efree(ifconf_buf);
(void) close(sock);
return;
}
interfaces = (struct interface *) erealloc3(interfaces,
num_interfaces, sizeof(struct interface));
else
- free(interfaces);
+ efree(interfaces);
}
- free(ifconf_buf);
+ efree(ifconf_buf);
(void) close(sock);
}
/* 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");
printf(" not\n");
}
- free(allowed_cmnd); /* cleanup */
+ efree(allowed_cmnd); /* cleanup */
}
if (v)
/* case var Boolean True */
set_default(var, NULL, TRUE);
}
- free(var);
+ efree(var);
}
if (v)
/* 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); }
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);
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) */
beg = NULL; /* exit condition */
}
}
- free(full_line);
+ efree(full_line);
}
(void) fflush(fp);
(void) lock_file(fileno(fp), SUDO_UNLOCK);
if (def_logfile)
do_logfile(logline);
- free(logline);
+ efree(logline);
}
void
if (def_logfile)
do_logfile(logline);
- free(message);
+ efree(message);
if (logline != message)
- free(logline);
+ efree(logline);
if (!ISSET(flags, NO_EXIT))
exit(1);
(!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
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;
}
(!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
(!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
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;
}
if (domain == (char *) -1) {
domain = (char *) emalloc(MAXHOSTNAMELEN);
if (getdomainname(domain, MAXHOSTNAMELEN) == -1 || *domain == '\0') {
- free(domain);
+ efree(domain);
domain = NULL;
}
}
prev->next = cur->next;
else
children.first = cur->next;
- free(cur);
+ efree(cur);
break;
}
prev = cur;
/* 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);
/* 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);
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);
}
/*
_rbdestroy(tree, node->right, destroy);
if (destroy != NULL)
destroy(node->data);
- free(node);
+ efree(node);
}
}
void (*destroy)__P((VOID *));
{
_rbdestroy(tree, rbfirst(tree), destroy);
- free(tree);
+ efree(tree);
}
/*
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)) {
if (victim->color == black)
rbrepair(tree, pred);
data = victim->data;
- free(victim);
+ efree(victim);
}
return(data);
}
"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, '.'))) {
__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));
(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
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;
(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
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;
* 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) {
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);
entry->tpath = NULL;
if (entry->fd == -1) {
warning("%s", entry->path);
- free(entry);
+ efree(entry);
return(NULL);
}
if (!lock_file(entry->fd, SUDO_TLOCK))
* 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 {