summaryrefslogtreecommitdiff
path: root/mux.c
diff options
context:
space:
mode:
authordjm <djm>2011-05-14 22:34:46 +0000
committerdjm <djm>2011-05-14 22:34:46 +0000
commit4274bb2734fee4385ed10785b73a54b9eded2162 (patch)
tree4bede0125a614ab1b2d1c2c7a3e33c2432ec8958 /mux.c
parent2d032d9399781b879eedce1abc68c5c69d0a51fb (diff)
downloadopenssh-4274bb2734fee4385ed10785b73a54b9eded2162.tar.gz
- djm@cvs.openbsd.org 2011/05/05 05:12:08
[mux.c] gracefully fall back when ControlPath is too large for a sockaddr_un. ok markus@ as part of a larger diff
Diffstat (limited to 'mux.c')
-rw-r--r--mux.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/mux.c b/mux.c
index 09468359..fb24c0f9 100644
--- a/mux.c
+++ b/mux.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mux.c,v 1.25 2011/04/17 22:42:41 djm Exp $ */
+/* $OpenBSD: mux.c,v 1.26 2011/05/05 05:12:08 djm Exp $ */
/*
* Copyright (c) 2002-2008 Damien Miller <djm@openbsd.org>
*
@@ -1095,21 +1095,25 @@ muxserver_listen(void)
strlen(options.control_path) + 1;
if (strlcpy(addr.sun_path, options.control_path,
- sizeof(addr.sun_path)) >= sizeof(addr.sun_path))
- fatal("ControlPath too long");
+ sizeof(addr.sun_path)) >= sizeof(addr.sun_path)) {
+ error("ControlPath \"%s\" too long for Unix domain socket",
+ options.control_path);
+ goto disable_mux_master;
+ }
if ((muxserver_sock = socket(PF_UNIX, SOCK_STREAM, 0)) < 0)
fatal("%s socket(): %s", __func__, strerror(errno));
old_umask = umask(0177);
if (bind(muxserver_sock, (struct sockaddr *)&addr, sun_len) == -1) {
- muxserver_sock = -1;
if (errno == EINVAL || errno == EADDRINUSE) {
error("ControlSocket %s already exists, "
"disabling multiplexing", options.control_path);
disable_mux_master:
- close(muxserver_sock);
- muxserver_sock = -1;
+ if (muxserver_sock != -1) {
+ close(muxserver_sock);
+ muxserver_sock = -1;
+ }
xfree(options.control_path);
options.control_path = NULL;
options.control_master = SSHCTL_MASTER_NO;