summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTheodore Tso <tytso@mit.edu>1993-12-24 22:37:22 +0000
committerTheodore Tso <tytso@mit.edu>1993-12-24 22:37:22 +0000
commitb83896146ae33bb910d601fab312043fe23616e8 (patch)
tree9fecd8ff1d6874c4da17e697dc668854eb35421d
parent1f1e7c1b3aa6242c3176a82623e67c5ce28f1d1d (diff)
downloadkrb5-b83896146ae33bb910d601fab312043fe23616e8.tar.gz
krb5-b83896146ae33bb910d601fab312043fe23616e8.tar.xz
krb5-b83896146ae33bb910d601fab312043fe23616e8.zip
Free all memory on errors
If the hostname passed in is NULL, use the default local realm. git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@3270 dc483132-0cff-0310-8789-dd5450dbe970
-rw-r--r--src/lib/krb5/os/sn2princ.c40
1 files changed, 25 insertions, 15 deletions
diff --git a/src/lib/krb5/os/sn2princ.c b/src/lib/krb5/os/sn2princ.c
index 9edede3b9..3dc491c1b 100644
--- a/src/lib/krb5/os/sn2princ.c
+++ b/src/lib/krb5/os/sn2princ.c
@@ -49,17 +49,18 @@ OLDDECLARG(krb5_int32,type)
OLDDECLARG(krb5_principal *,ret_princ)
{
struct hostent *hp;
- char **hrealms, *remote_host;
+ char **hrealms, *realm, *remote_host;
krb5_error_code retval;
register char *cp;
char localname[MAXHOSTNAMELEN];
+ int use_local_realm = 0;
if ((type == KRB5_NT_UNKNOWN) ||
(type == KRB5_NT_SRV_HST)) {
- /* convenience hack: if hostname is NULL, use gethostbyname() */
-
- if (! hostname) {
+ if (!hostname) {
+ use_local_realm = 1;
+ /* convenience hack: if hostname is NULL, use gethostname() */
if (gethostname(localname, MAXHOSTNAMELEN))
return errno;
hostname = localname;
@@ -88,24 +89,33 @@ OLDDECLARG(krb5_principal *,ret_princ)
if (isupper(*cp))
*cp = tolower(*cp);
- if (retval = krb5_get_host_realm(remote_host, &hrealms)) {
- free(remote_host);
- return retval;
- }
- if (!hrealms[0]) {
- free(remote_host);
- krb5_xfree(hrealms);
- return KRB5_ERR_HOST_REALM_UNKNOWN;
+ if (use_local_realm) {
+ if (retval = krb5_get_default_realm(&realm)) {
+ free(remote_host);
+ return retval;
+ }
+ } else {
+ if (retval = krb5_get_host_realm(remote_host, &hrealms)) {
+ free(remote_host);
+ return retval;
+ }
+ if (!hrealms[0]) {
+ free(remote_host);
+ krb5_xfree(hrealms);
+ return KRB5_ERR_HOST_REALM_UNKNOWN;
+ }
+ realm = hrealms[0];
}
- retval = krb5_build_principal(ret_princ, strlen(hrealms[0]),
- hrealms[0], sname, remote_host,
+ retval = krb5_build_principal(ret_princ, strlen(realm),
+ realm, sname, remote_host,
(char *)0);
krb5_princ_type(*ret_princ) = type;
free(remote_host);
- krb5_free_host_realm(hrealms);
+ if (!use_local_realm)
+ krb5_free_host_realm(hrealms);
return retval;
} else {
return KRB5_SNAME_UNSUPP_NAMETYPE;