[PATCH] Enable bundling in svr-runopts's svr_getopts.

Matt Johnston matt at ucc.asn.au
Sat Nov 7 00:03:14 AWST 2015


Hi Guilhem,

Thanks for the patch, it looks good. I've committed it with one small change (otherwise "dropbear -p" would segfault). I'll do the same for client unless you want to.

Cheers,
Matt

> On Fri 30/10/2015, at 4:41 am, Guilhem Moulin <guilhem at fripost.org> wrote:
> 
> On Wed, 28 Oct 2015 at 21:47:24 +0800, Matt Johnston wrote:
>> I've changed the code to just print a warning for the time being. I'm
>> intending for the next release to be soon with small bugfixes. Using getopt
>> would probably be good though would require checking availability for the
>> platforms where Dropbear is used.
> 
> In fact the current code can easily be tweaked to enable bundling.
> (I've only touched svr-runopts for now; will proceed with cli-runopts if
> you're fine with that patch.)  Refactoring the code to use getopt is
> actually cumpersome due to the #ifdef changing the option string.
> 
>> By backwards compatibility I just meant the issue where the behaviour would
>> change slightly.
> 
> ---
> svr-runopts.c | 59 +++++++++++++++++++++++++++++++----------------------------
> 1 file changed, 31 insertions(+), 28 deletions(-)
> 
> diff --git a/svr-runopts.c b/svr-runopts.c
> index 26c199b..ec29883 100644
> --- a/svr-runopts.c
> +++ b/svr-runopts.c
> @@ -112,13 +112,14 @@ static void printhelp(const char * progname) {
> 
> void svr_getopts(int argc, char ** argv) {
> 
> -	unsigned int i;
> +	unsigned int i, j;
> 	char ** next = 0;
> 	int nextisport = 0;
> 	char* recv_window_arg = NULL;
> 	char* keepalive_arg = NULL;
> 	char* idle_timeout_arg = NULL;
> 	char* keyfile = NULL;
> +	char c;
> 
> 
> 	/* see printhelp() for options */
> @@ -168,33 +169,10 @@ void svr_getopts(int argc, char ** argv) {
> #endif
> 
> 	for (i = 1; i < (unsigned int)argc; i++) {
> -		if (nextisport) {
> -			addportandaddress(argv[i]);
> -			nextisport = 0;
> -			continue;
> -		}
> -	  
> -		if (next) {
> -			*next = argv[i];
> -			if (*next == NULL) {
> -				dropbear_exit("Invalid null argument");
> -			}
> -			next = 0x00;
> +		if (argv[i][0] != '-' || argv[i][1] == '\0')
> +			dropbear_exit("Invalid argument: %s", argv[i]);
> 
> -			if (keyfile) {
> -				addhostkey(keyfile);
> -				keyfile = NULL;
> -			}
> -			continue;
> -		}
> -
> -		if (argv[i][0] == '-') {
> -			char c = argv[i][1];
> -			if (strlen(argv[i]) != 2) {
> -				/* We only handle one flag per hyphen */
> -				fprintf(stderr, "Warning, trailing '%s' of '%s' is ignored.\n",
> -					&argv[i][2], argv[i]);
> -			}
> +		for (j = 1; (c = argv[i][j]) != '\0' && !next && !nextisport; j++) {
> 			switch (c) {
> 				case 'b':
> 					next = &svr_opts.bannerfile;
> @@ -284,12 +262,37 @@ void svr_getopts(int argc, char ** argv) {
> 					exit(EXIT_SUCCESS);
> 					break;
> 				default:
> -					fprintf(stderr, "Unknown argument %s\n", argv[i]);
> +					fprintf(stderr, "Invalid option -%c\n", c);
> 					printhelp(argv[0]);
> 					exit(EXIT_FAILURE);
> 					break;
> 			}
> 		}
> +
> +		if (!next && !nextisport)
> +			continue;
> +
> +		if (c == '\0') {
> +			i++;
> +			j = 0;
> +		}
> +
> +		if (nextisport) {
> +			addportandaddress(&argv[i][j]);
> +			nextisport = 0;
> +		}
> +		else if (next) {
> +			*next = &argv[i][j];
> +			if (*next == NULL) {
> +				dropbear_exit("Invalid null argument");
> +			}
> +			next = 0x00;
> +
> +			if (keyfile) {
> +				addhostkey(keyfile);
> +				keyfile = NULL;
> +			}
> +		}
> 	}
> 
> 	/* Set up listening ports */
> -- 
> 2.6.2
> 



More information about the Dropbear mailing list