Mercurial > dropbear
diff svr-runopts.c @ 1936:4528afefe45d
Fix IPv6 address parsing for dbclient -b
Now can correctly handle '-b [ipv6address]:port'
Code is shared with dropbear -p, though they handle colon-less arguments
differently
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Fri, 01 Apr 2022 14:13:52 +0800 |
parents | 284c3837891c |
children |
line wrap: on
line diff
--- a/svr-runopts.c Fri Apr 01 12:17:02 2022 +0800 +++ b/svr-runopts.c Fri Apr 01 14:13:52 2022 +0800 @@ -452,56 +452,34 @@ } static void addportandaddress(const char* spec) { - char *spec_copy = NULL, *myspec = NULL, *port = NULL, *address = NULL; - - if (svr_opts.portcount < DROPBEAR_MAX_PORTS) { + char *port = NULL, *address = NULL; - /* We don't free it, it becomes part of the runopt state */ - spec_copy = m_strdup(spec); - myspec = spec_copy; + if (svr_opts.portcount >= DROPBEAR_MAX_PORTS) { + return; + } + + if (split_address_port(spec, &address, &port) == DROPBEAR_FAILURE) { + dropbear_exit("Bad -p argument"); + } - if (myspec[0] == '[') { - myspec++; - port = strchr(myspec, ']'); - if (!port) { - /* Unmatched [ -> exit */ - dropbear_exit("Bad listen address"); - } - port[0] = '\0'; - port++; - if (port[0] != ':') { - /* Missing port -> exit */ - dropbear_exit("Missing port"); - } - } else { - /* search for ':', that separates address and port */ - port = strrchr(myspec, ':'); - } + /* A bare port */ + if (!port) { + port = address; + address = NULL; + } - if (!port) { - /* no ':' -> the whole string specifies just a port */ - port = myspec; - } else { - /* Split the address/port */ - port[0] = '\0'; - port++; - address = myspec; - } + if (!address) { + /* no address given -> fill in the default address */ + address = m_strdup(DROPBEAR_DEFADDRESS); + } - if (!address) { - /* no address given -> fill in the default address */ - address = DROPBEAR_DEFADDRESS; - } - - if (port[0] == '\0') { - /* empty port -> exit */ - dropbear_exit("Bad port"); - } - svr_opts.ports[svr_opts.portcount] = m_strdup(port); - svr_opts.addresses[svr_opts.portcount] = m_strdup(address); - svr_opts.portcount++; - m_free(spec_copy); + if (port[0] == '\0') { + /* empty port -> exit */ + dropbear_exit("Bad port"); } + svr_opts.ports[svr_opts.portcount] = port; + svr_opts.addresses[svr_opts.portcount] = address; + svr_opts.portcount++; } static void disablekey(int type) {