Subject: Re: [PATCH 04/11] grep/icase: avoid kwsset on literal non-ascii strings

From: Junio C Hamano <[email-masked]>
Date: Thu, 23 Jun 2016 13:12:10 -0700

Nguyễn Thái Ngọc Duy  <[email-masked]> writes:

>  static void compile_regexp(struct grep_pat *p, struct grep_opt *opt)
>  {
> +	int icase, ascii_only;
>  	int err;
>  
>  	p->word_regexp = opt->word_regexp;
>  	p->ignore_case = opt->ignore_case;
> +	icase	       = opt->regflags & REG_ICASE || p->ignore_case;
> +	ascii_only     = !has_non_ascii(p->pattern);
>  
>  	if (opt->fixed) {
>  		p->fixed = 1;
> -	} else if (is_fixed(p->pattern, p->patternlen))
> +	} else if ((!icase || ascii_only) &&
> +		   is_fixed(p->pattern, p->patternlen))
>  		p->fixed = 1;

... we are not told to do "fixed" explicitly with "-F", and that is
safe for a literal pattern if the pattern is only ascii (with or
without -i) but not safe with "-i" when dealing with non-ascii
pattern.

Makes perfect sense.

>  	else
>  		p->fixed = 0;
> diff --git a/t/t7812-grep-icase-non-ascii.sh b/t/t7812-grep-icase-non-ascii.sh
> new file mode 100755
> index 0000000..b78a774
> --- /dev/null
> +++ b/t/t7812-grep-icase-non-ascii.sh
> @@ -0,0 +1,23 @@
> +#!/bin/sh
> +
> +test_description='grep icase on non-English locales'
> +
> +. ./lib-gettext.sh
> +
> +test_expect_success GETTEXT_LOCALE 'setup' '
> +	test_write_lines "TILRAUN: Halló Heimur!" >file &&
> +	git add file &&
> +	LC_ALL="$is_IS_locale" &&
> +	export LC_ALL
> +'
> +
> +test_have_prereq GETTEXT_LOCALE &&
> +test-regex "HALLÓ" "Halló" ICASE &&
> +test_set_prereq REGEX_LOCALE
> +
> +test_expect_success REGEX_LOCALE 'grep literal string, no -F' '
> +	git grep -i "TILRAUN: Halló Heimur!" &&
> +	git grep -i "TILRAUN: HALLÓ HEIMUR!"
> +'
> +
> +test_done