Hi. Thanks for the patch (sorry for the slow response to other mail) - I'll test it out and apply for the next release.
Cheers, Matt On Thu, May 21, 2009 at 11:08:14AM +0200, [email protected] wrote: > Hello, > > With -p dropbear can listenning on [addresse:port], but it fail with > ipv6 addresses. This patch try to handle ipv4, ipv6, ipv4:port and > ipv6+port. > > The syntaxe [ipv6]:port come from openssh. > > Work fine with dropbear 0.52 on FreeBSD 7.2 and openwrt 8.09. > > --- dropbear-0.52.orig/svr-runopts.c Wed May 13 20:56:03 2009 > +++ dropbear-0.52/svr-runopts.c Wed May 13 22:20:22 2009 > @@ -311,27 +311,39 @@ > static void addportandaddress(char* spec) { > > char *myspec = NULL; > + char *p = NULL; > > if (svr_opts.portcount < DROPBEAR_MAX_PORTS) { > > /* 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 (svr_opts.ports[svr_opts.portcount] == NULL) { > - /* no ':' -> the whole string specifies just a port */ > - svr_opts.ports[svr_opts.portcount] = myspec; > - } else { > - /* Split the address/port */ > - svr_opts.ports[svr_opts.portcount][0] = '\0'; > - svr_opts.ports[svr_opts.portcount]++; > + /* [ipv6]:port */ > + if (myspec[0] == '[' && (p = strchr(myspec, ']')) != NULL && > *(p+1) == ':') { > + *p = '\0'; > + p+=2; > + myspec++; > + svr_opts.ports[svr_opts.portcount] = p; > svr_opts.addresses[svr_opts.portcount] = myspec; > - } > - > - if (svr_opts.addresses[svr_opts.portcount] == NULL) { > - /* no address given -> fill in the default address */ > + } else if ((p = strchr(myspec, '.')) != NULL) { > + if ((p = strchr(p, ':')) == NULL) { > + /* ipv4 */ > + svr_opts.ports[svr_opts.portcount] = > m_strdup(DROPBEAR_DEFPORT); > + svr_opts.addresses[svr_opts.portcount] = myspec; > + } else { > + /* ipv4:port */ > + *p = '\0'; > + p++; > + svr_opts.ports[svr_opts.portcount] = p; > + svr_opts.addresses[svr_opts.portcount] = myspec; > + } > + } else if ((p = strchr(myspec, ':')) != NULL && (p = strchr(p, > ':')) != NULL) { > + /* ipv6 */ > + svr_opts.ports[svr_opts.portcount] = > m_strdup(DROPBEAR_DEFPORT); > + svr_opts.addresses[svr_opts.portcount] = myspec; > + } else { > + /* port */ > + svr_opts.ports[svr_opts.portcount] = myspec; > svr_opts.addresses[svr_opts.portcount] = > m_strdup(DROPBEAR_DEFADDRESS); > } > > -- > Freddy DISSAUX <[email protected]> >
