Updates parsing of the -p option to handle [2001:dba::]:22 style IPv6 addresses. This allows binding to specific IPv6 addresses, rather than having to bind to all addresses in order to get any IPv6 support. For example, you can now listen on IPv6 only with -p [::]:22.
This has been done before at [1], but I thought that patch was kind of ugly so I wrote my own. Please CC me on responses as I'm not subscribed to the list. [1] https://lists.openwrt.org/pipermail/openwrt-devel/2009-May/004299.html diff -ur dropbear-2012.55.orig/svr-runopts.c dropbear-2012.55/svr-runopts.c --- dropbear-2012.55.orig/svr-runopts.c 2012-02-23 08:47:06.000000000 -0500 +++ dropbear-2012.55/svr-runopts.c 2012-12-10 23:17:28.496729985 -0500 @@ -324,8 +324,23 @@ /* We don't free it, it becomes part of the runopt state */ myspec = m_strdup(spec); - /* search for ':', that separates address and port */ - svr_opts.ports[svr_opts.portcount] = strchr(myspec, ':'); + if (myspec[0] == '[') { + myspec++; + svr_opts.ports[svr_opts.portcount] = strchr(myspec, ']'); + if (svr_opts.ports[svr_opts.portcount] == NULL) { + /* Unmatched [ -> exit */ + dropbear_exit("Bad listen address"); + } + svr_opts.ports[svr_opts.portcount][0] = '\0'; + svr_opts.ports[svr_opts.portcount]++; + if (svr_opts.ports[svr_opts.portcount][0] != ':') { + /* Missing port -> exit */ + dropbear_exit("Missing port"); + } + } else { + /* search for ':', that separates address and port */ + svr_opts.ports[svr_opts.portcount] = strchr(myspec, ':'); + } if (svr_opts.ports[svr_opts.portcount] == NULL) { /* no ':' -> the whole string specifies just a port */
