about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--nis/nis_table.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/nis/nis_table.c b/nis/nis_table.c
index 773380acac..6761d37233 100644
--- a/nis/nis_table.c
+++ b/nis/nis_table.c
@@ -267,8 +267,8 @@ nis_list (const_nis_name name, unsigned int flags,
 	  case NIS_PARTIAL:
 	  case NIS_SUCCESS:
 	  case NIS_S_SUCCESS:
-	    if (__type_of (NIS_RES_OBJECT (res)) == NIS_LINK_OBJ &&
-		flags & FOLLOW_LINKS)		/* We are following links.  */
+	    if (__type_of (NIS_RES_OBJECT (res)) == NIS_LINK_OBJ
+		&& (flags & FOLLOW_LINKS))	/* We are following links.  */
 	      {
 		free (ibreq->ibr_name);
 		ibreq->ibr_name = NULL;
@@ -319,8 +319,8 @@ nis_list (const_nis_name name, unsigned int flags,
 		first_try = 1; /* Try at first the old binding */
 		goto again;
 	      }
-	    else if ((flags & FOLLOW_PATH) &&
-		     NIS_RES_STATUS (res) == NIS_PARTIAL)
+	    else if ((flags & FOLLOW_PATH)
+		     && NIS_RES_STATUS (res) == NIS_PARTIAL)
 	      {
 		if (!have_tablepath)
 		  {
@@ -349,11 +349,21 @@ nis_list (const_nis_name name, unsigned int flags,
 		else
 		  {
 		    ibreq->ibr_name = strdup (ibreq->ibr_name);
+		    /* 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));
+		    if (ibreq->ibr_name == NULL)
+#else
 		    nis_freeresult (res);
 		    res = calloc (1, sizeof (nis_result));
 		    if (res == NULL || ibreq->ibr_name == NULL)
+#endif
 		      {
-			free (ibreq->ibr_name);
 			free (res);
 			nis_free_request (ibreq);
 			if (have_tablepath)