Am 04.09.2015 11:32, schrieb Ron Yorston:
> Commit 549deab caused this sequence of commands:
> 
>    mkdir foo
>    cd foo
>    touch a b
>    echo "./"*
> 
> to return './*' instead of the expected './a ./b'.  The problem
> was caused by the backport of commit 880d952 from dash.  In dash
> the issue was fixed by two further commits by Herbert Xu:
> 
> <d6d06ff> [EXPAND] Fixed non-leading slash treatment in expmeta
> <36f0fa8> [EXPAND] Fix slash treatment in expmeta
> 
> (See git://git.kernel.org/pub/scm/utils/dash/dash.git)
> 
> Apply these fixes to BusyBox ash, thus causing the new test
> glob3.tests to succeed.
> 
> Reported-by: Aaro Koskinen <[email protected]>
> Signed-off-by: Ron Yorston <[email protected]>
> ---
>  shell/ash.c | 23 +++++++++++++----------
>  1 file changed, 13 insertions(+), 10 deletions(-)
> 
> diff --git a/shell/ash.c b/shell/ash.c
> index f6190c3..42c9125 100644
> --- a/shell/ash.c
> +++ b/shell/ash.c
> @@ -6992,10 +6992,11 @@ expmeta(char *expdir, char *enddir, char *name)
>       struct dirent *dp;
>       int atend;
>       int matchdot;
> +     int esc;
>  
>       metaflag = 0;
>       start = name;
> -     for (p = name; *p; p++) {
> +     for (p = name; esc = 0, *p; p += esc + 1) {
>               if (*p == '*' || *p == '?')
>                       metaflag = 1;
>               else if (*p == '[') {
> @@ -7012,15 +7013,16 @@ expmeta(char *expdir, char *enddir, char *name)
>                                       break;
>                               }
>                       }
> -             } else if (*p == '\\')
> -                     p++;
> -             else if (*p == '/') {
> -                     if (metaflag)
> -                             goto out;
> -                     start = p + 1;
> +             } else {
> +                     if (*p == '\\')
> +                             esc++;
> +                     if (p[esc] == '/') {
> +                             if (metaflag)
> +                                     break;
> +                             start = p + esc + 1;
> +                     }


How do you know that p[esc] exists ?
(the other code had an else)

re,
 wh


>               }
>       }
> - out:
>       if (metaflag == 0) {    /* we've reached the end of the file name */
>               if (enddir != expdir)
>                       metaflag++;
> @@ -7060,7 +7062,8 @@ expmeta(char *expdir, char *enddir, char *name)
>               atend = 1;
>       } else {
>               atend = 0;
> -             *endname++ = '\0';
> +             *endname = '\0';
> +             endname += esc + 1;
>       }
>       matchdot = 0;
>       p = start;
> @@ -7085,7 +7088,7 @@ expmeta(char *expdir, char *enddir, char *name)
>       }
>       closedir(dirp);
>       if (!atend)
> -             endname[-1] = '/';
> +             endname[-esc - 1] = esc ? '\\' : '/';
>  }
>  
>  static struct strlist *
_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to