diff options
Diffstat (limited to 'src/pacman')
| -rw-r--r-- | src/pacman/sync.c | 11 | ||||
| -rw-r--r-- | src/pacman/util.c | 38 | 
2 files changed, 45 insertions, 4 deletions
| diff --git a/src/pacman/sync.c b/src/pacman/sync.c index c56934b6..6962306a 100644 --- a/src/pacman/sync.c +++ b/src/pacman/sync.c @@ -644,7 +644,15 @@ static int process_group(alpm_list_t *dbs, char *group)  				group);  		select_display(pkgs);  		char *array = malloc(count); -		multiselect_question(array, count); +		if(!array) { +			ret = 1; +			goto cleanup; +		} +		if(multiselect_question(array, count)) { +			ret = 1; +			free(array); +			goto cleanup; +		}  		int n = 0;  		for(i = pkgs; i; i = alpm_list_next(i)) {  			if(array[n++] == 0) @@ -657,6 +665,7 @@ static int process_group(alpm_list_t *dbs, char *group)  				goto cleanup;  			}  		} +		free(array);  	} else {  		for(i = pkgs; i; i = alpm_list_next(i)) {  			pmpkg_t *pkg = alpm_list_getdata(i); diff --git a/src/pacman/util.c b/src/pacman/util.c index f695ffba..53dbd637 100644 --- a/src/pacman/util.c +++ b/src/pacman/util.c @@ -796,8 +796,9 @@ static int multiselect_parse(char *array, int count, char *response)  int multiselect_question(char *array, int count)  { -	char response[64]; +	char *response, *lastchar;  	FILE *stream; +	size_t response_len = 64;  	if(config->noconfirm) {  		stream = stdout; @@ -806,19 +807,45 @@ int multiselect_question(char *array, int count)  		stream = stderr;  	} +	response = malloc(response_len); +	if(!response) { +		return -1; +	} +	lastchar = response + response_len - 1; +	/* sentinel byte to later see if we filled up the entire string */ +	*lastchar = 1; +  	while(1) {  		memset(array, 1, count);  		fprintf(stream, "\n");  		fprintf(stream, _("Enter a selection (default=all)"));  		fprintf(stream,	": "); +		fflush(stream);  		if(config->noconfirm) {  			fprintf(stream, "\n");  			break;  		} -		if(fgets(response, sizeof(response), stdin)) { +		if(fgets(response, response_len, stdin)) { +			const size_t response_incr = 64; +			/* handle buffer not being large enough to read full line case */ +			while(*lastchar == '\0' && lastchar[-1] != '\n') { +				response_len += response_incr; +				response = realloc(response, response_len); +				if(!response) { +					return -1; +				} +				lastchar = response + response_len - 1; +				/* sentinel byte */ +				*lastchar = 1; +				if(fgets(response + response_len - response_incr - 1, +							response_incr + 1, stdin) == 0) { +					free(response); +					return -1; +				} +			}  			strtrim(response);  			if(strlen(response) > 0) {  				if(multiselect_parse(array, count, response) == -1) { @@ -826,9 +853,14 @@ int multiselect_question(char *array, int count)  					continue;  				}  			} +			break; +		} else { +			free(response); +			return -1;  		} -		break;  	} + +	free(response);  	return(0);  } | 
