git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 4/8] wildmatch: support "no FNM_PATHNAME" mode

From
Nguyen Thai Ngoc Duy <pclouds@gmail.com>
Date
Dec 28, 2012, 07:15 UTC
Message-ID
<CACsJy8C7Y8xLVVhUtt1g234XnHrTbjRCBcY261QEe-y81A1YUw@mail.gmail.com>
In-Reply-To
<7vwqw2k833.fsf@alter.siamese.dyndns.org>
On Fri, Dec 28, 2012 at 1:24 PM, Junio C Hamano <gitster@pobox.com> wrote:
Show 10 quoted lines
>>                       if (*++p == '*') {
>>                               const uchar *prev_p = p - 2;
>>                               while (*++p == '*') {}
>> -                             if ((prev_p == text || *prev_p == '/') ||
>> +                             if (!(flags & WM_PATHNAME))
>> +                                     /* without WM_PATHNAME, '*' == '**' */
>> +                                     special = 1;
>> +                             else if ((prev_p == text || *prev_p == '/') ||
>
> Not a new issue in this patch,

No, it's an issue from nd/wildmatch, 40bbee0 (wildmatch: adjust "**" behavior - 2012-10-15).

Show 6 quoted lines
> but here, "prev_p" points into the
> pattern string, two bytes before p, which is the byte before the
> "**" that we are looking at (which might be before the beginning of
> the pattern).  "text" is the string we are trying to match that
> pattern against.  How can these two pointers be compared to yield a
> meaningful value?

They can't. I wanted to check whether "**" is at the start of the pattern (so no preceding '/' needed) and used a wrong pointer to compare to. Funny there is a test about this and it does not catch it because prev_p access something before the pattern. Will fix.

Show 10 quoted lines
>
>>                                   (*p == '\0' || *p == '/' ||
>>                                    (p[0] == '\\' && p[1] == '/'))) {
>
> OK.  "**/", "**" (end of pattern), and "**\/" are handled here.
>
> Do we have to worry about "**[/]" the same way, or a class never
> matches the directory separator, even if it is a singleton class
> that consists of '/' (which is fine by me)?  If so, is "\/" more or
> less like "[/]"?

This is a special case of "**" with FNM_PATHNAME on. With FNM_PATHNAME, '[]' and '?' cannot match '/' so any patterns with '[/]' match nothing. I think we don't need to worry about this case.

-- 
Duy
Previous: Junio C HamanoNext: Nguyễn Thái Ngọc Duy
Message 8 of 14 in “fnmatch replacement step 1”
  1. 0/8 fnmatch replacement step 1Nguyễn Thái Ngọc Duy, Dec 22, 2012
  2. 1/8 compat/fnmatch: respect NO_FNMATCH* even on glibcNguyễn Thái Ngọc Duy, Dec 22, 2012
  3. 2/8 wildmatch: rename constants and update prototypeNguyễn Thái Ngọc Duy, Dec 22, 2012
  4. Junio C HamanoDec 26, 2012
  5. 3/8 wildmatch: make dowild() take arbitrary flagsNguyễn Thái Ngọc Duy, Dec 22, 2012
  6. 4/8 wildmatch: support "no FNM_PATHNAME" modeNguyễn Thái Ngọc Duy, Dec 22, 2012
  7. Junio C HamanoDec 28, 2012
  8. Nguyen Thai Ngoc DuyDec 28, 2012
  9. 5/8 test-wildmatch: add "perf" command to compare wildmatch and fnmatchNguyễn Thái Ngọc Duy, Dec 22, 2012
  10. 6/8 Makefile: add USE_WILDMATCH to use wildmatch as fnmatchNguyễn Thái Ngọc Duy, Dec 22, 2012
  11. 7/8 wildmatch: make a special case for "*/" with FNM_PATHNAMENguyễn Thái Ngọc Duy, Dec 22, 2012
  12. 8/8 wildmatch: advance faster in <asterisk> + <literal> patternsNguyễn Thái Ngọc Duy, Dec 22, 2012
  13. Junio C HamanoDec 28, 2012
  14. Nguyen Thai Ngoc DuyDec 28, 2012

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.