about summary refs log tree commit diff
path: root/nis/nis_findserv.c
diff options
context:
space:
mode:
Diffstat (limited to 'nis/nis_findserv.c')
-rw-r--r--nis/nis_findserv.c44
1 files changed, 25 insertions, 19 deletions
diff --git a/nis/nis_findserv.c b/nis/nis_findserv.c
index 5b6a74981c..2659878e20 100644
--- a/nis/nis_findserv.c
+++ b/nis/nis_findserv.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1997, 1998 Free Software Foundation, Inc.
+/* Copyright (C) 1997, 1998, 2000 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1997.
 
@@ -131,7 +131,7 @@ __nis_findfastest (dir_binding *bind)
 #else
   const struct timeval TIMEOUT50 = {5, 0};
   const struct timeval TIMEOUT00 = {0, 0};
-  struct findserv_req **pings;
+  struct findserv_req *pings;
   struct sockaddr_in sin, saved_sin;
   int found = -1;
   u_int32_t xid_seed, xid_lookup;
@@ -145,9 +145,12 @@ __nis_findfastest (dir_binding *bind)
   pings_max = bind->server_len * 2;	/* Reserve a little bit more memory
 					   for multihomed hosts */
   pings_count = 0;
-  pings = malloc (sizeof (struct findserv_req *) * pings_max);
+  pings = malloc (sizeof (struct findserv_req) * pings_max);
   xid_seed = (u_int32_t) (time (NULL) ^ getpid ());
 
+  if (__builtin_expect (pings == NULL, 0))
+    return -1;
+
   memset (&sin, '\0', sizeof (sin));
   sin.sin_family = AF_INET;
   for (i = 0; i < bind->server_len; i++)
@@ -169,17 +172,24 @@ __nis_findfastest (dir_binding *bind)
 
 	    if (pings_count >= pings_max)
 	      {
+		struct findserv_req *new_pings;
+
 		pings_max += 10;
-		pings = realloc (pings, sizeof (struct findserv_req) *
-				 pings_max);
+		new_pings = realloc (pings, sizeof (struct findserv_req) *
+				     pings_max);
+		if (__builtin_expect (new_pings == NULL, 0))
+		  {
+		    free (pings);
+		    return -1;
+		  }
+		pings = new_pings;
 	      }
-	    pings[pings_count] = calloc (1, sizeof (struct findserv_req));
-	    memcpy ((char *) &pings[pings_count]->sin, (char *) &sin,
+	    memcpy ((char *) &pings[pings_count].sin, (char *) &sin,
 		    sizeof (sin));
 	    memcpy ((char *)&saved_sin, (char *)&sin, sizeof(sin));
-	    pings[pings_count]->xid = xid_seed;
-	    pings[pings_count]->server_nr = i;
-	    pings[pings_count]->server_ep = j;
+	    pings[pings_count].xid = xid_seed;
+	    pings[pings_count].server_nr = i;
+	    pings[pings_count].server_ep = j;
 	    ++xid_seed;
 	    ++pings_count;
 	  }
@@ -197,8 +207,6 @@ __nis_findfastest (dir_binding *bind)
   if (clnt == NULL)
     {
       close (sock);
-      for (i = 0; i < pings_count; ++i)
-	free (pings[i]);
       free (pings);
       return -1;
     }
@@ -212,8 +220,8 @@ __nis_findfastest (dir_binding *bind)
   for (i = 0; i < pings_count; ++i)
     {
       /* clntudp_call() will increment, subtract one */
-      *((u_int32_t *) (cu->cu_outbuf)) = pings[i]->xid - 1;
-      memcpy ((char *) &cu->cu_raddr, (char *) &pings[i]->sin,
+      *((u_int32_t *) (cu->cu_outbuf)) = pings[i].xid - 1;
+      memcpy ((char *) &cu->cu_raddr, (char *) &pings[i].sin,
 	      sizeof (struct sockaddr_in));
       /* Transmit to NULLPROC, return immediately. */
       clnt_call (clnt, NULLPROC, (xdrproc_t) xdr_void, (caddr_t) foo,
@@ -228,10 +236,10 @@ __nis_findfastest (dir_binding *bind)
   xid_lookup = *((u_int32_t *) (cu->cu_inbuf));
   for (i = 0; i < pings_count; i++)
     {
-      if (pings[i]->xid == xid_lookup)
+      if (pings[i].xid == xid_lookup)
 	{
-	  bind->server_used = pings[i]->server_nr;
-	  bind->current_ep = pings[i]->server_ep;
+	  bind->server_used = pings[i].server_nr;
+	  bind->current_ep = pings[i].server_ep;
 	  found = 1;
 	}
     }
@@ -240,8 +248,6 @@ __nis_findfastest (dir_binding *bind)
   clnt_destroy (clnt);
   close (sock);
 
-  for (i = 0; i < pings_count; ++i)
-    free (pings[i]);
   free (pings);
 
   return found;