mirror of
https://github.com/clearml/dropbear
synced 2025-02-11 23:23:30 +00:00
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
This commit is contained in:
parent
7894254afa
commit
dd305c1533
@ -419,7 +419,7 @@ void cli_getopts(int argc, char ** argv) {
|
|||||||
|
|
||||||
/* And now a few sanity checks and setup */
|
/* And now a few sanity checks and setup */
|
||||||
|
|
||||||
#if DROPBEAR_CLI_PROXYCMD
|
#if DROPBEAR_CLI_PROXYCMD
|
||||||
if (cli_opts.proxycmd) {
|
if (cli_opts.proxycmd) {
|
||||||
/* To match the common path of m_freeing it */
|
/* To match the common path of m_freeing it */
|
||||||
cli_opts.proxycmd = m_strdup(cli_opts.proxycmd);
|
cli_opts.proxycmd = m_strdup(cli_opts.proxycmd);
|
||||||
@ -431,14 +431,10 @@ void cli_getopts(int argc, char ** argv) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (bind_arg) {
|
if (bind_arg) {
|
||||||
/* split [host][:port] */
|
if (split_address_port(bind_arg,
|
||||||
char *port = strrchr(bind_arg, ':');
|
&cli_opts.bind_address, &cli_opts.bind_port)
|
||||||
if (port) {
|
== DROPBEAR_FAILURE) {
|
||||||
cli_opts.bind_port = m_strdup(port+1);
|
dropbear_exit("Bad -b argument");
|
||||||
*port = '\0';
|
|
||||||
}
|
|
||||||
if (strlen(bind_arg) > 0) {
|
|
||||||
cli_opts.bind_address = m_strdup(bind_arg);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -116,3 +116,58 @@ void parse_recv_window(const char* recv_window_arg) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Splits addr:port. Handles IPv6 [2001:0011::4]:port style format.
|
||||||
|
Returns first/second parts as malloced strings, second will
|
||||||
|
be NULL if no separator is found.
|
||||||
|
:port -> (NULL, "port")
|
||||||
|
port -> (port, NULL)
|
||||||
|
addr:port (addr, port)
|
||||||
|
addr: -> (addr, "")
|
||||||
|
Returns DROPBEAR_SUCCESS/DROPBEAR_FAILURE */
|
||||||
|
int split_address_port(const char* spec, char **first, char ** second) {
|
||||||
|
char *spec_copy = NULL, *addr = NULL, *colon = NULL;
|
||||||
|
int ret = DROPBEAR_FAILURE;
|
||||||
|
|
||||||
|
*first = NULL;
|
||||||
|
*second = NULL;
|
||||||
|
spec_copy = m_strdup(spec);
|
||||||
|
addr = spec_copy;
|
||||||
|
|
||||||
|
if (*addr == '[') {
|
||||||
|
addr++;
|
||||||
|
colon = strchr(addr, ']');
|
||||||
|
if (!colon) {
|
||||||
|
dropbear_log(LOG_WARNING, "Bad address '%s'", spec);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
*colon = '\0';
|
||||||
|
colon++;
|
||||||
|
if (*colon == '\0') {
|
||||||
|
/* No port part */
|
||||||
|
colon = NULL;
|
||||||
|
} else if (*colon != ':') {
|
||||||
|
dropbear_log(LOG_WARNING, "Bad address '%s'", spec);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* search for ':', that separates address and port */
|
||||||
|
colon = strrchr(addr, ':');
|
||||||
|
}
|
||||||
|
|
||||||
|
/* colon points to ':' now, or is NULL */
|
||||||
|
if (colon) {
|
||||||
|
/* Split the address/port */
|
||||||
|
*colon = '\0';
|
||||||
|
colon++;
|
||||||
|
*second = m_strdup(colon);
|
||||||
|
}
|
||||||
|
if (strlen(addr)) {
|
||||||
|
*first = m_strdup(addr);
|
||||||
|
}
|
||||||
|
ret = DROPBEAR_SUCCESS;
|
||||||
|
|
||||||
|
out:
|
||||||
|
m_free(spec_copy);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
@ -198,5 +198,6 @@ void parse_ciphers_macs(void);
|
|||||||
|
|
||||||
void print_version(void);
|
void print_version(void);
|
||||||
void parse_recv_window(const char* recv_window_arg);
|
void parse_recv_window(const char* recv_window_arg);
|
||||||
|
int split_address_port(const char* spec, char **first, char ** second);
|
||||||
|
|
||||||
#endif /* DROPBEAR_RUNOPTS_H_ */
|
#endif /* DROPBEAR_RUNOPTS_H_ */
|
||||||
|
@ -452,56 +452,34 @@ void svr_getopts(int argc, char ** argv) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void addportandaddress(const char* spec) {
|
static void addportandaddress(const char* spec) {
|
||||||
char *spec_copy = NULL, *myspec = NULL, *port = NULL, *address = NULL;
|
char *port = NULL, *address = NULL;
|
||||||
|
|
||||||
if (svr_opts.portcount < DROPBEAR_MAX_PORTS) {
|
if (svr_opts.portcount >= DROPBEAR_MAX_PORTS) {
|
||||||
|
return;
|
||||||
/* We don't free it, it becomes part of the runopt state */
|
|
||||||
spec_copy = m_strdup(spec);
|
|
||||||
myspec = spec_copy;
|
|
||||||
|
|
||||||
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, ':');
|
|
||||||
}
|
|
||||||
|
|
||||||
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 = 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 (split_address_port(spec, &address, &port) == DROPBEAR_FAILURE) {
|
||||||
|
dropbear_exit("Bad -p argument");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* A bare port */
|
||||||
|
if (!port) {
|
||||||
|
port = address;
|
||||||
|
address = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!address) {
|
||||||
|
/* no address given -> fill in the default address */
|
||||||
|
address = m_strdup(DROPBEAR_DEFADDRESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
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) {
|
static void disablekey(int type) {
|
||||||
|
Loading…
Reference in New Issue
Block a user