Fix some improper handling of malloc failures

PR:		bin/83344 , kern/81987
Reviewed by:	alfred
Approved by:	re (kensmith)
MFC after:	1 week
This commit is contained in:
Matteo Riondato 2007-09-20 22:35:24 +00:00
parent f734bd2c0d
commit 330e445c29
5 changed files with 53 additions and 30 deletions

View file

@ -156,6 +156,7 @@ get_server(sin, host, srv, eps, maxep)
struct hostent *he;
struct hostent dummy;
char *ptr[2];
endpoint *ep;
if (host == NULL && sin == NULL)
return (NULL);
@ -175,26 +176,34 @@ get_server(sin, host, srv, eps, maxep)
* This is lame. We go around once for TCP, then again
* for UDP.
*/
for (i = 0; (he->h_addr_list[i] != NULL) && (num_ep < maxep);
i++, num_ep++) {
for (i = 0, ep = eps; (he->h_addr_list[i] != NULL) && (num_ep < maxep);
i++, ep++, num_ep++) {
struct in_addr *a;
a = (struct in_addr *)he->h_addr_list[i];
snprintf(hname, sizeof(hname), "%s.0.111", inet_ntoa(*a));
eps[num_ep].uaddr = strdup(hname);
eps[num_ep].family = strdup("inet");
eps[num_ep].proto = strdup("tcp");
ep->uaddr = strdup(hname);
ep->family = strdup("inet");
ep->proto = strdup("tcp");
if (ep->uaddr == NULL || ep->family == NULL || ep->proto == NULL) {
free_eps(eps, num_ep + 1);
return (NULL);
}
}
for (i = 0; (he->h_addr_list[i] != NULL) && (num_ep < maxep);
i++, num_ep++) {
i++, ep++, num_ep++) {
struct in_addr *a;
a = (struct in_addr *)he->h_addr_list[i];
snprintf(hname, sizeof(hname), "%s.0.111", inet_ntoa(*a));
eps[num_ep].uaddr = strdup(hname);
eps[num_ep].family = strdup("inet");
eps[num_ep].proto = strdup("udp");
ep->uaddr = strdup(hname);
ep->family = strdup("inet");
ep->proto = strdup("udp");
if (ep->uaddr == NULL || ep->family == NULL || ep->proto == NULL) {
free_eps(eps, num_ep + 1);
return (NULL);
}
}
srv->name = (nis_name) host;

View file

@ -534,6 +534,7 @@ struct netconfig *ncp; /* where to put results */
{
char *tokenp; /* for processing tokens */
char *lasts;
char **nc_lookups;
nc_error = NC_BADFILE; /* nearly anything that breaks is for this reason */
stringp[strlen(stringp)-1] = '\0'; /* get rid of newline */
@ -599,14 +600,18 @@ struct netconfig *ncp; /* where to put results */
if (ncp->nc_lookups != NULL) /* from last visit */
free(ncp->nc_lookups);
/* preallocate one string pointer */
ncp->nc_lookups = (char **)malloc(sizeof (char *));
ncp->nc_lookups = NULL;
ncp->nc_nlookups = 0;
while ((cp = tokenp) != NULL) {
if ((nc_lookups = realloc(ncp->nc_lookups,
(ncp->nc_nlookups + 1) * sizeof *ncp->nc_lookups)) == NULL) {
free(ncp->nc_lookups);
ncp->nc_lookups = NULL;
return (-1);
}
tokenp = _get_next_token(cp, ',');
ncp->nc_lookups[(size_t)ncp->nc_nlookups++] = cp;
ncp->nc_lookups = (char **)realloc(ncp->nc_lookups,
(size_t)(ncp->nc_nlookups+1) *sizeof(char *)); /* for next loop */
ncp->nc_lookups = nc_lookups;
ncp->nc_lookups[ncp->nc_nlookups++] = cp;
}
}
return (0);

View file

@ -101,7 +101,7 @@ setnetpath()
if ((np_sessionp->nc_handlep = setnetconfig()) == NULL) {
free(np_sessionp);
syslog (LOG_ERR, "rpc: failed to open " NETCONFIG);
return (NULL);
goto failed;
}
np_sessionp->valid = NP_VALID;
np_sessionp->ncp_list = NULL;
@ -110,15 +110,18 @@ setnetpath()
} else {
(void) endnetconfig(np_sessionp->nc_handlep);/* won't need nc session*/
np_sessionp->nc_handlep = NULL;
if ((np_sessionp->netpath = malloc(strlen(npp)+1)) == NULL) {
free(np_sessionp);
return (NULL);
} else {
if ((np_sessionp->netpath = malloc(strlen(npp)+1)) == NULL)
goto failed;
else {
(void) strcpy(np_sessionp->netpath, npp);
}
}
np_sessionp->netpath_start = np_sessionp->netpath;
return ((void *)np_sessionp);
failed:
free(np_sessionp);
return (NULL);
}
/*

View file

@ -319,10 +319,8 @@ __rpc_setconf(nettype)
case _RPC_NETPATH:
case _RPC_CIRCUIT_N:
case _RPC_DATAGRAM_N:
if (!(handle->nhandle = setnetpath())) {
free(handle);
return (NULL);
}
if (!(handle->nhandle = setnetpath()))
goto failed;
handle->nflag = TRUE;
break;
case _RPC_VISIBLE:
@ -332,16 +330,19 @@ __rpc_setconf(nettype)
case _RPC_UDP:
if (!(handle->nhandle = setnetconfig())) {
syslog (LOG_ERR, "rpc: failed to open " NETCONFIG);
free(handle);
return (NULL);
goto failed;
}
handle->nflag = FALSE;
break;
default:
return (NULL);
goto failed;
}
return (handle);
failed:
free(handle);
return (NULL);
}
/*

View file

@ -384,10 +384,15 @@ getclnthandle(host, nconf, targaddr)
return (NULL);
} else {
struct sockaddr_un sun;
*targaddr = malloc(sizeof(sun.sun_path));
strncpy(*targaddr, _PATH_RPCBINDSOCK,
sizeof(sun.sun_path));
if (targaddr) {
*targaddr = malloc(sizeof(sun.sun_path));
if (*targaddr == NULL) {
CLNT_DESTROY(client);
return (NULL);
}
strncpy(*targaddr, _PATH_RPCBINDSOCK,
sizeof(sun.sun_path));
}
return (client);
}
} else {