about summary refs log tree commit diff
path: root/nis
diff options
context:
space:
mode:
Diffstat (limited to 'nis')
-rw-r--r--nis/Makefile4
-rw-r--r--nis/libnsl.map14
-rw-r--r--nis/libnss_compat.map11
-rw-r--r--nis/libnss_nis.map25
-rw-r--r--nis/libnss_nisplus.map32
-rw-r--r--nis/nis_add.c2
-rw-r--r--nis/nis_addmember.c15
-rw-r--r--nis/nis_call.c18
-rw-r--r--nis/nis_clone.c48
-rw-r--r--nis/nis_creategroup.c4
-rw-r--r--nis/nis_defaults.c10
-rw-r--r--nis/nis_destroygroup.c4
-rw-r--r--nis/nis_getservlist.c11
-rw-r--r--nis/nis_ismember.c17
-rw-r--r--nis/nis_local_names.c73
-rw-r--r--nis/nis_modify.c2
-rw-r--r--nis/nis_ping.c4
-rw-r--r--nis/nis_print_group_entry.c4
-rw-r--r--nis/nis_remove.c2
-rw-r--r--nis/nis_removemember.c29
-rw-r--r--nis/nis_server.c4
-rw-r--r--nis/nis_table.c6
-rw-r--r--nis/nis_verifygroup.c4
-rw-r--r--nis/nss_nis/nis-hosts.c2
-rw-r--r--nis/nss_nis/nis-netgrp.c4
-rw-r--r--nis/nss_nisplus/nisplus-hosts.c2
-rw-r--r--nis/nss_nisplus/nisplus-spwd.c98
27 files changed, 284 insertions, 165 deletions
diff --git a/nis/Makefile b/nis/Makefile
index a6d14d0875..770f3b8283 100644
--- a/nis/Makefile
+++ b/nis/Makefile
@@ -50,15 +50,19 @@ libnsl-routines = yp_xdr ypclnt ypupdate_xdr \
 		  nis_removemember nis_creategroup nis_destroygroup\
 		  nis_print_group_entry nis_domain_of nis_domain_of_r\
 		  nis_modify nis_remove nis_add nis_defaults
+libnsl-map	= libnsl.map
 
 libnss_compat-routines	:= $(addprefix compat-,grp pwd spwd)
 libnss_compat-inhibit-o	= $(filter-out .so,$(object-suffixes))
+libnss_compat-map	:= libnss_compat.map
 
 libnss_nis-routines	:= $(addprefix nis-,$(databases))
 libnss_nis-inhibit-o	= $(filter-out .so,$(object-suffixes))
+libnss_nis-map		:= libnss_nis.map
 
 libnss_nisplus-routines	:= $(addprefix nisplus-,$(databases))
 libnss_nisplus-inhibit-o = $(filter-out .so,$(object-suffixes))
+libnss_nisplus-map	:= libnss_nisplus.map
 
 include ../Rules
 
