iCheck $HOME and home dir of $USER before getpwuid()->pw_dir - surf - Surf web browser. Err gopher.r-36.net 70 i Err gopher.r-36.net 70 1Log /scm/surf//log.gph gopher.r-36.net 70 1Files /scm/surf//files.gph gopher.r-36.net 70 1Refs /scm/surf//refs.gph gopher.r-36.net 70 1README /scm/surf//file/README.gph gopher.r-36.net 70 1LICENSE /scm/surf//file/LICENSE.gph gopher.r-36.net 70 i--- Err gopher.r-36.net 70 1commit 1308872b8bd7a2516d0626955abe391af076e711 /scm/surf//commit/1308872b8bd7a2516d0626955abe391af076e711.gph gopher.r-36.net 70 1parent f5e8baad06eafef22df12ab2649139260127d4e4 /scm/surf//commit/f5e8baad06eafef22df12ab2649139260127d4e4.gph gopher.r-36.net 70 hAuthor: Dmitry Bogatov URL:mailto:KAction@gnu.org gopher.r-36.net 70 iDate: Sun, 29 May 2016 11:56:51 +0200 Err gopher.r-36.net 70 i Err gopher.r-36.net 70 iCheck $HOME and home dir of $USER before getpwuid()->pw_dir Err gopher.r-36.net 70 i Err gopher.r-36.net 70 igetpwnam(3) recommends to use $HOME instead of getpwuid()->pw_dir, Err gopher.r-36.net 70 ias it allows users to point programs to a different path. Err gopher.r-36.net 70 i Err gopher.r-36.net 70 iUsing getpwuid() also breaks namespaces-related use cases, Err gopher.r-36.net 70 ilike `unshare -r`. Err gopher.r-36.net 70 i Err gopher.r-36.net 70 iPatch was submitted by Dmitry Bogatov on the Debian bug tracker: Err gopher.r-36.net 70 ihttps://bugs.debian.org/825397 Err gopher.r-36.net 70 i Err gopher.r-36.net 70 iSigned-off-by: Christoph Lohmann <20h@r-36.net> Err gopher.r-36.net 70 i Err gopher.r-36.net 70 iDiffstat: Err gopher.r-36.net 70 i surf.c | 43 ++++++++++++++++++++++++++----- Err gopher.r-36.net 70 i Err gopher.r-36.net 70 i1 file changed, 36 insertions(+), 7 deletions(-) Err gopher.r-36.net 70 i--- Err gopher.r-36.net 70 1diff --git a/surf.c b/surf.c /scm/surf//file/surf.c.gph gopher.r-36.net 70 i@@ -287,29 +287,58 @@ buildfile(const char *path) Err gopher.r-36.net 70 i return fpath; Err gopher.r-36.net 70 i } Err gopher.r-36.net 70 i Err gopher.r-36.net 70 i+static const char* Err gopher.r-36.net 70 i+get_user_homedir(const char *user) { Err gopher.r-36.net 70 i+ struct passwd *pw = getpwnam(user); Err gopher.r-36.net 70 i+ if (!pw) { Err gopher.r-36.net 70 i+ die("Can't get user `%s' home directory.\n", user); Err gopher.r-36.net 70 i+ } Err gopher.r-36.net 70 i+ return pw->pw_dir; Err gopher.r-36.net 70 i+} Err gopher.r-36.net 70 i+ Err gopher.r-36.net 70 i+static const char* Err gopher.r-36.net 70 i+get_current_user_homedir() { Err gopher.r-36.net 70 i+ const char *homedir; Err gopher.r-36.net 70 i+ const char *user; Err gopher.r-36.net 70 i+ struct passwd *pw; Err gopher.r-36.net 70 i+ Err gopher.r-36.net 70 i+ homedir = getenv("HOME"); Err gopher.r-36.net 70 i+ if (homedir) { Err gopher.r-36.net 70 i+ return homedir; Err gopher.r-36.net 70 i+ } Err gopher.r-36.net 70 i+ Err gopher.r-36.net 70 i+ user = getenv("USER"); Err gopher.r-36.net 70 i+ if (user) { Err gopher.r-36.net 70 i+ return get_user_homedir(user); Err gopher.r-36.net 70 i+ } Err gopher.r-36.net 70 i+ Err gopher.r-36.net 70 i+ pw = getpwuid(getuid()); Err gopher.r-36.net 70 i+ if (!pw) { Err gopher.r-36.net 70 i+ die("Can't get current user home directory\n"); Err gopher.r-36.net 70 i+ } Err gopher.r-36.net 70 i+ return pw->pw_dir; Err gopher.r-36.net 70 i+} Err gopher.r-36.net 70 i+ Err gopher.r-36.net 70 i char * Err gopher.r-36.net 70 i buildpath(const char *path) Err gopher.r-36.net 70 i { Err gopher.r-36.net 70 i- struct passwd *pw; Err gopher.r-36.net 70 i char *apath, *name, *p, *fpath; Err gopher.r-36.net 70 i Err gopher.r-36.net 70 i if (path[0] == '~') { Err gopher.r-36.net 70 i+ const char *homedir; Err gopher.r-36.net 70 i if (path[1] == '/' || path[1] == '\0') { Err gopher.r-36.net 70 i p = (char *)&path[1]; Err gopher.r-36.net 70 i- pw = getpwuid(getuid()); Err gopher.r-36.net 70 i+ homedir = get_current_user_homedir(); Err gopher.r-36.net 70 i } else { Err gopher.r-36.net 70 i if ((p = strchr(path, '/'))) Err gopher.r-36.net 70 i name = g_strndup(&path[1], --p - path); Err gopher.r-36.net 70 i else Err gopher.r-36.net 70 i name = g_strdup(&path[1]); Err gopher.r-36.net 70 i Err gopher.r-36.net 70 i- if (!(pw = getpwnam(name))) { Err gopher.r-36.net 70 i- die("Can't get user %s home directory: %s.\n", Err gopher.r-36.net 70 i- name, path); Err gopher.r-36.net 70 i- } Err gopher.r-36.net 70 i+ homedir = get_user_homedir(name); Err gopher.r-36.net 70 i g_free(name); Err gopher.r-36.net 70 i } Err gopher.r-36.net 70 i- apath = g_build_filename(pw->pw_dir, p, NULL); Err gopher.r-36.net 70 i+ apath = g_build_filename(homedir, p, NULL); Err gopher.r-36.net 70 i } else { Err gopher.r-36.net 70 i apath = g_strdup(path); Err gopher.r-36.net 70 i } Err gopher.r-36.net 70 .