>From 329c53a92228dc54c5ee6f032e0d786bfdf3a25c Mon Sep 17 00:00:00 2001 From: Lukas Slebodnik Date: Fri, 28 Jun 2013 16:06:38 +0200 Subject: [PATCH] Return right directory name for dircache Dircache can be either file or directory. Wrong value was used when dircache was itself directory. https://fedorahosted.org/sssd/ticket/2002 --- src/providers/krb5/krb5_utils.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/providers/krb5/krb5_utils.c b/src/providers/krb5/krb5_utils.c index 1f7ed07452d8814e813692f84423c74c1c8ecb65..395d71b31aab6aa34bcf743e52878d74540abf1f 100644 --- a/src/providers/krb5/krb5_utils.c +++ b/src/providers/krb5/krb5_utils.c @@ -1013,6 +1013,7 @@ cc_dir_check_existing(const char *location, uid_t uid, char *primary_file; errno_t ret; TALLOC_CTX *tmp_ctx; + struct stat file_stat; type = sss_krb5_get_type(location); if (type != SSS_KRB5_TYPE_DIR) { @@ -1046,10 +1047,28 @@ cc_dir_check_existing(const char *location, uid_t uid, goto done; } - dir = dirname(tmp); - if (!dir) { + ret = stat(tmp, &file_stat); + if (ret != 0) { DEBUG(SSSDBG_CRIT_FAILURE, - ("Cannot base get directory of %s\n", location)); + ("Get status of file [%s] failed [%s].\n", tmp, strerror(ret))); + ret = EINVAL; + goto done; + } + + if (S_ISDIR(file_stat.st_mode)) { + dir = tmp; + } else if (S_ISREG(file_stat.st_mode)) { + dir = dirname(tmp); + if (!dir) { + DEBUG(SSSDBG_CRIT_FAILURE, + ("Cannot get base directory of %s.\n", tmp)); + ret = EINVAL; + goto done; + } + } else { + DEBUG(SSSDBG_CRIT_FAILURE, + ("File [%s] has unexpected type [%u].\n", + tmp, file_stat.st_mode)); ret = EINVAL; goto done; } -- 1.8.1.4