CFR: Exceedingly minor fixes to libc
Garrett Wollman
wollman at bimajority.org
Fri Nov 13 05:39:16 UTC 2009
If you have a moment, please take a look at the following patch. It
contains some very minor fixes to various parts of libc which were
found by the clang static analyzer. They fall into a few categories:
1) Bug fixes in very rare situations (mostly error-handling code that
has probably never been executed).
2) Dead store elimination.
3) Elimination of unused variables. (Or in a few cases, making use of
them.)
Some minor style problems were also fixed in the vicinity. There
should be no functional changes except in very unusual conditions.
-GAWollman
-------------- next part --------------
Index: stdio/fvwrite.c
===================================================================
--- stdio/fvwrite.c (revision 199242)
+++ stdio/fvwrite.c (working copy)
@@ -60,7 +60,7 @@
char *nl;
int nlknown, nldist;
- if ((len = uio->uio_resid) == 0)
+ if (uio->uio_resid == 0)
return (0);
/* make sure we can write */
if (prepwrite(fp) != 0)
Index: stdio/vfwprintf.c
===================================================================
--- stdio/vfwprintf.c (revision 199242)
+++ stdio/vfwprintf.c (working copy)
@@ -293,7 +293,7 @@
* number of characters to print.
*/
p = mbsarg;
- insize = nchars = 0;
+ insize = nchars = nconv = 0;
mbs = initial_mbs;
while (nchars != (size_t)prec) {
nconv = mbrlen(p, MB_CUR_MAX, &mbs);
Index: stdio/xprintf_time.c
===================================================================
--- stdio/xprintf_time.c (revision 199242)
+++ stdio/xprintf_time.c (working copy)
@@ -64,7 +64,6 @@
intmax_t t, tx;
int i, prec, nsec;
- prec = 0;
if (pi->is_long) {
tv = *((struct timeval **)arg[0]);
t = tv->tv_sec;
@@ -78,6 +77,8 @@
} else {
tp = *((time_t **)arg[0]);
t = *tp;
+ nsec = 0;
+ prec = 0;
}
p = buf;
Index: stdio/fgetws.c
===================================================================
--- stdio/fgetws.c (revision 199242)
+++ stdio/fgetws.c (working copy)
@@ -89,7 +89,7 @@
if (!__mbsinit(&fp->_mbstate))
/* Incomplete character */
goto error;
- *wsp++ = L'\0';
+ *wsp = L'\0';
FUNLOCKFILE(fp);
return (ws);
Index: rpc/getnetconfig.c
===================================================================
--- rpc/getnetconfig.c (revision 199242)
+++ rpc/getnetconfig.c (working copy)
@@ -412,13 +412,13 @@
* Noone needs these entries anymore, then frees them.
* Make sure all info in netconfig_info structure has been reinitialized.
*/
- q = p = ni.head;
+ q = ni.head;
ni.eof = ni.ref = 0;
ni.head = NULL;
ni.tail = NULL;
mutex_unlock(&ni_lock);
- while (q) {
+ while (q != NULL) {
p = q->next;
if (q->ncp->nc_lookups != NULL) free(q->ncp->nc_lookups);
free(q->ncp);
Index: rpc/svc_raw.c
===================================================================
--- rpc/svc_raw.c (revision 199242)
+++ rpc/svc_raw.c (working copy)
@@ -176,9 +176,8 @@
msg->acpted_rply.ar_results.proc = (xdrproc_t) xdr_void;
msg->acpted_rply.ar_results.where = NULL;
- if (!xdr_replymsg(xdrs, msg) ||
- !SVCAUTH_WRAP(&SVC_AUTH(xprt), xdrs, xdr_proc, xdr_where))
- stat = FALSE;
+ stat = xdr_replymsg(xdrs, msg) &&
+ SVCAUTH_WRAP(&SVC_AUTH(xprt), xdrs, xdr_proc, xdr_where);
} else {
stat = xdr_replymsg(xdrs, msg);
}
Index: rpc/clnt_raw.c
===================================================================
--- rpc/clnt_raw.c (revision 199242)
+++ rpc/clnt_raw.c (working copy)
@@ -92,13 +92,13 @@
rpcprog_t prog;
rpcvers_t vers;
{
- struct clntraw_private *clp = clntraw_private;
+ struct clntraw_private *clp;
struct rpc_msg call_msg;
- XDR *xdrs = &clp->xdr_stream;
- CLIENT *client = &clp->client_object;
+ XDR *xdrs;
+ CLIENT *client;
mutex_lock(&clntraw_lock);
- if (clp == NULL) {
+ if ((clp = clntraw_private) == NULL) {
clp = (struct clntraw_private *)calloc(1, sizeof (*clp));
if (clp == NULL) {
mutex_unlock(&clntraw_lock);
@@ -110,6 +110,9 @@
clp->_raw_buf = __rpc_rawcombuf;
clntraw_private = clp;
}
+ xdrs = &clp->xdr_stream;
+ client = &clp->client_object;
+
/*
* pre-serialize the static part of the call msg and stash it away
*/
Index: rpc/svc_vc.c
===================================================================
--- rpc/svc_vc.c (revision 199242)
+++ rpc/svc_vc.c (working copy)
@@ -141,7 +141,7 @@
r = mem_alloc(sizeof(*r));
if (r == NULL) {
warnx("svc_vc_create: out of memory");
- goto cleanup_svc_vc_create;
+ return NULL;
}
r->sendsize = __rpc_get_t_size(si.si_af, si.si_proto, (int)sendsize);
r->recvsize = __rpc_get_t_size(si.si_af, si.si_proto, (int)recvsize);
Index: rpc/getrpcent.c
===================================================================
--- rpc/getrpcent.c (revision 199242)
+++ rpc/getrpcent.c (working copy)
@@ -698,7 +698,7 @@
return (NS_RETURN);
}
- memcpy(&new_rpc, rpc, sizeof(struct rpcent));
+ new_rpc = *rpc;
*buffer_size = desired_size;
memset(buffer, 0, desired_size);
Index: rpc/rpcb_st_xdr.c
===================================================================
--- rpc/rpcb_st_xdr.c (revision 199242)
+++ rpc/rpcb_st_xdr.c (working copy)
@@ -89,7 +89,6 @@
rpcbs_rmtcalllist *objp;
{
int32_t *buf;
- struct rpcbs_rmtcalllist **pnext;
if (xdrs->x_op == XDR_ENCODE) {
buf = XDR_INLINE(xdrs, 6 * BYTES_PER_XDR_UNIT);
@@ -123,8 +122,7 @@
if (!xdr_string(xdrs, &objp->netid, (u_int)~0)) {
return (FALSE);
}
- pnext = &objp->next;
- if (!xdr_pointer(xdrs, (char **) pnext,
+ if (!xdr_pointer(xdrs, (char **) &objp->next,
sizeof (rpcbs_rmtcalllist),
(xdrproc_t)xdr_rpcbs_rmtcalllist)) {
return (FALSE);
@@ -162,7 +160,7 @@
if (!xdr_string(xdrs, &objp->netid, (u_int)~0)) {
return (FALSE);
}
- if (!xdr_pointer(xdrs, (char **) pnext,
+ if (!xdr_pointer(xdrs, (char **) &objp->next,
sizeof (rpcbs_rmtcalllist),
(xdrproc_t)xdr_rpcbs_rmtcalllist)) {
return (FALSE);
@@ -190,7 +188,7 @@
if (!xdr_string(xdrs, &objp->netid, (u_int)~0)) {
return (FALSE);
}
- if (!xdr_pointer(xdrs, (char **) pnext,
+ if (!xdr_pointer(xdrs, (char **) &objp->next,
sizeof (rpcbs_rmtcalllist),
(xdrproc_t)xdr_rpcbs_rmtcalllist)) {
return (FALSE);
Index: rpc/key_call.c
===================================================================
--- rpc/key_call.c (revision 199242)
+++ rpc/key_call.c (working copy)
@@ -302,7 +302,7 @@
void *localhandle;
struct netconfig *nconf;
struct netconfig *tpconf;
- struct key_call_private *kcp = key_call_private_main;
+ struct key_call_private *kcp;
struct timeval wait_time;
struct utsname u;
int main_thread;
Index: yp/yplib.c
===================================================================
--- yp/yplib.c (revision 199242)
+++ yp/yplib.c (working copy)
@@ -241,7 +241,7 @@
ypmatch_cache_lookup(struct dom_binding *ypdb, char *map, keydat *key,
valdat *val)
{
- struct ypmatch_ent *c = ypdb->cache;
+ struct ypmatch_ent *c;
ypmatch_cache_expire(ypdb);
Index: gen/setmode.c
===================================================================
--- gen/setmode.c (revision 199242)
+++ gen/setmode.c (working copy)
@@ -86,7 +86,7 @@
set = (const BITCMD *)bbox;
newmode = omode;
- for (value = 0;; set++)
+ for (;; set++)
switch(set->cmd) {
/*
* When copying the user, group or other bits around, we "know"
@@ -147,6 +147,7 @@
}
#define ADDCMD(a, b, c, d) \
+ do { \
if (set >= endset) { \
BITCMD *newset; \
setlen += SET_LEN_INCR; \
@@ -161,7 +162,8 @@
saveset = newset; \
endset = newset + (setlen - 2); \
} \
- set = addcmd(set, (a), (b), (c), (d))
+ set = addcmd(set, (a), (b), (c), (d)); \
+ } while (0)
#define STANDARD_BITS (S_ISUID|S_ISGID|S_IRWXU|S_IRWXG|S_IRWXO)
@@ -173,11 +175,12 @@
BITCMD *set, *saveset, *endset;
sigset_t sigset, sigoset;
mode_t mask;
- int equalopdone=0, permXbits, setlen;
+ int equalopdone, permXbits, setlen;
long perml;
if (!*p)
return (NULL);
+ equalopdone = 0;
/*
* Get a copy of the mask for the permissions that are mask relative.
@@ -299,16 +302,10 @@
* Add any permissions that we haven't already
* done.
*/
- if (perm || (op == '=' && !equalopdone)) {
- if (op == '=')
- equalopdone = 1;
+ if (perm || (op == '=' && !equalopdone))
ADDCMD(op, who, perm, mask);
- perm = 0;
- }
- if (permXbits) {
+ if (permXbits)
ADDCMD('X', who, permXbits, mask);
- permXbits = 0;
- }
goto apply;
}
}
Index: gen/wordexp.c
===================================================================
--- gen/wordexp.c (revision 199242)
+++ gen/wordexp.c (working copy)
@@ -320,7 +320,7 @@
if (c == '\0' || level != 0)
return (WRDE_SYNTAX);
} else
- c = *--words;
+ --words;
break;
default:
break;
Index: gen/getcap.c
===================================================================
--- gen/getcap.c (revision 199242)
+++ gen/getcap.c (working copy)
@@ -647,7 +647,7 @@
cgetnext(char **bp, char **db_array)
{
size_t len;
- int done, hadreaderr, i, savederrno, status;
+ int done, hadreaderr, savederrno, status;
char *cp, *line, *rp, *np, buf[BSIZE], nbuf[BSIZE];
u_int dummy;
@@ -658,7 +658,7 @@
(void)cgetclose();
return (-1);
}
- for(;;) {
+ for (;;) {
if (toprec && !gottoprec) {
gottoprec = 1;
line = toprec;
@@ -709,7 +709,6 @@
/*
* Line points to a name line.
*/
- i = 0;
done = 0;
np = nbuf;
for (;;) {
Index: gen/getpwent.c
===================================================================
--- gen/getpwent.c (revision 199242)
+++ gen/getpwent.c (working copy)
@@ -257,22 +257,19 @@
pwd_marshal_func(char *buffer, size_t *buffer_size, void *retval, va_list ap,
void *cache_mdata)
{
- char *name;
- uid_t uid;
struct passwd *pwd;
- char *orig_buf;
- size_t orig_buf_size;
struct passwd new_pwd;
size_t desired_size, size;
char *p;
+ /* advance past unused arguments */
switch ((enum nss_lookup_type)cache_mdata) {
case nss_lt_name:
- name = va_arg(ap, char *);
+ va_arg(ap, char *);
break;
case nss_lt_id:
- uid = va_arg(ap, uid_t);
+ va_arg(ap, uid_t);
break;
case nss_lt_all:
break;
@@ -282,8 +279,7 @@
}
pwd = va_arg(ap, struct passwd *);
- orig_buf = va_arg(ap, char *);
- orig_buf_size = va_arg(ap, size_t);
+ va_end(ap); /* remaining args are unused */
desired_size = sizeof(struct passwd) + sizeof(char *) +
strlen(pwd->pw_name) + 1;
@@ -361,8 +357,6 @@
pwd_unmarshal_func(char *buffer, size_t buffer_size, void *retval, va_list ap,
void *cache_mdata)
{
- char *name;
- uid_t uid;
struct passwd *pwd;
char *orig_buf;
size_t orig_buf_size;
@@ -370,12 +364,13 @@
char *p;
+ /* advance past unused arguments */
switch ((enum nss_lookup_type)cache_mdata) {
case nss_lt_name:
- name = va_arg(ap, char *);
+ va_arg(ap, char *);
break;
case nss_lt_id:
- uid = va_arg(ap, uid_t);
+ va_arg(ap, uid_t);
break;
case nss_lt_all:
break;
@@ -921,7 +916,7 @@
errnop);
} while (how == nss_lt_all && !(rv & NS_TERMINATE));
fin:
- if (!stayopen && st->db != NULL) {
+ if (st->db != NULL && !stayopen) {
(void)st->db->close(st->db);
st->db = NULL;
}
@@ -1876,7 +1871,6 @@
syslog(LOG_ERR,
"getpwent memory allocation failure");
*errnop = ENOMEM;
- rv = NS_UNAVAIL;
break;
}
st->compat = COMPAT_MODE_NAME;
@@ -1940,7 +1934,7 @@
break;
}
fin:
- if (!stayopen && st->db != NULL) {
+ if (st->db != NULL && !stayopen) {
(void)st->db->close(st->db);
st->db = NULL;
}
Index: gen/getgrent.c
===================================================================
--- gen/getgrent.c (revision 199242)
+++ gen/getgrent.c (working copy)
@@ -207,22 +207,19 @@
grp_marshal_func(char *buffer, size_t *buffer_size, void *retval, va_list ap,
void *cache_mdata)
{
- char *name;
- gid_t gid;
struct group *grp;
- char *orig_buf;
- size_t orig_buf_size;
struct group new_grp;
size_t desired_size, size, mem_size;
char *p, **mem;
+ /* advance past unused arguments */
switch ((enum nss_lookup_type)cache_mdata) {
case nss_lt_name:
- name = va_arg(ap, char *);
+ va_arg(ap, char *);
break;
case nss_lt_id:
- gid = va_arg(ap, gid_t);
+ va_arg(ap, gid_t);
break;
case nss_lt_all:
break;
@@ -232,8 +229,7 @@
}
grp = va_arg(ap, struct group *);
- orig_buf = va_arg(ap, char *);
- orig_buf_size = va_arg(ap, size_t);
+ va_end(ap); /* remaining args are unused */
desired_size = _ALIGNBYTES + sizeof(struct group) + sizeof(char *);
@@ -302,8 +298,6 @@
grp_unmarshal_func(char *buffer, size_t buffer_size, void *retval, va_list ap,
void *cache_mdata)
{
- char *name;
- gid_t gid;
struct group *grp;
char *orig_buf;
size_t orig_buf_size;
@@ -314,10 +308,10 @@
switch ((enum nss_lookup_type)cache_mdata) {
case nss_lt_name:
- name = va_arg(ap, char *);
+ va_arg(ap, char *);
break;
case nss_lt_id:
- gid = va_arg(ap, gid_t);
+ va_arg(ap, gid_t);
break;
case nss_lt_all:
break;
@@ -1100,6 +1094,9 @@
case nss_lt_all:
map = "group.byname";
break;
+ default:
+ *errnop = EINVAL;
+ return (NS_UNAVAIL);
}
grp = va_arg(ap, struct group *);
buffer = va_arg(ap, char *);
@@ -1392,6 +1389,13 @@
}
break;
case NS_RETURN:
+ /*
+ * If _nsdispatch() sets *errnop to ERANGE (can it?)
+ * we need a valid file position. Assume it might
+ * close st->fp, too (can it?).
+ */
+ if (st->fp != NULL)
+ pos = ftello(st->fp);
goto fin;
default:
break;
@@ -1450,7 +1454,7 @@
pos = ftello(st->fp);
}
fin:
- if (!stayopen && st->fp != NULL) {
+ if (st->fp != NULL && !stayopen) {
fclose(st->fp);
st->fp = NULL;
}
Index: gen/getusershell.c
===================================================================
--- gen/getusershell.c (revision 199242)
+++ gen/getusershell.c (working copy)
@@ -124,7 +124,7 @@
if ((fp = fopen(_PATH_SHELLS, "r")) == NULL)
return NS_UNAVAIL;
- sp = cp = line;
+ cp = line;
while (fgets(cp, MAXPATHLEN + 1, fp) != NULL) {
while (*cp != '#' && *cp != '/' && *cp != '\0')
cp++;
Index: gen/pw_scan.c
===================================================================
--- gen/pw_scan.c (revision 199242)
+++ gen/pw_scan.c (working copy)
@@ -202,7 +202,7 @@
if (p[0])
pw->pw_fields |= _PWF_SHELL;
- if ((p = strsep(&bp, ":"))) { /* too many */
+ if (strsep(&bp, ":") != NULL) { /* too many */
fmt:
if (flags & _PWSCAN_WARN)
warnx("corrupted entry");
Index: net/sctp_sys_calls.c
===================================================================
--- net/sctp_sys_calls.c (revision 199242)
+++ net/sctp_sys_calls.c (working copy)
@@ -242,7 +242,8 @@
struct sockaddr *sa;
struct sockaddr_in *sin;
struct sockaddr_in6 *sin6;
- int i, sz, argsz;
+ int i, argsz;
+ size_t sz;
uint16_t sport = 0;
/* validate the flags */
@@ -268,7 +269,7 @@
for (i = 0; i < addrcnt; i++) {
sz = sa->sa_len;
if (sa->sa_family == AF_INET) {
- if (sa->sa_len != sizeof(struct sockaddr_in))
+ if (sz != sizeof(struct sockaddr_in))
goto out_error;
sin = (struct sockaddr_in *)sa;
if (sin->sin_port) {
@@ -284,7 +285,7 @@
}
}
} else if (sa->sa_family == AF_INET6) {
- if (sa->sa_len != sizeof(struct sockaddr_in6))
+ if (sz != sizeof(struct sockaddr_in6))
goto out_error;
sin6 = (struct sockaddr_in6 *)sa;
if (sin6->sin6_port) {
@@ -318,10 +319,10 @@
for (i = 0; i < addrcnt; i++) {
sz = sa->sa_len;
if (sa->sa_family == AF_INET) {
- if (sa->sa_len != sizeof(struct sockaddr_in))
+ if (sz != sizeof(struct sockaddr_in))
goto out_error;
} else if (sa->sa_family == AF_INET6) {
- if (sa->sa_len != sizeof(struct sockaddr_in6))
+ if (sz != sizeof(struct sockaddr_in6))
goto out_error;
} else {
/* invalid address family specified */
Index: net/getservent.c
===================================================================
--- net/getservent.c (revision 199242)
+++ net/getservent.c (working copy)
@@ -476,11 +476,11 @@
struct nis_state *st;
int rv;
- enum nss_lookup_type how;
char *name;
char *proto;
int port;
+ enum nss_lookup_type how;
struct servent *serv;
char *buffer;
size_t bufsize;
@@ -491,7 +491,8 @@
name = NULL;
proto = NULL;
- how = (enum nss_lookup_type)mdata;
+
+ how = (intptr_t)mdata;
switch (how) {
case nss_lt_name:
name = va_arg(ap, char *);
Index: posix1e/acl_delete_entry.c
===================================================================
--- posix1e/acl_delete_entry.c (revision 199242)
+++ posix1e/acl_delete_entry.c (working copy)
@@ -89,20 +89,20 @@
return (-1);
}
- if ((acl->ats_acl.acl_cnt < 1) ||
- (acl->ats_acl.acl_cnt > ACL_MAX_ENTRIES)) {
+ if ((acl_int->acl_cnt < 1) ||
+ (acl_int->acl_cnt > ACL_MAX_ENTRIES)) {
errno = EINVAL;
return (-1);
}
- for (i = 0; i < acl->ats_acl.acl_cnt;) {
- if (_entry_matches(&(acl->ats_acl.acl_entry[i]), entry_d)) {
+ for (i = 0; i < acl_int->acl_cnt;) {
+ if (_entry_matches(&(acl_int->acl_entry[i]), entry_d)) {
/* ...shift the remaining entries... */
- for (j = i; j < acl->ats_acl.acl_cnt - 1; ++j)
- acl->ats_acl.acl_entry[j] =
- acl->ats_acl.acl_entry[j+1];
+ for (j = i; j < acl_int->acl_cnt - 1; ++j)
+ acl_int->acl_entry[j] =
+ acl_int->acl_entry[j+1];
/* ...drop the count and zero the unused entry... */
- acl->ats_acl.acl_cnt--;
- bzero(&acl->ats_acl.acl_entry[j],
+ acl_int->acl_cnt--;
+ bzero(&acl_int->acl_entry[j],
sizeof(struct acl_entry));
acl->ats_cur_entry = 0;
Index: inet/inet_cidr_pton.c
===================================================================
--- inet/inet_cidr_pton.c (revision 199242)
+++ inet/inet_cidr_pton.c (working copy)
@@ -236,7 +236,6 @@
endp[- i] = colonp[n - i];
colonp[n - i] = 0;
}
- tp = endp;
}
memcpy(dst, tmp, NS_IN6ADDRSZ);
More information about the freebsd-hackers
mailing list