--- cifs-utils-5.0.orig/cifs.upcall.c 2011-06-01 20:41:44.000000000 +0100 +++ cifs-utils-5.0/cifs.upcall.c 2011-09-21 15:00:58.000000000 +0100 @@ -327,6 +327,7 @@ static int cifs_krb5_get_req(const char *principal, const char *ccname, DATA_BLOB * mechtoken, DATA_BLOB * sess_key) { + char *qualified_principal; krb5_error_code ret; krb5_keyblock *tokb; krb5_context context; @@ -360,7 +361,44 @@ cifs_krb5_get_req(const char *principal, goto out_free_ccache; } - ret = krb5_parse_name(context, principal, &in_creds.server); + qualified_principal = (char*)principal; + if (!strchr(principal, '@')) { + char **realms, *realm; + + ret = krb5_get_host_realm(context, principal, &realms); + if (ret) { + syslog(LOG_DEBUG, "%s: unable to get host realm (%s).", + __func__, principal); + goto out_free_principal; + } + if (realms && (realm = *realms)) { + int principal_len, realm_len, qualified_len; + + syslog(LOG_DEBUG, "%s: got realm %s for principal %s", + __func__, realm, principal); + principal_len = strlen(principal); + realm_len = strlen(realm); + qualified_len = principal_len + 1 + realm_len + 1; + qualified_principal = calloc(sizeof(char), + qualified_len); + if (!qualified_principal) { + krb5_free_host_realm(context, realms); + goto out_free_principal; + } + strlcpy(qualified_principal, principal, qualified_len); + strlcpy(qualified_principal + principal_len, "@", + qualified_len - principal_len); + strlcpy(qualified_principal + principal_len + 1, realm, + qualified_len - principal_len - 1); + syslog(LOG_DEBUG, "%s: qualified principal is %s", + __func__, qualified_principal); + } + krb5_free_host_realm(context, realms); + } + + ret = krb5_parse_name(context, qualified_principal, &in_creds.server); + if (qualified_principal != principal) + free(qualified_principal); if (ret) { syslog(LOG_DEBUG, "%s: unable to parse principal (%s).", __func__, principal);