aboutsummaryrefslogtreecommitdiff
path: root/nis/nis_call.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2006-05-18 14:52:08 +0000
committerUlrich Drepper <drepper@redhat.com>2006-05-18 14:52:08 +0000
commit758b9d7efe599e3de3472593b6f8f03cfc29ea92 (patch)
tree2e7d4cf5fe8c0d5431c3951a55b2e5445b72261d /nis/nis_call.c
parent5f1724bf0306309e7da4ebf7fcc19c03fdbf1142 (diff)
downloadglibc-758b9d7efe599e3de3472593b6f8f03cfc29ea92.tar
glibc-758b9d7efe599e3de3472593b6f8f03cfc29ea92.tar.gz
glibc-758b9d7efe599e3de3472593b6f8f03cfc29ea92.tar.bz2
glibc-758b9d7efe599e3de3472593b6f8f03cfc29ea92.zip
* nis/nss_compat/compat-pwd.c (internal_setpwent): If nss_set*ent
returned NSS_STATUS_UNAVAIL, still return NSS_STATUS_SUCCESS. * nis/nss_compat/compat-spwd.c (internal_setspent): Likewise. * nis/nss_compat/compat-grp.c (internal_setgrent): Likewise. * nis/nss_compat/compat-initgroups.c (nss_setgrent, nss_endgrent): Removed. (init_nss_interface): Remove initialization of these variables. 2006-05-18 Ulrich Drepper <drepper@redhat.com> * nis/nis_call.c (rec_dirsearch): Little optimization: pull nis_free_directory forward to avoid duplication.
Diffstat (limited to 'nis/nis_call.c')
-rw-r--r--nis/nis_call.c62
1 files changed, 29 insertions, 33 deletions
diff --git a/nis/nis_call.c b/nis/nis_call.c
index 8298dc304f..753ef77997 100644
--- a/nis/nis_call.c
+++ b/nis/nis_call.c
@@ -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;
}
@@ -380,31 +381,25 @@ rec_dirsearch (const_nis_name name, directory_obj *dir, nis_error *status)
__free_fdresult (fd_res);
return dir;
}
+ nis_free_directory (dir);
obj = calloc (1, sizeof (directory_obj));
+ if (obj == NULL)
+ {
+ __free_fdresult (fd_res);
+ *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" */
+ return rec_dirsearch (name, obj, status);
}
- break;
+ break;
case LOWER_NAME:
{
directory_obj *obj;
@@ -444,6 +439,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;
}
@@ -454,21 +450,24 @@ rec_dirsearch (const_nis_name name, directory_obj *dir, nis_error *status)
__free_fdresult (fd_res);
return dir;
}
- obj = calloc(1, sizeof(directory_obj));
- 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)
+ nis_free_directory (dir);
+ obj = calloc (1, sizeof(directory_obj));
+ if (obj == 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);
+ __free_fdresult (fd_res);
+ *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);
+ /* We have found a NIS+ server serving ndomain, now
+ let us search for "name" */
+ return rec_dirsearch (name, obj, status);
}
- break;
+ break;
case BAD_NAME:
nis_free_directory (dir);
*status = NIS_BADNAME;
@@ -547,9 +546,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;