- related to trac#927
Signed-off-by: Jakub Filak <[email protected]>
---
src/include/dump_dir.h | 4 ++++
src/lib/dump_dir.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 55 insertions(+)
diff --git a/src/include/dump_dir.h b/src/include/dump_dir.h
index 0a6a1b0..21169c8 100644
--- a/src/include/dump_dir.h
+++ b/src/include/dump_dir.h
@@ -114,6 +114,10 @@ report_result_t *find_in_reported_to(struct dump_dir *dd,
const char *prefix);
void delete_dump_dir(const char *dirname);
+/* Checks dump dir accessibility for particular uid
+ * Returns non zero if dump dir is accessible otherwise return 0 value.
+ */
+int dump_dir_accessible_by_uid(const char *dirname, uid_t uid);
#ifdef __cplusplus
}
diff --git a/src/lib/dump_dir.c b/src/lib/dump_dir.c
index e7e6e33..981f5e6 100644
--- a/src/lib/dump_dir.c
+++ b/src/lib/dump_dir.c
@@ -1152,3 +1152,54 @@ void delete_dump_dir(const char *dirname)
dd_delete(dd);
}
}
+
+#if DUMP_DIR_OWNED_BY_USER == 0
+static bool uid_in_group(uid_t uid, gid_t gid)
+{
+ char **tmp;
+ struct passwd *pwd = getpwuid(uid);
+
+ if (!pwd)
+ return FALSE;
+
+ if (pwd->pw_gid == gid)
+ return TRUE;
+
+ struct group *grp = getgrgid(gid);
+ if (!(grp && grp->gr_mem))
+ return FALSE;
+
+ for (tmp = grp->gr_mem; *tmp != NULL; tmp++)
+ {
+ if (g_strcmp0(*tmp, pwd->pw_name) == 0)
+ {
+ VERB3 log("user %s belongs to group: %s", pwd->pw_name,
grp->gr_name);
+ return TRUE;
+ }
+ }
+
+ VERB2 log("user %s DOESN'T belong to group: %s", pwd->pw_name,
grp->gr_name);
+ return FALSE;
+}
+#endif
+
+int dump_dir_accessible_by_uid(const char *dirname, uid_t uid)
+{
+ struct stat statbuf;
+ if (stat(dirname, &statbuf) != 0 || !S_ISDIR(statbuf.st_mode))
+ errno = ENOTDIR;
+ else
+ {
+#if DUMP_DIR_OWNED_BY_USER > 0
+ if (uid == 0 || (statbuf.st_mode & S_IROTH) || uid == statbuf.st_uid)
+#else
+ if (uid == 0 || (statbuf.st_mode & S_IROTH) || uid_in_group(uid,
statbuf.st_gid))
+#endif
+ {
+ VERB1 log("directory '%s' is accessible by %ld uid", dirname,
(long)uid);
+ return 1;
+ }
+ }
+
+ return 0;
+}
--
1.7.11.7