diff --git a/nis/libnsl.map b/nis/libnsl.map
new file mode 100644
index 0000000000..5cb3bc30f7
--- /dev/null
+++ b/nis/libnsl.map
@@ -0,0 +1,14 @@
+GLIBC_2.0 {
+  global:
+    nis_add; nis_add_entry; nis_addmember; nis_checkpoint; nis_clone_directory;
+    nis_clone_entry; nis_clone_group; nis_clone_link; nis_clone_nis_attr;
+    nis_clone_objdata; nis_clone_object; nis_clone_result; nis_clone_table;
+    nis_creategroup; nis_destroy_object; nis_destroygroup; nis_dir_cmp;
+    nis_domain_of; nis_domain_of_r; nis_first_entry; nis_free_attr;
+    nis_free_directory; nis_free_endpoints; nis_free_entry; nis_free_group;
+    nis_free_link; nis_free_object; nis_free_request; nis_free_servers;
+    nis_free_table;
+
+  local:
+    *;
+};
\ No newline at end of file
diff --git a/nis/libnss_compat.map b/nis/libnss_compat.map
new file mode 100644
index 0000000000..55d6f4745f
--- /dev/null
+++ b/nis/libnss_compat.map
@@ -0,0 +1,11 @@
+GLIBC_2.0 {
+  global:
+    _nss_compat_endgrent; _nss_compat_endpwent; _nss_compat_endspent;
+    _nss_compat_getgrent_r; _nss_compat_getgrgid_r; _nss_compat_getgrnam_r;
+    _nss_compat_getpwent_r; _nss_compat_getpwnam_r; _nss_compat_getpwuid_r;
+    _nss_compat_getspent_r; _nss_compat_getspnam_r; _nss_compat_setgrent;
+    _nss_compat_setpwent; _nss_compat_setspent;
+
+  local:
+    *;
+};
\ No newline at end of file
diff --git a/nis/libnss_nis.map b/nis/libnss_nis.map
new file mode 100644
index 0000000000..2773fca29b
--- /dev/null
+++ b/nis/libnss_nis.map
@@ -0,0 +1,25 @@
+GLIBC_2.0 {
+  global:
+    _nss_nis_endaliasent; _nss_nis_endetherent; _nss_nis_endgrent;
+    _nss_nis_endhostent; _nss_nis_endnetent; _nss_nis_endnetgrent;
+    _nss_nis_endprotoent; _nss_nis_endpwent; _nss_nis_endrpcent;
+    _nss_nis_endservent; _nss_nis_endspent; _nss_nis_getaliasbyname_r;
+    _nss_nis_getaliasent_r; _nss_nis_getetherent_r; _nss_nis_getgrent_r;
+    _nss_nis_getgrgid_r; _nss_nis_getgrnam_r; _nss_nis_gethostbyaddr_r;
+    _nss_nis_gethostbyname2_r; _nss_nis_gethostbyname_r; _nss_nis_gethostent_r;
+    _nss_nis_gethostton_r; _nss_nis_getnetbyaddr_r; _nss_nis_getnetbyname_r;
+    _nss_nis_getnetent_r; _nss_nis_getnetgrent_r; _nss_nis_getntohost_r;
+    _nss_nis_getprotobyname_r; _nss_nis_getprotobynumber_r;
+    _nss_nis_getprotoent_r; _nss_nis_getpublickey; _nss_nis_getpwent_r;
+    _nss_nis_getpwnam_r; _nss_nis_getpwuid_r; _nss_nis_getrpcbyname_r;
+    _nss_nis_getrpcbynumber_r; _nss_nis_getrpcent_r; _nss_nis_getsecretkey;
+    _nss_nis_getservbyname_r; _nss_nis_getservbyport_r; _nss_nis_getservent_r;
+    _nss_nis_getspent_r; _nss_nis_getspnam_r; _nss_nis_netname2user;
+    _nss_nis_setaliasent; _nss_nis_setetherent; _nss_nis_setgrent;
+    _nss_nis_sethostent; _nss_nis_setnetent; _nss_nis_setnetgrent;
+    _nss_nis_setprotoent; _nss_nis_setpwent; _nss_nis_setrpcent;
+    _nss_nis_setservent; _nss_nis_setspent;
+
+  local:
+    *;
+};
diff --git a/nis/libnss_nisplus.map b/nis/libnss_nisplus.map
new file mode 100644
index 0000000000..b178c02552
--- /dev/null
+++ b/nis/libnss_nisplus.map
@@ -0,0 +1,32 @@
+GLIBC_2.0 {
+  global:
+    _nss_nisplus_endaliasent; _nss_nisplus_endetherent; _nss_nisplus_endgrent;
+    _nss_nisplus_endhostent; _nss_nisplus_endnetent; _nss_nisplus_endnetgrent;
+    _nss_nisplus_endprotoent; _nss_nisplus_endpwent; _nss_nisplus_endrpcent;
+    _nss_nisplus_endservent; _nss_nisplus_endspent;
+    _nss_nisplus_getaliasbyname_r; _nss_nisplus_getaliasent_r;
+    _nss_nisplus_getetherent_r; _nss_nisplus_getgrent_r;
+    _nss_nisplus_getgrgid_r; _nss_nisplus_getgrnam_r;
+    _nss_nisplus_gethostbyaddr_r; _nss_nisplus_gethostbyname2_r;
+    _nss_nisplus_gethostbyname_r; _nss_nisplus_gethostent_r;
+    _nss_nisplus_gethostton_r; _nss_nisplus_getnetbyaddr_r;
+    _nss_nisplus_getnetbyname_r; _nss_nisplus_getnetent_r;
+    _nss_nisplus_getnetgrent_r; _nss_nisplus_getntohost_r;
+    _nss_nisplus_getprotobyname_r; _nss_nisplus_getprotobynumber_r;
+    _nss_nisplus_getprotoent_r; _nss_nisplus_getpublickey;
+    _nss_nisplus_getpwent_r; _nss_nisplus_getpwnam_r; _nss_nisplus_getpwuid_r;
+    _nss_nisplus_getrpcbyname_r; _nss_nisplus_getrpcbynumber_r;
+    _nss_nisplus_getrpcent_r; _nss_nisplus_getsecretkey;
+    _nss_nisplus_getservbyname_r; _nss_nisplus_getservbynumber_r;
+    _nss_nisplus_getservent_r; _nss_nisplus_getspent_r;
+    _nss_nisplus_getspnam_r; _nss_nisplus_netname2user;
+    _nss_nisplus_parse_grent; _nss_nisplus_parse_pwent;
+    _nss_nisplus_parse_spent; _nss_nisplus_setaliasent;
+    _nss_nisplus_setetherent; _nss_nisplus_setgrent; _nss_nisplus_sethostent;
+    _nss_nisplus_setnetent; _nss_nisplus_setnetgrent; _nss_nisplus_setprotoent;
+    _nss_nisplus_setpwent; _nss_nisplus_setrpcent; _nss_nisplus_setservent;
+    _nss_nisplus_setspent;
+
+  local:
+    *;
+};
diff --git a/nis/nis_add.c b/nis/nis_add.c
index 6e11f17ff6..e358ea4987 100644
--- a/nis/nis_add.c
+++ b/nis/nis_add.c
@@ -41,7 +41,7 @@ nis_add (const_nis_name name, const nis_object *obj)
 
   p1 = req.ns_object.ns_object_val[0].zo_name;
   req.ns_object.ns_object_val[0].zo_name =
-    nis_name_of_r (name, buf1, sizeof (buf1));
+    nis_leaf_of_r (name, buf1, sizeof (buf1));
 
   p2 = req.ns_object.ns_object_val[0].zo_owner;
   if (p2 == NULL || strlen (p2) == 0)
