(rec_dirsearch): Really fix leak problems.
authordrepper <drepper>
Thu, 18 May 2006 06:47:39 +0000 (06:47 +0000)
committerdrepper <drepper>
Thu, 18 May 2006 06:47:39 +0000 (06:47 +0000)
nis/nis_call.c

index 8298dc3..5dcca94 100644 (file)
@@ -370,6 +370,7 @@ rec_dirsearch (const_nis_name name, directory_obj *dir, nis_error *status)
        fd_res = __nis_finddirectory (dir, ndomain);
        if (fd_res == NULL)
          {
+           nis_free_directory (dir);
            *status = NIS_NOMEMORY;
            return NULL;
          }
@@ -381,30 +382,25 @@ rec_dirsearch (const_nis_name name, directory_obj *dir, nis_error *status)
            return dir;
          }
        obj = calloc (1, sizeof (directory_obj));
+       if (obj == NULL)
+         {
+           __free_fdresult (fd_res);
+           nis_free_directory (dir);
+           *status = NIS_NOMEMORY;
+           return NULL;
+         }
        xdrmem_create (&xdrs, fd_res->dir_data.dir_data_val,
                       fd_res->dir_data.dir_data_len, XDR_DECODE);
        _xdr_directory_obj (&xdrs, obj);
        xdr_destroy (&xdrs);
        __free_fdresult (fd_res);
-       if (obj != NULL)
-         {
-           /* We have found a NIS+ server serving ndomain, now
-              let us search for "name" */
-           nis_free_directory (dir);
-           dir = rec_dirsearch (name, obj, status);
-           if (dir != obj)
-             /* This also covers the case dir == NULL.  */
-             nis_free_directory (obj);
-           return dir;
-         }
-       else
-         {
-           /* Ups, very bad. Are we already the root server ? */
-           nis_free_directory (dir);
-           return NULL;
-         }
+
+       /* We have found a NIS+ server serving ndomain, now
+          let us search for "name" */
+       nis_free_directory (dir);
+       return rec_dirsearch (name, obj, status);
       }
-    break;
+      break;
     case LOWER_NAME:
       {
        directory_obj *obj;
@@ -444,6 +440,7 @@ rec_dirsearch (const_nis_name name, directory_obj *dir, nis_error *status)
        fd_res = __nis_finddirectory (dir, leaf);
        if (fd_res == NULL)
          {
+           nis_free_directory (dir);
            *status = NIS_NOMEMORY;
            return NULL;
          }
@@ -468,7 +465,7 @@ rec_dirsearch (const_nis_name name, directory_obj *dir, nis_error *status)
            return rec_dirsearch (name, obj, status);
          }
       }
-    break;
+      break;
     case BAD_NAME:
       nis_free_directory (dir);
       *status = NIS_BADNAME;
@@ -547,9 +544,6 @@ __nisfind_server (const_nis_name name, directory_obj **dir)
          obj = rec_dirsearch (name, *dir, &status);
          if (obj == NULL)
            result = status;
-
-         if (*dir != obj)
-           nis_free_directory (*dir);
        }
 
       *dir = obj;