about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog3
-rw-r--r--nis/nis_table.c10
2 files changed, 13 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index ee6b092dde..654d032f08 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,8 @@
 2005-12-03  Ulrich Drepper  <drepper@redhat.com>
 
+	* nis/nis_table.c (nis_list): Optimize freeing and reallocation of
+	result record.
+
 	* nis/nss_nisplus/nisplus-network.c (_nss_nisplus_getnetbyaddr_r):
 	Better sized buffers.  Correct error case handling.
 	* nis/nis_error.c (nis_sperror_r): Let snprintf determine whether
diff --git a/nis/nis_table.c b/nis/nis_table.c
index cfa7cef350..773380acac 100644
--- a/nis/nis_table.c
+++ b/nis/nis_table.c
@@ -296,6 +296,15 @@ nis_list (const_nis_name name, unsigned int flags,
 		      ibreq->ibr_srch.ibr_srch_val =
 			NIS_RES_OBJECT (res)->LI_data.li_attrs.li_attrs_val;
 		    }
+		/* The following is a non-obvious optimization.  A
+		   nis_freeresult call would call xdr_free as the
+		   following code.  But it also would unnecessarily
+		   free the result structure.  We avoid this here
+		   along with the necessary tests.  */
+#if 1
+		xdr_free ((xdrproc_t) _xdr_nis_result, (char *)res);
+		memset (res, '\0', sizeof (*res));
+#else
 		nis_freeresult (res);
 		res = calloc (1, sizeof (nis_result));
 		if (res == NULL)
@@ -306,6 +315,7 @@ nis_list (const_nis_name name, unsigned int flags,
 		    nis_free_directory (dir);
 		    return NULL;
 		  }
+#endif
 		first_try = 1; /* Try at first the old binding */
 		goto again;
 	      }