diff --git a/nis/nis_addmember.c b/nis/nis_addmember.c
index 2eee9cc8bf..8fd7e12a58 100644
--- a/nis/nis_addmember.c
+++ b/nis/nis_addmember.c
@@ -26,7 +26,7 @@ nis_addmember (const_nis_name member, const_nis_name group)
 {
   if (group != NULL && strlen (group) > 0)
     {
-      char buf[strlen (group) + 50];
+      char buf[strlen (group) + 14 + NIS_MAXNAMELEN];
       char leafbuf[strlen (group) + 2];
       char domainbuf[strlen (group) + 2];
       nis_result *res, *res2;
@@ -38,8 +38,8 @@ nis_addmember (const_nis_name member, const_nis_name group)
       cp2 = nis_domain_of_r (group, domainbuf, sizeof (domainbuf) - 1);
       if (cp2 != NULL && strlen (cp2) > 0)
         {
-          cp = stpcpy (cp, ".");
-          strcpy (cp, cp2);
+	  *cp++ = '.';
+          stpcpy (cp, cp2);
         }
       res = nis_lookup (buf, FOLLOW_LINKS|EXPAND_NAME);
       if (res->status != NIS_SUCCESS)
@@ -53,10 +53,15 @@ nis_addmember (const_nis_name member, const_nis_name group)
         return NIS_INVALIDOBJ;
 
       res->objects.objects_val[0].GR_data.gr_members.gr_members_val
-	= realloc (res->objects.objects_val[0].GR_data.gr_members.gr_members_val, res->objects.objects_val[0].GR_data.gr_members.gr_members_len + 1);
-      ++res->objects.objects_val[0].GR_data.gr_members.gr_members_len;
+	= realloc (res->objects.objects_val[0].GR_data.gr_members.gr_members_val,
+		   (res->objects.objects_val[0].GR_data.gr_members.gr_members_len + 1)
+		   * sizeof (char *));
       res->objects.objects_val[0].GR_data.gr_members.gr_members_val[res->objects.objects_val[0].GR_data.gr_members.gr_members_len] = strdup (member);
+      ++res->objects.objects_val[0].GR_data.gr_members.gr_members_len;
 
+      cp = stpcpy (buf, res->objects.objects_val->zo_name);
+      *cp++ = '.';
+      strncpy (cp, res->objects.objects_val->zo_domain, NIS_MAXNAMELEN);
       res2 = nis_modify (buf, res->objects.objects_val);
       status = res2->status;
       nis_freeresult (res);
diff --git a/nis/nis_call.c b/nis/nis_call.c
index 17f67abbde..08a20acd73 100644
--- a/nis/nis_call.c
+++ b/nis/nis_call.c
@@ -65,12 +65,12 @@ __nis_dobind (const nis_server *server, u_long flags)
   clnt_saddr.sin_family = AF_INET;
   for (i = 0; i < server->ep.ep_len; i++)
     {
-      if (strcmp (server->ep.ep_val[i].family,"loopback") == 0)
+      if (strcmp (server->ep.ep_val[i].family, "loopback") == 0)
 	{
 	  if (server->ep.ep_val[i].uaddr[i] == '-')
 	    clnt_saddr.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
 	  else
-	    if (strcmp (server->ep.ep_val[i].proto,"udp") == 0)
+	    if (strcmp (server->ep.ep_val[i].proto, "udp") == 0)
 	      {
 		if ((flags & USE_DGRAM) == USE_DGRAM)
 		  clnt_saddr.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
@@ -78,7 +78,7 @@ __nis_dobind (const nis_server *server, u_long flags)
 		  continue;
 	      }
 	    else
-	      if (strcmp (server->ep.ep_val[i].proto,"tcp") == 0)
+	      if (strcmp (server->ep.ep_val[i].proto, "tcp") == 0)
 		{
 		  if ((flags & USE_DGRAM) == USE_DGRAM)
 		    continue;
@@ -87,13 +87,13 @@ __nis_dobind (const nis_server *server, u_long flags)
 		}
 	}
       else
-	if (strcmp (server->ep.ep_val[i].family,"inet") == 0)
+	if (strcmp (server->ep.ep_val[i].family, "inet") == 0)
 	  {
 	    if (server->ep.ep_val[i].uaddr[i] == '-')
 	      clnt_saddr.sin_addr.s_addr =
 		inetstr2int (server->ep.ep_val[i].uaddr);
 	    else
-	      if (strcmp (server->ep.ep_val[i].proto,"udp") == 0)
+	      if (strcmp (server->ep.ep_val[i].proto, "udp") == 0)
 		{
 		  if ((flags & USE_DGRAM) == USE_DGRAM)
 		    clnt_saddr.sin_addr.s_addr =
@@ -102,7 +102,7 @@ __nis_dobind (const nis_server *server, u_long flags)
 		    continue;
 		}
 	      else
-		if (strcmp (server->ep.ep_val[i].proto,"tcp") == 0)
+		if (strcmp (server->ep.ep_val[i].proto, "tcp") == 0)
 		  {
 		    if ((flags & USE_DGRAM) == USE_DGRAM)
 		      continue;
@@ -310,6 +310,7 @@ rec_dirsearch (const_nis_name name, directory_obj *dir, u_long flags)
 	char leaf [strlen (name) + 3];
 	char ndomain [strlen (name) + 3];
 	u_int i;
+	char *cp;
 
 	do
 	  {
@@ -323,8 +324,9 @@ rec_dirsearch (const_nis_name name, directory_obj *dir, u_long flags)
 	    strcpy (domain, ndomain);
 	  }
 	while (nis_dir_cmp (domain, dir->do_name) != SAME_NAME);
-	strcat (leaf, ".");
-	strcat (leaf, domain);
+	cp = strchr (leaf, '\0');
+	*cp++ = '.';
+	strcpy (cp, domain);
 
 	for (i = 0; i < dir->do_servers.do_servers_len; ++i)
 	  {
diff --git a/nis/nis_clone.c b/nis/nis_clone.c
index 860abb386c..e4dc87d4c9 100644
--- a/nis/nis_clone.c
+++ b/nis/nis_clone.c
@@ -264,7 +264,7 @@ nis_clone_entry (const entry_obj *src, entry_obj *dest)
   if (res->en_cols.en_cols_val == NULL && src->en_cols.en_cols_len > 0)
     {
       res->en_cols.en_cols_val =
-	malloc (src->en_cols.en_cols_len * sizeof (entry_col));
+	calloc (1, src->en_cols.en_cols_len * sizeof (entry_col));
       if (res->en_cols.en_cols_val == NULL)
 	return NULL;
     }
@@ -374,8 +374,13 @@ nis_clone_link (const link_obj *src, link_obj *dest)
 		       res->li_attrs.li_attrs_val,
 		       src->li_attrs.li_attrs_len);
 
-  if ((res->li_name = strdup (src->li_name)) == NULL)
-    return NULL;
+  if (src->li_name)
+    {
+      if ((res->li_name = strdup (src->li_name)) == NULL)
+	return NULL;
+    }
+  else
+    res->li_name = NULL;
 
   return res;
 }
@@ -477,15 +482,34 @@ nis_clone_object (const nis_object *src, nis_object *dest)
 
   res->zo_oid = src->zo_oid;
 
-  if ((res->zo_name = strdup (src->zo_name)) == NULL)
-    return NULL;
-  if ((res->zo_owner = strdup (src->zo_owner)) == NULL)
-    return NULL;
-  if ((res->zo_group = strdup (src->zo_group)) == NULL)
-    return NULL;
-  if ((res->zo_domain = strdup (src->zo_domain)) == NULL)
-    return NULL;
-
+  if (src->zo_name)
+    {
+      if ((res->zo_name = strdup (src->zo_name)) == NULL)
+	return NULL;
+    }
+  else
+    res->zo_name = NULL;
+  if (src->zo_owner)
+    {
+      if ((res->zo_owner = strdup (src->zo_owner)) == NULL)
+	return NULL;
+    }
+  else
+    res->zo_owner = NULL;
+  if (src->zo_group)
+    {
+      if ((res->zo_group = strdup (src->zo_group)) == NULL)
+	return NULL;
+    }
+  else
+    res->zo_group = NULL;
+  if (src->zo_domain)
+    {
+      if ((res->zo_domain = strdup (src->zo_domain)) == NULL)
+	return NULL;
+    }
+  else
+    res->zo_domain = NULL;
   res->zo_access = src->zo_access;
   res->zo_ttl = src->zo_ttl;
 
diff --git a/nis/nis_creategroup.c b/nis/nis_creategroup.c
index c62b039b5e..d1de08c08d 100644
--- a/nis/nis_creategroup.c
+++ b/nis/nis_creategroup.c
@@ -39,8 +39,8 @@ nis_creategroup (const_nis_name group, u_long flags)
       cp2 = nis_domain_of_r (group, domainbuf, sizeof (domainbuf) - 1);
       if (cp2 != NULL && strlen (cp2) > 0)
         {
-          cp = stpcpy (cp, ".");
-          strcpy (cp, cp2);
+	  *cp++ = '.';
+          stpcpy (cp, cp2);
         }
       else
 	return NIS_BADNAME;
diff --git a/nis/nis_defaults.c b/nis/nis_defaults.c
index 9d152d1f11..53a585b516 100644
--- a/nis/nis_defaults.c
+++ b/nis/nis_defaults.c
@@ -46,11 +46,9 @@ searchgroup (char *str)
   while (cptr[i] != '\0' && cptr[i] != ':')
     i++;
   if (i == 0)			/* only "group=" ? */
-    return (nis_name)"";
-
-  strncpy (default_group, cptr, i);
+    return (nis_name) "";
 
-  return default_group;
+  return strncpy (default_group, cptr, i);
 }
 
 static nis_name
@@ -71,9 +69,7 @@ searchowner (char *str)
   if (i == 0)			/* only "owner=" ? */
     return (nis_name)"";
 
-  strncpy (default_owner, cptr, i);
-
-  return default_owner;
+  return strncpy (default_owner, cptr, i);
 }
 
 static u_long
diff --git a/nis/nis_destroygroup.c b/nis/nis_destroygroup.c
index 524e0776ac..6ece45345d 100644
--- a/nis/nis_destroygroup.c
+++ b/nis/nis_destroygroup.c
@@ -38,8 +38,8 @@ nis_destroygroup (const_nis_name group)
       cp2 = nis_domain_of_r (group, domainbuf, sizeof (domainbuf) - 1);
       if (cp2 != NULL && strlen (cp2) > 0)
 	{
-	  cp = stpcpy (cp, ".");
-	  strcpy (cp, cp2);
+	  *cp++ = '.';
+	  stpcpy (cp, cp2);
 	}
       res = nis_remove (buf, NULL);
       status = res->status;
diff --git a/nis/nis_getservlist.c b/nis/nis_getservlist.c
index 0c9fbfb60d..b30b70b584 100644
--- a/nis/nis_getservlist.c
+++ b/nis/nis_getservlist.c
@@ -35,7 +35,7 @@ nis_getservlist (const_nis_name dir)
       unsigned long i;
       nis_server *server;
 
-      serv = malloc (sizeof (nis_server *) *
+      serv = calloc (1, sizeof (nis_server *) *
 		     (res->objects.objects_val->DI_data.do_servers.do_servers_len + 1));
       if (serv == NULL)
 	return NULL;
@@ -43,10 +43,9 @@ nis_getservlist (const_nis_name dir)
 	{
 	  server =
 	    &res->objects.objects_val->DI_data.do_servers.do_servers_val[i];
+	  serv[i] = calloc (1, sizeof (nis_server));
 	  if (server->name != NULL)
             serv[i]->name = strdup (server->name);
-          else
-            serv[i]->name = NULL;
 
           serv[i]->ep.ep_len = server->ep.ep_len;
           if (serv[i]->ep.ep_len > 0)
@@ -110,6 +109,10 @@ nis_freeservlist (nis_server **serv)
 
   i = 0;
   while (serv[i] != NULL)
-    nis_free_servers (serv[i], 1);
+    {
+      nis_free_servers (serv[i], 1);
+      free (serv[i]);
+      ++i;
+    }
   free (serv);
 }
diff --git a/nis/nis_ismember.c b/nis/nis_ismember.c
index f0d087ca51..85c401531e 100644
--- a/nis/nis_ismember.c
+++ b/nis/nis_ismember.c
@@ -42,7 +42,7 @@ internal_ismember (const_nis_name principal, const_nis_name group)
       cp2 = nis_domain_of_r (group, domainbuf, sizeof (domainbuf) - 1);
       if (cp2 != NULL && strlen (cp2) > 0)
         {
-          cp = stpcpy (cp, ".");
+	  *cp++ = '.';
           strcpy (cp, cp2);
 	}
       res = nis_lookup (buf, EXPAND_NAME|FOLLOW_LINKS);
@@ -112,9 +112,8 @@ internal_ismember (const_nis_name principal, const_nis_name group)
 		    char buf1[strlen (principal) + 2];
 		    char buf2[strlen (cp) + 2];
 
-		    strcpy (buf1, nis_domain_of (principal));
-		    strcpy (buf2, nis_domain_of (cp));
-		    if (strcmp (buf1, buf2) == 0)
+		    if (strcmp (nis_domain_of_r (principal, buf1, sizeof buf1),
+				nis_domain_of_r (cp, buf2, sizeof buf2)) == 0)
 		      return 1;
 		  }
 	    }
@@ -128,15 +127,7 @@ bool_t
 nis_ismember (const_nis_name principal, const_nis_name group)
 {
   if (group != NULL && strlen (group) > 0)
-    {
-      int status;
-
-      status = internal_ismember (principal, group);
-      if (status == 1)
-	return TRUE;
-      else
-	return FALSE;
-    }
+    return internal_ismember (principal, group) == 1 ? TRUE : FALSE;
   else
     return FALSE;
 }
diff --git a/nis/nis_local_names.c b/nis/nis_local_names.c
index e760f433b2..348c7534a3 100644
--- a/nis/nis_local_names.c
+++ b/nis/nis_local_names.c
@@ -31,6 +31,7 @@ nis_local_group (void)
   if (__nisgroup[0] == '\0')
     {
       char *cptr;
+      char *cp;
 
       if ((cptr = getenv ("NIS_GROUP")) == NULL)
 	return __nisgroup;
@@ -38,21 +39,18 @@ nis_local_group (void)
       if (strlen (cptr) >= NIS_MAXNAMELEN)
 	return __nisgroup;
 
-      strcpy (__nisgroup, cptr);
+      cp = stpcpy (__nisgroup, cptr);
 
-      if (__nisgroup[strlen (__nisgroup) - 1] != '.')
+      if (cp[-1] != '.')
 	{
 	  cptr = nis_local_directory ();
-	  if (strlen (__nisgroup) + strlen (cptr) + 1 < NIS_MAXNAMELEN)
+	  if ((cp - __nisgroup) + strlen (cptr) + 1 < NIS_MAXNAMELEN)
 	    {
-	      strcat (__nisgroup, ".");
-	      strcat (__nisgroup, cptr);
+	      *cp++ = '.';
+	      strcpy (cp, cptr);
 	    }
 	  else
-	    {
-	      __nisgroup[0] = '\0';
-	      return __nisgroup;
-	    }
+	    __nisgroup[0] = '\0';
 	}
     }
 
@@ -64,21 +62,20 @@ nis_name
 nis_local_directory (void)
 {
   static char __nisdomainname[NIS_MAXNAMELEN + 1];
-  int len;
 
   if (__nisdomainname[0] == '\0')
     {
       if (getdomainname (__nisdomainname, NIS_MAXNAMELEN) < 0)
-	strcpy (__nisdomainname, "\0");
+	__nisdomainname[0] = '\0';
       else
 	{
-	  len = strlen (__nisdomainname);
+	  char *cp = strchr (__nisdomainname, '\0');
 
 	  /* Missing trailing dot? */
-	  if (__nisdomainname[len - 1] != '.')
+	  if (cp[-1] != '.')
 	    {
-	      __nisdomainname[len] = '.';
-	      __nisdomainname[len + 1] = '\0';
+	      *cp++ = '.';
+	      *cp = '\0';
 	    }
 	}
     }
@@ -99,28 +96,32 @@ nis_local_principal (void)
 
       if (uid != 0)
 	{
-	  snprintf (buf, NIS_MAXNAMELEN - 1,
-		    "[auth_name=%d,auth_type=LOCAL],cred.org_dir.%s",
-		    uid, nis_local_directory ());
+	  int len = snprintf (buf, NIS_MAXNAMELEN - 1,
+			      "[auth_name=%d,auth_type=LOCAL],cred.org_dir.%s",
+			      uid, nis_local_directory ());
+
+	  if (len >= NIS_MAXNAMELEN - 1)
+	    /* XXX The buffer is too small.  Can this happen???  */
+	    return strcpy (__principal, "nobody");
 
-	  if (buf[strlen (buf) - 1] != '.')
-	    strcat (buf, ".");
+	  if (buf[len - 1] != '.')
+	    {
+	      buf[len++] = '.';
+	      buf[len] = '\0';
+	    }
 
 	  res = nis_list (buf, USE_DGRAM + NO_AUTHINFO + FOLLOW_LINKS +
 			  FOLLOW_PATH, NULL, NULL);
 
 	  if (res == NULL)
-	    {
-	      strcpy (__principal, "nobody");
-	      return __principal;
-	    }
+	    return strcpy (__principal, "nobody");
 
 	  if (res->status == NIS_SUCCESS)
 	    {
 	      if (res->objects.objects_len > 1)
 		{
 		  /* More than one principal with same uid?  something
-		     wrong with cred table. Should be unique Warn user
+		     wrong with cred table.  Should be unique.  Warn user
 		     and continue.  */
 		  printf (_("\
 LOCAL entry for UID %d in directory %s not unique\n"),
@@ -133,19 +134,14 @@ LOCAL entry for UID %d in directory %s not unique\n"),
 	  else
 	    {
 	      nis_freeresult (res);
-	      strcpy (__principal, "nobody");
-	      return __principal;
+	      return strcpy (__principal, "nobody");
 	    }
 	}
       else
-	{
-	  strcpy (__principal, nis_local_host ());
-	  return __principal;
-	}
+	return strcpy (__principal, nis_local_host ());
 
       /* Should be never reached */
-      strcpy (__principal, "nobody");
-      return __principal;
+      return strcpy (__principal, "nobody");
     }
   return __principal;
 }
@@ -154,7 +150,6 @@ nis_name
 nis_local_host (void)
 {
   static char __nishostname[NIS_MAXNAMELEN + 1];
-  int len;
 
   if (__nishostname[0] == '\0')
     {
@@ -162,21 +157,19 @@ nis_local_host (void)
 	__nishostname[0] = '\0';
       else
 	{
-	  char *cp;
-	  len = strlen(__nishostname);
+	  char *cp = strchr (__nishostname, '\0');
+	  int len = cp - __nishostname;
 
 	  /* Hostname already fully qualified? */
-	  if (__nishostname[len - 1] == '.')
+	  if (cp[-1] == '.')
 	    return __nishostname;
 
-	  if ((strlen (__nishostname) + strlen (nis_local_directory ()) + 1) >
-	      NIS_MAXNAMELEN)
+	  if (len + strlen (nis_local_directory ()) + 1 > NIS_MAXNAMELEN)
 	    {
 	      __nishostname[0] = '\0';
 	      return __nishostname;
 	    }
 
-	  cp = &__nishostname[len];
 	  *cp++ = '.';
 	  strncpy (cp, nis_local_directory (), NIS_MAXNAMELEN - len -1);
 	  __nishostname[NIS_MAXNAMELEN] = '\0';
diff --git a/nis/nis_modify.c b/nis/nis_modify.c
index 9c5aad7913..e68bf2a954 100644
--- a/nis/nis_modify.c
+++ b/nis/nis_modify.c
@@ -31,7 +31,7 @@ nis_modify (const_nis_name name, const nis_object *obj)
 
   res = calloc (1, sizeof (nis_result));
 
-  req.ns_name = (char *)name;
+  req.ns_name = (char *) name;
 
   req.ns_object.ns_object_len = 1;
   req.ns_object.ns_object_val = nis_clone_object (obj, NULL);
diff --git a/nis/nis_ping.c b/nis/nis_ping.c
index 610cf03ea5..941adfbda4 100644
--- a/nis/nis_ping.c
+++ b/nis/nis_ping.c
@@ -40,7 +40,7 @@ nis_ping (const_nis_name dirname, u_long utime, const nis_object *dirobj)
       obj = res->objects.objects_val;
     }
   else
-    obj = (nis_object *)dirobj;
+    obj = (nis_object *) dirobj;
 
   /* Check if obj is really a diryectory object */
   if (obj->zo_data.zo_type != DIRECTORY_OBJ)
@@ -49,7 +49,7 @@ nis_ping (const_nis_name dirname, u_long utime, const nis_object *dirobj)
   if (dirname == NULL)
     args.dir = obj->DI_data.do_name;
   else
-    args.dir = (char *)dirname;
+    args.dir = (char *) dirname;
   args.stamp = utime;
 
   for (i = 0; i < obj->DI_data.do_servers.do_servers_len; ++i)
diff --git a/nis/nis_print_group_entry.c b/nis/nis_print_group_entry.c
index e7c866cbe2..1063ef8411 100644
--- a/nis/nis_print_group_entry.c
+++ b/nis/nis_print_group_entry.c
@@ -38,8 +38,8 @@ nis_print_group_entry (const_nis_name group)
       cp2 = nis_domain_of_r (group, domainbuf, sizeof (domainbuf) - 1);
       if (cp2 != NULL && strlen (cp2) > 0)
 	{
-	  cp = stpcpy (cp, ".");
-	  strcpy (cp, cp2);
+	  *cp++ = '.';
+	  stpcpy (cp, cp2);
 	}
       res = nis_lookup (buf, FOLLOW_LINKS|EXPAND_NAME);
 
diff --git a/nis/nis_remove.c b/nis/nis_remove.c
index 3ffd66dfe0..e6aed00393 100644
--- a/nis/nis_remove.c
+++ b/nis/nis_remove.c
@@ -31,7 +31,7 @@ nis_remove (const_nis_name name, const nis_object *obj)
 
   res = calloc (1, sizeof (nis_result));
 
-  req.ns_name = (char *)name;
+  req.ns_name = (char *) name;
 
   if (obj != NULL)
     {
diff --git a/nis/nis_removemember.c b/nis/nis_removemember.c
index 473438ba5c..8ed67caf98 100644
--- a/nis/nis_removemember.c
+++ b/nis/nis_removemember.c
@@ -26,14 +26,14 @@ nis_removemember (const_nis_name member, const_nis_name group)
 {
   if (group != NULL && strlen (group) > 0)
     {
-      char buf[strlen (group) + 50];
+      char buf[strlen (group) + 14 + NIS_MAXNAMELEN];
       char leafbuf[strlen (group) + 2];
       char domainbuf[strlen (group) + 2];
       nis_name *newmem;
       nis_result *res, *res2;
       nis_error status;
       char *cp, *cp2;
-      u_int i, j;
+      unsigned long int i, j, k;
 
       cp = stpcpy (buf, nis_leaf_of_r (group, leafbuf, sizeof (leafbuf) - 1));
       cp = stpcpy (cp, ".groups_dir");
@@ -41,7 +41,7 @@ nis_removemember (const_nis_name member, const_nis_name group)
       if (cp2 != NULL && strlen (cp2) > 0)
         {
           cp = stpcpy (cp, ".");
-          strcpy (cp, cp2);
+          stpcpy (cp, cp2);
         }
       res = nis_lookup (buf, FOLLOW_LINKS|EXPAND_NAME);
       if (res->status != NIS_SUCCESS)
@@ -54,20 +54,35 @@ nis_removemember (const_nis_name member, const_nis_name group)
           (res->objects.objects_val[0].zo_data.zo_type != GROUP_OBJ))
         return NIS_INVALIDOBJ;
 
-      newmem = malloc (res->objects.objects_val[0].GR_data.gr_members.gr_members_len);
 
+      newmem = calloc (1, res->objects.objects_val[0].GR_data.gr_members.gr_members_len *
+		       sizeof (char *));
+
+      k = res->objects.objects_val[0].GR_data.gr_members.gr_members_len;
       j = 0;
-      for (i = 0; i < res->objects.objects_val[0].GR_data.gr_members.gr_members_len - 1; ++i)
+      for (i = 0; i < res->objects.objects_val[0].GR_data.gr_members.gr_members_len;
+	   ++i)
 	{
-	  if (strcmp (res->objects.objects_val[0].GR_data.gr_members.gr_members_val[j], member) != 0)
+	  if (strcmp (res->objects.objects_val[0].GR_data.gr_members.gr_members_val[i],
+		      member) != 0)
 	    {
 	      newmem[j] = res->objects.objects_val[0].GR_data.gr_members.gr_members_val[i];
 	      ++j;
 	    }
+	  else
+	    {
+	      free (res->objects.objects_val[0].GR_data.gr_members.gr_members_val[i]);
+	      --k;
+	    }
 	}
-      --res->objects.objects_val[0].GR_data.gr_members.gr_members_len;
       free (res->objects.objects_val[0].GR_data.gr_members.gr_members_val);
+      newmem = realloc (newmem, k * sizeof (char*));
       res->objects.objects_val[0].GR_data.gr_members.gr_members_val = newmem;
+      res->objects.objects_val[0].GR_data.gr_members.gr_members_len = k;
+
+      cp = stpcpy (buf, res->objects.objects_val->zo_name);
+      *cp++ = '.';
+      strncpy (cp, res->objects.objects_val->zo_domain, NIS_MAXNAMELEN);
       res2 = nis_modify (buf, res->objects.objects_val);
       status = res2->status;
       nis_freeresult (res);
diff --git a/nis/nis_server.c b/nis/nis_server.c
index 4d6b1c1100..5274a3bfc4 100644
--- a/nis/nis_server.c
+++ b/nis/nis_server.c
@@ -33,7 +33,7 @@ nis_servstate (const nis_server *serv, const nis_tag *tags,
   tagres.tags.tags_val = NULL;
   *result = NULL;
   taglist.tags.tags_len = numtags;
-  taglist.tags.tags_val = (nis_tag *)tags;
+  taglist.tags.tags_val = (nis_tag *) tags;
 
   if (serv == NULL)
     {
@@ -80,7 +80,7 @@ nis_stats (const nis_server *serv, const nis_tag *tags,
   tagres.tags.tags_val = NULL;
   *result = NULL;
   taglist.tags.tags_len = numtags;
-  taglist.tags.tags_val = (nis_tag *)tags;
+  taglist.tags.tags_val = (nis_tag *) tags;
 
   if (serv == NULL)
     {
diff --git a/nis/nis_table.c b/nis/nis_table.c
index 5fa3c89e0b..e9e35abf3b 100644
--- a/nis/nis_table.c
+++ b/nis/nis_table.c
@@ -78,7 +78,7 @@ splitname (const_nis_name name, nis_name *ibr_name, int *srch_len,
       if (!val)
 	{
 	  free (cptr);
-	  *srch_val = malloc (sizeof (char *));
+	  *srch_val = malloc (sizeof (nis_attr));
 	  if (*srch_val == NULL)
 	    {
 	      free (cptr);
@@ -86,8 +86,8 @@ splitname (const_nis_name name, nis_name *ibr_name, int *srch_len,
 	      *ibr_name = NULL;
 	      return;
 	    }
-	  (*srch_val)[*srch_len].zattr_val.zattr_val_len = 0;
-	  (*srch_val)[*srch_len].zattr_val.zattr_val_val = NULL;
+	  (*srch_val)[0].zattr_val.zattr_val_len = 0;
+	  (*srch_val)[0].zattr_val.zattr_val_val = NULL;
 	  return;
 	}
 
diff --git a/nis/nis_verifygroup.c b/nis/nis_verifygroup.c
index e57f16589a..6a8ab01bd7 100644
--- a/nis/nis_verifygroup.c
+++ b/nis/nis_verifygroup.c
@@ -38,8 +38,8 @@ nis_verifygroup (const_nis_name group)
       cp2 = nis_domain_of_r (group, domainbuf, sizeof (domainbuf) - 1);
       if (cp2 != NULL && strlen (cp2) > 0)
 	{
-	  cp = stpcpy (cp, ".");
-	  strcpy (cp, cp2);
+	  *cp++ = '.';
+	  stpcpy (cp, cp2);
 	}
       res = nis_lookup (buf, 0);
       status = res->status;
diff --git a/nis/nss_nis/nis-hosts.c b/nis/nss_nis/nis-hosts.c
index 91d30c8149..5823c71a80 100644
--- a/nis/nss_nis/nis-hosts.c
+++ b/nis/nss_nis/nis-hosts.c
@@ -55,7 +55,7 @@ LINE_PARSER
    STRING_FIELD (addr, isspace, 1);
 
    /* Parse address.  */
-   if (inet_pton (AF_INET6, p, entdata->host_addr) > 0)
+   if (inet_pton (AF_INET6, addr, entdata->host_addr) > 0)
      {
        result->h_addrtype = AF_INET6;
        result->h_length = IN6ADDRSZ;
diff --git a/nis/nss_nis/nis-netgrp.c b/nis/nss_nis/nis-netgrp.c
index 7609ea08ed..aa51c2f0df 100644
--- a/nis/nss_nis/nis-netgrp.c
+++ b/nis/nss_nis/nis-netgrp.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
    Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1996.
 
@@ -52,7 +52,7 @@ _nss_nis_setnetgrent (char *group)
 
   status = NSS_STATUS_SUCCESS;
 
-  if (group[0] == '\0')
+  if (group == NULL || group[0] == '\0')
     return NSS_STATUS_UNAVAIL;
 
   if (yp_get_default_domain (&domain))
diff --git a/nis/nss_nisplus/nisplus-hosts.c b/nis/nss_nisplus/nisplus-hosts.c
index 0a005406d1..e6d584dac8 100644
--- a/nis/nss_nisplus/nisplus-hosts.c
+++ b/nis/nss_nisplus/nisplus-hosts.c
@@ -66,7 +66,7 @@ LINE_PARSER
    STRING_FIELD (addr, isspace, 1);
 
    /* Parse address.  */
-   if (inet_pton (AF_INET6, p, entdata->host_addr) > 0)
+   if (inet_pton (AF_INET6, addr, entdata->host_addr) > 0)
      {
        result->h_addrtype = AF_INET6;
        result->h_length = IN6ADDRSZ;
diff --git a/nis/nss_nisplus/nisplus-spwd.c b/nis/nss_nisplus/nisplus-spwd.c
index d426d28684..568a1c4006 100644
--- a/nis/nss_nisplus/nisplus-spwd.c
+++ b/nis/nss_nisplus/nisplus-spwd.c
@@ -44,7 +44,6 @@ _nss_nisplus_parse_spent (nis_result *result, struct spwd *sp,
 {
   char *first_unused = buffer;
   size_t room_left = buflen;
-  char *line, *cp;
 
   if (result == NULL)
     return 0;
@@ -85,52 +84,57 @@ _nss_nisplus_parse_spent (nis_result *result, struct spwd *sp,
   sp->sp_lstchg = sp->sp_min = sp->sp_max = sp->sp_warn = sp->sp_inact =
     sp->sp_expire = sp->sp_flag = -1;
 
-  line = NISENTRYVAL (0, 7, result);
-  cp = strchr (line, ':');
-  if (cp == NULL)
-    return 0;
-  *cp++ = '\0';
-  sp->sp_lstchg = atol (line);
-
-  line = cp;
-  cp = strchr (line, ':');
-  if (cp == NULL)
-    return 0;
-  *cp++ = '\0';
-  sp->sp_min = atol(line);
-
-  line = cp;
-  cp = strchr (line, ':');
-  if (cp == NULL)
-    return 0;
-  *cp++ = '\0';
-  sp->sp_max = atol(line);
-
-  line = cp;
-  cp = strchr (line, ':');
-  if (cp == NULL)
-    return 0;
-  *cp++ = '\0';
-  sp->sp_warn = atol(line);
-
-  line = cp;
-  cp = strchr (line, ':');
-  if (cp == NULL)
-    return 0;
-  *cp++ = '\0';
-  sp->sp_inact = atol(line);
-
-  line = cp;
-  cp = strchr (line, ':');
-  if (cp == NULL)
-    return 0;
-  *cp++ = '\0';
-  sp->sp_expire = atol(line);
-
-  line = cp;
-  if (line == NULL)
-    return 0;
-  sp->sp_flag = atol(line);
+  if (NISENTRYVAL (0, 7, result) > 0)
+    {
+      char *line, *cp;
+
+      line = NISENTRYVAL (0, 7, result);
+      cp = strchr (line, ':');
+      if (cp == NULL)
+	return 0;
+      *cp++ = '\0';
+      sp->sp_lstchg = atol (line);
+
+      line = cp;
+      cp = strchr (line, ':');
+      if (cp == NULL)
+	return 0;
+      *cp++ = '\0';
+      sp->sp_min = atol(line);
+
+      line = cp;
+      cp = strchr (line, ':');
+      if (cp == NULL)
+	return 0;
+      *cp++ = '\0';
+      sp->sp_max = atol(line);
+
+      line = cp;
+      cp = strchr (line, ':');
+      if (cp == NULL)
+	return 0;
+      *cp++ = '\0';
+      sp->sp_warn = atol(line);
+
+      line = cp;
+      cp = strchr (line, ':');
+      if (cp == NULL)
+	return 0;
+      *cp++ = '\0';
+      sp->sp_inact = atol(line);
+
+      line = cp;
+      cp = strchr (line, ':');
+      if (cp == NULL)
+	return 0;
+      *cp++ = '\0';
+      sp->sp_expire = atol(line);
+
+      line = cp;
+      if (line == NULL)
+	return 0;
+      sp->sp_flag = atol(line);
+    }
 
   return 1;
 }