summaryrefslogtreecommitdiffstats
path: root/tmux.c
diff options
context:
space:
mode:
authorThomas Adam <thomas@xteddy.org>2018-01-17 11:26:10 +0000
committerThomas Adam <thomas@xteddy.org>2018-01-17 11:26:10 +0000
commit84ddc72744d88f399103ea350c28d5fb45e28b96 (patch)
tree76a62ad185f8a274f4243a2365fd01801e421b8e /tmux.c
parent58e9d12f23be4ecc7ab6879e8d19239b430f6553 (diff)
parent75842bfe66d983580dddf11b676445d5b9fa9f8a (diff)
Merge branch 'obsd-master'
Diffstat (limited to 'tmux.c')
-rw-r--r--tmux.c36
1 files changed, 19 insertions, 17 deletions
diff --git a/tmux.c b/tmux.c
index 818da3b0..5b73079e 100644
--- a/tmux.c
+++ b/tmux.c
@@ -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;