# HG changeset patch # Parent 4c0dc18eca2a006fc6e67502dde991bac2c8606c check for symlinks and hardlinks before chown'ing .Xauthority files diff --git a/src/xsession.c b/src/xsession.c --- a/src/xsession.c +++ b/src/xsession.c @@ -107,10 +107,31 @@ xsession_setup (Session *session) * incorrectly written as root in a buggy version of LightDM */ if (getuid () == 0) { - int result; - result = lchown (path, user_get_uid (session_get_user (session)), user_get_gid (session_get_user (session))); - if (result < 0 && errno != ENOENT) - g_warning ("Failed to correct ownership of %s: %s", path, strerror (errno)); + int fd = -1; + struct stat st_buf1; + struct stat st_buf2; + + if (lstat (path, &st_buf1) != 0) + goto out; + + if (!S_ISREG (st_buf1.st_mode)) + goto out; + + fd = open (path, O_RDONLY); + if (fd == -1) + goto out; + + if (fstat (fd, &st_buf2) != 0) + goto out; + + if (st_buf2.st_ino != st_buf1.st_ino || st_buf2.st_dev != st_buf1.st_dev || st_buf2.st_nlink > 1) + goto out; + + fchown (fd, user_get_uid (session_get_user (session)), user_get_gid (session_get_user (session))); + +out: + if (fd > 0) + close(fd); } }