101 lines
3 KiB
Diff
101 lines
3 KiB
Diff
diff -Nuar -uar a/src/ck-sysdeps-unix.c b/src/ck-sysdeps-unix.c
|
|
--- a/src/ck-sysdeps-unix.c 2019-03-19 21:50:30.000000000 +1100
|
|
+++ b/src/ck-sysdeps-unix.c 2019-07-19 00:54:37.011751960 +1100
|
|
@@ -403,11 +403,17 @@
|
|
create_rundir_base (guint uid)
|
|
{
|
|
const gchar *base;
|
|
-
|
|
+ struct stat st ;
|
|
TRACE ();
|
|
|
|
base = RUNDIR "/user";
|
|
-
|
|
+
|
|
+ if (stat(base,&st) == -1) {
|
|
+ g_warning ("unable to stat %s, reason was: %s",base,strerror(errno)) ;
|
|
+ errno = 0 ;
|
|
+ return FALSE ;
|
|
+ }
|
|
+ if (S_ISDIR(st.st_mode)) return TRUE ;
|
|
/* Create the base directory that we will own. */
|
|
if (g_mkdir_with_parents (base, S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH) != 0) {
|
|
g_warning ("Failed to create %s, reason was: %s", base, strerror(errno));
|
|
@@ -459,7 +465,7 @@
|
|
{
|
|
gchar *dest;
|
|
struct passwd *pwent;
|
|
-
|
|
+ struct stat st ;
|
|
TRACE ();
|
|
|
|
errno = 0;
|
|
@@ -476,33 +482,41 @@
|
|
}
|
|
|
|
dest = get_rundir (uid);
|
|
-
|
|
- /* Ensure any files from the last session are removed */
|
|
- if (g_file_test (dest, G_FILE_TEST_EXISTS) == TRUE) {
|
|
- remove_rundir (uid, dest);
|
|
- }
|
|
-
|
|
- /* Create the new directory */
|
|
- if (g_mkdir_with_parents (dest, S_IRWXU) != 0) {
|
|
- g_warning ("Failed to create XDG_RUNTIME_DIR, reason was: %s", strerror(errno));
|
|
- errno = 0;
|
|
- g_free (dest);
|
|
- return NULL;
|
|
- }
|
|
-
|
|
- g_debug ("setting uid %d, gid %d", uid, pwent->pw_gid);
|
|
-
|
|
- /* assign ownership to the user */
|
|
- if (chown (dest, uid, pwent->pw_gid) != 0) {
|
|
- g_warning ("Failed to chown XDG_RUNTIME_DIR, reason was: %s", strerror(errno));
|
|
- errno = 0;
|
|
- g_free (dest);
|
|
- return NULL;
|
|
- }
|
|
-
|
|
- /* attempt to make it a small tmpfs location */
|
|
- ck_make_tmpfs (uid, pwent->pw_gid, dest);
|
|
-
|
|
+ if (stat(dest,&st) == -1) {
|
|
+ g_warning ("unable to stat %s, reason was: %s",dest,strerror(errno)) ;
|
|
+ errno = 0 ;
|
|
+ return NULL ;
|
|
+ }
|
|
+ /** if administrator have already set rundir, we
|
|
+ * trust him */
|
|
+ if (!S_ISDIR(st.st_mode)) {
|
|
+ /* Ensure any files from the last session are removed */
|
|
+ if (g_file_test (dest, G_FILE_TEST_EXISTS) == TRUE) {
|
|
+ remove_rundir (uid, dest);
|
|
+ }
|
|
+
|
|
+ /* Create the new directory */
|
|
+ if (g_mkdir_with_parents (dest, S_IRWXU) != 0) {
|
|
+ g_warning ("Failed to create XDG_RUNTIME_DIR, reason was: %s", strerror(errno));
|
|
+ errno = 0;
|
|
+ g_free (dest);
|
|
+ return NULL;
|
|
+ }
|
|
+
|
|
+ g_debug ("setting uid %d, gid %d", uid, pwent->pw_gid);
|
|
+
|
|
+ /* assign ownership to the user */
|
|
+ if (chown (dest, uid, pwent->pw_gid) != 0) {
|
|
+ g_warning ("Failed to chown XDG_RUNTIME_DIR, reason was: %s", strerror(errno));
|
|
+ errno = 0;
|
|
+ g_free (dest);
|
|
+ return NULL;
|
|
+ }
|
|
+
|
|
+ /* attempt to make it a small tmpfs location */
|
|
+ ck_make_tmpfs (uid, pwent->pw_gid, dest);
|
|
+ }
|
|
+
|
|
return dest;
|
|
}
|
|
|