Module Name: src
Committed By: nia
Date: Sat Oct 30 11:04:48 UTC 2021
Modified Files:
src/usr.sbin/rpcbind: rpcb_svc_com.c rpcbind.c
Log Message:
rpcbind(8): Use reallocarr, fix reallocation logic.
In my_svc_run(), only update the fd count _after_ the allocation
succeeds (which may be after waiting in the loop). This function
previously tried to go to a label that doesn't exist. I wonder why
GCC didn't catch this before but does now.
To generate a diff of this commit:
cvs rdiff -u -r1.25 -r1.26 src/usr.sbin/rpcbind/rpcb_svc_com.c
cvs rdiff -u -r1.30 -r1.31 src/usr.sbin/rpcbind/rpcbind.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/usr.sbin/rpcbind/rpcb_svc_com.c
diff -u src/usr.sbin/rpcbind/rpcb_svc_com.c:1.25 src/usr.sbin/rpcbind/rpcb_svc_com.c:1.26
--- src/usr.sbin/rpcbind/rpcb_svc_com.c:1.25 Tue Apr 13 05:58:45 2021
+++ src/usr.sbin/rpcbind/rpcb_svc_com.c Sat Oct 30 11:04:48 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: rpcb_svc_com.c,v 1.25 2021/04/13 05:58:45 mrg Exp $ */
+/* $NetBSD: rpcb_svc_com.c,v 1.26 2021/10/30 11:04:48 nia Exp $ */
/* $FreeBSD: head/usr.sbin/rpcbind/rpcb_svc_com.c 301770 2016-06-09 22:25:00Z pfg $ */
/*-
@@ -1106,7 +1106,7 @@ my_svc_run(void)
{
size_t nfds;
struct pollfd *pollfds;
- int npollfds;
+ int npollfds, newfdcount;
int poll_ret, check_ret;
int n, *m;
#ifdef SVC_RUN_DEBUG
@@ -1118,19 +1118,19 @@ my_svc_run(void)
npollfds = 0;
for (;;) {
- if (svc_fdset_getsize(0) != npollfds) {
- npollfds = svc_fdset_getsize(0);
- pollfds = realloc(pollfds, npollfds * sizeof(*pollfds));
+ newfdcount = svc_fdset_getsize(0);
+ if (newfdcount != npollfds) {
+ if (reallocarr(&pollfds,
+ newfdcount, sizeof(*pollfds)) != 0) {
+ syslog(LOG_ERR, "Cannot allocate pollfds");
+ sleep(1);
+ continue;
+ }
+ npollfds = newfdcount;
}
p = pollfds;
- if (p == NULL) {
-out:
- syslog(LOG_ERR, "Cannot allocate pollfds");
- sleep(1);
- continue;
- }
if ((m = svc_fdset_getmax()) == NULL)
- goto out;
+ break;
for (n = 0; n <= *m; n++) {
if (svc_fdset_isset(n)) {
p->fd = n;
Index: src/usr.sbin/rpcbind/rpcbind.c
diff -u src/usr.sbin/rpcbind/rpcbind.c:1.30 src/usr.sbin/rpcbind/rpcbind.c:1.31
--- src/usr.sbin/rpcbind/rpcbind.c:1.30 Sun Mar 7 00:23:06 2021
+++ src/usr.sbin/rpcbind/rpcbind.c Sat Oct 30 11:04:48 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: rpcbind.c,v 1.30 2021/03/07 00:23:06 christos Exp $ */
+/* $NetBSD: rpcbind.c,v 1.31 2021/10/30 11:04:48 nia Exp $ */
/*-
* Copyright (c) 2009, Sun Microsystems, Inc.
@@ -362,18 +362,15 @@ init_transport(struct netconfig *nconf)
}
if (strcmp(nconf->nc_netid, "local") != 0) {
- char **nhp;
/*
* If no hosts were specified, just bind to INADDR_ANY.
* Otherwise make sure 127.0.0.1 is added to the list.
*/
nhostsbak = nhosts + 1;
- nhp = realloc(hosts, nhostsbak * sizeof(*hosts));
- if (nhp == NULL) {
+ if (reallocarr(&hosts, nhostsbak, sizeof(*hosts)) != 0) {
syslog(LOG_ERR, "Can't grow hosts array");
return 1;
}
- hosts = nhp;
if (nhostsbak == 1)
hosts[0] = __UNCONST("*");
else {
@@ -903,8 +900,7 @@ parseargs(int argc, char *argv[])
break;
case 'h':
++nhosts;
- hosts = realloc(hosts, nhosts * sizeof(*hosts));
- if (hosts == NULL)
+ if (reallocarr(&hosts, nhosts, sizeof(*hosts)) != 0)
err(EXIT_FAILURE, "Can't allocate host array");
hosts[nhosts - 1] = strdup(optarg);
if (hosts[nhosts - 1] == NULL)