hush: fix SEGV in % expansion
function old new delta expand_variables 2203 2217 +14
This commit is contained in:
		@@ -11,8 +11,6 @@
 | 
			
		||||
 * Kenneth Almquist.
 | 
			
		||||
 *
 | 
			
		||||
 * Licensed under the GPL v2 or later, see the file LICENSE in this tarball.
 | 
			
		||||
 *
 | 
			
		||||
 * Original BSD copyright notice is retained at the end of this file.
 | 
			
		||||
 */
 | 
			
		||||
#ifdef STANDALONE
 | 
			
		||||
# include <stdbool.h>
 | 
			
		||||
@@ -28,7 +26,7 @@
 | 
			
		||||
 | 
			
		||||
#define pmatch(a, b) !fnmatch((a), (b), 0)
 | 
			
		||||
 | 
			
		||||
char *scanleft(char *string, char *pattern, bool zero)
 | 
			
		||||
char *scanleft(char *string, char *pattern, bool match_at_left)
 | 
			
		||||
{
 | 
			
		||||
	char c;
 | 
			
		||||
	char *loc = string;
 | 
			
		||||
@@ -38,7 +36,7 @@ char *scanleft(char *string, char *pattern, bool zero)
 | 
			
		||||
		const char *s;
 | 
			
		||||
 | 
			
		||||
		c = *loc;
 | 
			
		||||
		if (zero) {
 | 
			
		||||
		if (match_at_left) {
 | 
			
		||||
			*loc = '\0';
 | 
			
		||||
			s = string;
 | 
			
		||||
		} else
 | 
			
		||||
@@ -55,7 +53,7 @@ char *scanleft(char *string, char *pattern, bool zero)
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
char *scanright(char *string, char *pattern, bool zero)
 | 
			
		||||
char *scanright(char *string, char *pattern, bool match_at_left)
 | 
			
		||||
{
 | 
			
		||||
	char c;
 | 
			
		||||
	char *loc = string + strlen(string);
 | 
			
		||||
@@ -65,7 +63,7 @@ char *scanright(char *string, char *pattern, bool zero)
 | 
			
		||||
		const char *s;
 | 
			
		||||
 | 
			
		||||
		c = *loc;
 | 
			
		||||
		if (zero) {
 | 
			
		||||
		if (match_at_left) {
 | 
			
		||||
			*loc = '\0';
 | 
			
		||||
			s = string;
 | 
			
		||||
		} else
 | 
			
		||||
@@ -88,7 +86,7 @@ int main(int argc, char *argv[])
 | 
			
		||||
	char *string;
 | 
			
		||||
	char *op;
 | 
			
		||||
	char *pattern;
 | 
			
		||||
	bool zero;
 | 
			
		||||
	bool match_at_left;
 | 
			
		||||
	char *loc;
 | 
			
		||||
 | 
			
		||||
	int i;
 | 
			
		||||
@@ -117,15 +115,15 @@ int main(int argc, char *argv[])
 | 
			
		||||
			continue;
 | 
			
		||||
		}
 | 
			
		||||
		op = string + off;
 | 
			
		||||
		scan = pick_scan(op[0], op[1], &zero);
 | 
			
		||||
		scan = pick_scan(op[0], op[1], &match_at_left);
 | 
			
		||||
		pattern = op + 1;
 | 
			
		||||
		if (op[0] == op[1])
 | 
			
		||||
			op[1] = '\0', ++pattern;
 | 
			
		||||
		op[0] = '\0';
 | 
			
		||||
 | 
			
		||||
		loc = scan(string, pattern, zero);
 | 
			
		||||
		loc = scan(string, pattern, match_at_left);
 | 
			
		||||
 | 
			
		||||
		if (zero) {
 | 
			
		||||
		if (match_at_left) {
 | 
			
		||||
			printf("'%s'\n", loc);
 | 
			
		||||
		} else {
 | 
			
		||||
			*loc = '\0';
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user