diff options
author | Thomas Adam <thomas@xteddy.org> | 2018-01-17 11:26:10 +0000 |
---|---|---|
committer | Thomas Adam <thomas@xteddy.org> | 2018-01-17 11:26:10 +0000 |
commit | 84ddc72744d88f399103ea350c28d5fb45e28b96 (patch) | |
tree | 76a62ad185f8a274f4243a2365fd01801e421b8e /tmux.c | |
parent | 58e9d12f23be4ecc7ab6879e8d19239b430f6553 (diff) | |
parent | 75842bfe66d983580dddf11b676445d5b9fa9f8a (diff) | |
download | rtmux-84ddc72744d88f399103ea350c28d5fb45e28b96.tar.gz rtmux-84ddc72744d88f399103ea350c28d5fb45e28b96.tar.bz2 rtmux-84ddc72744d88f399103ea350c28d5fb45e28b96.zip |
Merge branch 'obsd-master'
Diffstat (limited to 'tmux.c')
-rw-r--r-- | tmux.c | 36 |
1 files changed, 19 insertions, 17 deletions
@@ -44,7 +44,7 @@ int ptm_fd = -1; const char *shell_command; static __dead void usage(void); -static char *make_label(const char *); +static char *make_label(const char *, char **); static const char *getshell(void); static int checkshell(const char *); @@ -106,12 +106,13 @@ areshell(const char *shell) } static char * -make_label(const char *label) +make_label(const char *label, char **cause) { char *base, resolved[PATH_MAX], *path, *s; struct stat sb; uid_t uid; - int saved_errno; + + *cause = NULL; if (label == NULL) label = "default"; @@ -121,11 +122,16 @@ make_label(const char *label) xasprintf(&base, "%s/tmux-%ld", s, (long)uid); else xasprintf(&base, "%s/tmux-%ld", _PATH_TMP, (long)uid); - - if (mkdir(base, S_IRWXU) != 0 && errno != EEXIST) + if (realpath(base, resolved) == NULL && + strlcpy(resolved, base, sizeof resolved) >= sizeof resolved) { + errno = ERANGE; + free(base); goto fail; + } - if (lstat(base, &sb) != 0) + if (mkdir(resolved, S_IRWXU) != 0 && errno != EEXIST) + goto fail; + if (lstat(resolved, &sb) != 0) goto fail; if (!S_ISDIR(sb.st_mode)) { errno = ENOTDIR; @@ -135,18 +141,11 @@ make_label(const char *label) errno = EACCES; goto fail; } - - if (realpath(base, resolved) == NULL) - strlcpy(resolved, base, sizeof resolved); xasprintf(&path, "%s/%s", resolved, label); - - free(base); return (path); fail: - saved_errno = errno; - free(base); - errno = saved_errno; + xasprintf(cause, "error creating %s (%s)", resolved, strerror(errno)); return (NULL); } @@ -188,7 +187,7 @@ find_home(void) int main(int argc, char **argv) { - char *path, *label, **var; + char *path, *label, *cause, **var; char tmp[PATH_MAX]; const char *s, *shell, *cwd; int opt, flags, keys; @@ -341,8 +340,11 @@ main(int argc, char **argv) path[strcspn(path, ",")] = '\0'; } } - if (path == NULL && (path = make_label(label)) == NULL) { - fprintf(stderr, "can't create socket: %s\n", strerror(errno)); + if (path == NULL && (path = make_label(label, &cause)) == NULL) { + if (cause != NULL) { + fprintf(stderr, "%s\n", cause); + free(cause); + } exit(1); } socket_path = path; |