aboutsummaryrefslogtreecommitdiff
path: root/nis/nss_nis/nis-publickey.c
diff options
context:
space:
mode:
Diffstat (limited to 'nis/nss_nis/nis-publickey.c')
-rw-r--r--nis/nss_nis/nis-publickey.c106
1 files changed, 55 insertions, 51 deletions
diff --git a/nis/nss_nis/nis-publickey.c b/nis/nss_nis/nis-publickey.c
index f58eb154ad..6e92112d11 100644
--- a/nis/nss_nis/nis-publickey.c
+++ b/nis/nss_nis/nis-publickey.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1996-1999,2001,2002,2005,2006 Free Software Foundation, Inc.
+/* Copyright (C) 1996,1997,1998,1999,2001,2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Thorsten Kukuk <kukuk@suse.de>, 1996.
@@ -36,6 +36,10 @@ extern int xdecrypt (char *, char *);
enum nss_status
_nss_nis_getpublickey (const char *netname, char *pkey, int *errnop)
{
+ enum nss_status retval;
+ char *domain, *result;
+ int len;
+
pkey[0] = 0;
if (netname == NULL)
@@ -44,23 +48,19 @@ _nss_nis_getpublickey (const char *netname, char *pkey, int *errnop)
return NSS_STATUS_UNAVAIL;
}
- char *domain = strchr (netname, '@');
- if (domain == NULL)
+ domain = strchr (netname, '@');
+ if (!domain)
{
*errnop = EINVAL;
return NSS_STATUS_UNAVAIL;
}
++domain;
- char *result;
- int len;
- int yperr = yp_match (domain, "publickey.byname", netname, strlen (netname),
- &result, &len);
+ retval = yperr2nss (yp_match (domain, "publickey.byname", netname,
+ strlen (netname), &result, &len));
- if (__builtin_expect (yperr != YPERR_SUCCESS, 0))
+ if (retval != NSS_STATUS_SUCCESS)
{
- enum nss_status retval = yperr2nss (yperr);
-
if (retval == NSS_STATUS_TRYAGAIN)
*errnop = errno;
return retval;
@@ -73,7 +73,6 @@ _nss_nis_getpublickey (const char *netname, char *pkey, int *errnop)
*p = 0;
strncpy (pkey, result, HEXKEYBYTES + 1);
pkey[HEXKEYBYTES] = '\0';
- free (result);
}
return NSS_STATUS_SUCCESS;
}
@@ -82,6 +81,11 @@ enum nss_status
_nss_nis_getsecretkey (const char *netname, char *skey, char *passwd,
int *errnop)
{
+ enum nss_status retval;
+ char buf[2 * (HEXKEYBYTES + 1)];
+ char *domain, *result;
+ int len;
+
skey[0] = 0;
if (netname == NULL || passwd == NULL)
@@ -90,23 +94,19 @@ _nss_nis_getsecretkey (const char *netname, char *skey, char *passwd,
return NSS_STATUS_UNAVAIL;
}
- char *domain = strchr (netname, '@');
- if (domain == NULL)
+ domain = strchr (netname, '@');
+ if (!domain)
{
*errnop = EINVAL;
return NSS_STATUS_UNAVAIL;
}
++domain;
- char *result;
- int len;
- int yperr = yp_match (domain, "publickey.byname", netname, strlen (netname),
- &result, &len);
+ retval = yperr2nss (yp_match (domain, "publickey.byname", netname,
+ strlen (netname), &result, &len));
- if (__builtin_expect (yperr != YPERR_SUCCESS, 0))
+ if (retval != NSS_STATUS_SUCCESS)
{
- enum nss_status retval = yperr2nss (yperr);
-
if (retval == NSS_STATUS_TRYAGAIN)
*errnop = errno;
return retval;
@@ -115,22 +115,20 @@ _nss_nis_getsecretkey (const char *netname, char *skey, char *passwd,
if (result != NULL)
{
char *p = strchr (result, ':');
- if (p != NULL)
- {
- char buf[2 * (HEXKEYBYTES + 1)];
-
- ++p;
- strncpy (buf, p, 2 * (HEXKEYBYTES + 1));
- buf[2 * HEXKEYBYTES + 1] = '\0';
- if (xdecrypt (buf, passwd)
- && memcmp (buf, &(buf[HEXKEYBYTES]), KEYCHECKSUMSIZE) == 0)
- {
- buf[HEXKEYBYTES] = '\0';
- strcpy (skey, buf);
- }
- }
-
- free (result);
+ if (p == NULL)
+ return NSS_STATUS_SUCCESS;
+
+ ++p;
+ strncpy (buf, p, 2 * (HEXKEYBYTES + 1));
+ buf[2 * (HEXKEYBYTES + 1)] = '\0';
+ if (!xdecrypt (buf, passwd))
+ return NSS_STATUS_SUCCESS;
+
+ if (memcmp (buf, &(buf[HEXKEYBYTES]), KEYCHECKSUMSIZE) != 0)
+ return NSS_STATUS_SUCCESS;
+
+ buf[HEXKEYBYTES] = '\0';
+ strcpy (skey, buf);
}
return NSS_STATUS_SUCCESS;
}
@@ -196,8 +194,13 @@ enum nss_status
_nss_nis_netname2user (char netname[MAXNETNAMELEN + 1], uid_t *uidp,
gid_t *gidp, int *gidlenp, gid_t *gidlist, int *errnop)
{
- char *domain = strchr (netname, '@');
- if (domain == NULL)
+ char *domain;
+ int yperr;
+ char *lookup;
+ int len;
+
+ domain = strchr (netname, '@');
+ if (!domain)
{
*errnop = EINVAL;
return NSS_STATUS_UNAVAIL;
@@ -205,10 +208,9 @@ _nss_nis_netname2user (char netname[MAXNETNAMELEN + 1], uid_t *uidp,
/* Point past the '@' character */
++domain;
- char *lookup = NULL;
- int len;
- int yperr = yp_match (domain, "netid.byname", netname, strlen (netname),
- &lookup, &len);
+ lookup = NULL;
+ yperr = yp_match (domain, "netid.byname", netname, strlen (netname),
+ &lookup, &len);
switch (yperr)
{
case YPERR_SUCCESS:
@@ -221,15 +223,17 @@ _nss_nis_netname2user (char netname[MAXNETNAMELEN + 1], uid_t *uidp,
return NSS_STATUS_UNAVAIL;
}
- if (lookup == NULL)
- return NSS_STATUS_NOTFOUND;
-
-
- lookup[len] = '\0';
-
- enum nss_status err = parse_netid_str (lookup, uidp, gidp, gidlenp, gidlist);
+ if (lookup)
+ {
+ enum nss_status err;
- free (lookup);
+ lookup[len] = '\0';
+ err = parse_netid_str (lookup, uidp, gidp, gidlenp, gidlist);
+ free (lookup);
+ return err;
+ }
+ else
+ return NSS_STATUS_NOTFOUND;
- return err;
+ return NSS_STATUS_SUCCESS;
}