Bugzilla – Attachment 2609 Details for
Bug 86
Port should not depend on ListenAddress
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
sshd: Allow ListenAddress, Port, AddressFamily in any order
sshd-listenaddress-order.patch (text/plain), 5.20 KB, created by
Darren Tucker
on 2015-04-27 10:10:12 AEST
(
hide
)
Description:
sshd: Allow ListenAddress, Port, AddressFamily in any order
Filename:
MIME Type:
Creator:
Darren Tucker
Created:
2015-04-27 10:10:12 AEST
Size:
5.20 KB
patch
obsolete
>Index: servconf.c >=================================================================== >RCS file: /cvs/src/usr.bin/ssh/servconf.c,v >retrieving revision 1.264 >diff -u -p -r1.264 servconf.c >--- servconf.c 24 Apr 2015 01:36:00 -0000 1.264 >+++ servconf.c 26 Apr 2015 23:24:13 -0000 >@@ -68,6 +68,8 @@ initialize_server_options(ServerOptions > memset(options, 0, sizeof(*options)); > options->num_ports = 0; > options->ports_from_cmdline = 0; >+ options->queued_listen_addrs = NULL; >+ options->num_queued_listens = 0; > options->listen_addrs = NULL; > options->address_family = -1; > options->num_host_key_files = 0; >@@ -188,6 +190,8 @@ fill_default_server_options(ServerOption > /* No certificates by default */ > if (options->num_ports == 0) > options->ports[options->num_ports++] = SSH_DEFAULT_PORT; >+ if (options->address_family == -1) >+ options->address_family = AF_UNSPEC; > if (options->listen_addrs == NULL) > add_listen_addr(options, NULL, 0); > if (options->pid_file == NULL) >@@ -549,10 +553,6 @@ add_listen_addr(ServerOptions *options, > { > u_int i; > >- if (options->num_ports == 0) >- options->ports[options->num_ports++] = SSH_DEFAULT_PORT; >- if (options->address_family == -1) >- options->address_family = AF_UNSPEC; > if (port == 0) > for (i = 0; i < options->num_ports; i++) > add_one_listen_addr(options, addr, options->ports[i]); >@@ -582,6 +582,51 @@ add_one_listen_addr(ServerOptions *optio > options->listen_addrs = aitop; > } > >+/* >+ * Queue a ListenAddress to be processed once we have all of the Ports >+ * and AddressFamily options. >+ */ >+static void >+queue_listen_addr(ServerOptions *options, char *addr, int port) >+{ >+ options->queued_listen_addrs = xreallocarray( >+ options->queued_listen_addrs, options->num_queued_listens + 1, >+ sizeof(addr)); >+ options->queued_listen_ports = xreallocarray( >+ options->queued_listen_ports, options->num_queued_listens + 1, >+ sizeof(port)); >+ options->queued_listen_addrs[options->num_queued_listens] = >+ xstrdup(addr); >+ options->queued_listen_ports[options->num_queued_listens] = port; >+ options->num_queued_listens++; >+} >+ >+/* >+ * Process queued (text) ListenAddress entries. >+ */ >+static void >+process_queued_listen_addrs(ServerOptions *options) >+{ >+ u_int i; >+ >+ if (options->num_ports == 0) >+ options->ports[options->num_ports++] = SSH_DEFAULT_PORT; >+ if (options->address_family == -1) >+ options->address_family = AF_UNSPEC; >+ >+ for (i = 0; i < options->num_queued_listens; i++) { >+ add_listen_addr(options, options->queued_listen_addrs[i], >+ options->queued_listen_ports[i]); >+ free(options->queued_listen_addrs[i]); >+ options->queued_listen_addrs[i] = NULL; >+ } >+ free(options->queued_listen_addrs); >+ options->queued_listen_addrs = NULL; >+ free(options->queued_listen_ports); >+ options->queued_listen_ports = NULL; >+ options->num_queued_listens = 0; >+} >+ > struct connection_info * > get_connection_info(int populate, int use_dns) > { >@@ -892,9 +937,6 @@ process_server_config_line(ServerOptions > /* ignore ports from configfile if cmdline specifies ports */ > if (options->ports_from_cmdline) > return 0; >- if (options->listen_addrs != NULL) >- fatal("%s line %d: ports must be specified before " >- "ListenAddress.", filename, linenum); > if (options->num_ports >= MAX_PORTS) > fatal("%s line %d: too many ports.", > filename, linenum); >@@ -946,7 +988,7 @@ process_server_config_line(ServerOptions > /* check for bare IPv6 address: no "[]" and 2 or more ":" */ > if (strchr(arg, '[') == NULL && (p = strchr(arg, ':')) != NULL > && strchr(p+1, ':') != NULL) { >- add_listen_addr(options, arg, 0); >+ queue_listen_addr(options, arg, 0); > break; > } > p = hpdelim(&arg); >@@ -959,16 +1001,13 @@ process_server_config_line(ServerOptions > else if ((port = a2port(arg)) <= 0) > fatal("%s line %d: bad port number", filename, linenum); > >- add_listen_addr(options, p, port); >+ queue_listen_addr(options, p, port); > > break; > > case sAddressFamily: > intptr = &options->address_family; > multistate_ptr = multistate_addressfamily; >- if (options->listen_addrs != NULL) >- fatal("%s line %d: address family must be specified " >- "before ListenAddress.", filename, linenum); > parse_multistate: > arg = strdelim(&cp); > if (!arg || *arg == '\0') >@@ -1903,6 +1942,7 @@ parse_server_config(ServerOptions *optio > if (bad_options > 0) > fatal("%s: terminating, %d bad configuration options", > filename, bad_options); >+ process_queued_listen_addrs(options); > } > > static const char * >Index: servconf.h >=================================================================== >RCS file: /cvs/src/usr.bin/ssh/servconf.h,v >retrieving revision 1.116 >diff -u -p -r1.116 servconf.h >--- servconf.h 13 Jan 2015 07:39:19 -0000 1.116 >+++ servconf.h 26 Apr 2015 23:24:13 -0000 >@@ -58,7 +58,9 @@ typedef struct { > u_int num_ports; > u_int ports_from_cmdline; > int ports[MAX_PORTS]; /* Port number to listen on. */ >- char *listen_addr; /* Address on which the server listens. */ >+ u_int num_queued_listens; >+ char **queued_listen_addrs; >+ int *queued_listen_ports; > struct addrinfo *listen_addrs; /* Addresses on which the server listens. */ > int address_family; /* Address family used by the server. */ > char *host_key_files[MAX_HOSTKEYS]; /* Files containing host keys. */
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Flags:
djm
:
ok+
Actions:
View
|
Diff
Attachments on
bug 86
: 2609