Inconsistent parameter expansion

2008-05-15 Thread Romain Tartière
Hello

When migrating a shell script from Debian to Ubuntu GNU/Linux, I ran
into trouble with parameter expansion being handled differently between
bash and dash.

The script was originally developed on a FreeBSD box, hence using
FreeBSD's bourne shell (not bash nor dash) which is POSIX plus some
extra Berkeley extensions (not the same as bash).  The idea is that the
shell script was supposed to be POSIX and therefore not supposed to
fail.

After some investigation, I succeeded in locating the problem.

> $ for L in A B C D; do mkdir $L && touch $L/FILE; done
> $ echo *
> A B C D
> $ echo */FILE
> A/FILE B/FILE C/FILE D/FILE
> $ echo *"/FILE"
> */FILE
> $ 

I can't figure out why '*/FILE' and '*"/FILE"' are not expanded the same
way...

Thank you for your lights,
Romain

-- 
Romain Tartière <[EMAIL PROTECTED]> HealthGrid SysAdmin
pgp: 3BB8 9543 B4F2 3EFA 7478  0BA0 0F8D DB2D B9E4 7019 (ID: 0xB9E47019)
(plain text =non-HTML= PGP/GPG encrypted/signed e-mail much appreciated)


pgptkJfA57AJ3.pgp
Description: PGP signature


Re: Inconsistent parameter expansion

2008-05-18 Thread Herbert Xu
On Thu, May 15, 2008 at 02:26:02PM +, Romain Tartière wrote:
>
> I can't figure out why '*/FILE' and '*"/FILE"' are not expanded the same
> way...

This is a bug in dash.  The following patch should fix the problem,
provided that Ubuntu hasn't built dash with glob(3) enabled because
glob(3) has a similar bug and that needs to be fixed in glibc.

Cheers,
-- 
Visit Openswan at http://www.openswan.org/
Email: Herbert Xu ~{PmV>HI~} <[EMAIL PROTECTED]>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
--
diff --git a/ChangeLog b/ChangeLog
index 2f65e03..bf9dd4a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2008-05-19  Herbert Xu <[EMAIL PROTECTED]>
+
+   * Fixed non-leading slash treatment in expmeta.
+
 2008-05-07  Gerrit Pape <[EMAIL PROTECTED]>
 
* Fixed lexical error in arithmetic expansion of & and |.
diff --git a/src/expand.c b/src/expand.c
index 2c52781..e4c4c8b 100644
--- a/src/expand.c
+++ b/src/expand.c
@@ -1269,10 +1269,11 @@ expmeta(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 == '[') {
@@ -1291,11 +1292,11 @@ expmeta(char *enddir, char *name)
}
} else {
if (*p == '\\')
-   p++;
-   if (*p == '/') {
+   esc++;
+   if (p[esc] == '/') {
if (metaflag)
break;
-   start = p + 1;
+   start = p + esc + 1;
}
}
}
@@ -1337,7 +1338,8 @@ expmeta(char *enddir, char *name)
atend = 1;
} else {
atend = 0;
-   *endname++ = '\0';
+   *endname = '\0';
+   endname += esc + 1;
}
matchdot = 0;
p = start;
@@ -1363,7 +1365,7 @@ expmeta(char *enddir, char *name)
}
closedir(dirp);
if (! atend)
-   endname[-1] = '/';
+   endname[-esc - 1] = esc ? '\\' : '/';
 }
 #endif /* HAVE_GLOB */
 
--
To unsubscribe from this list: send the line "unsubscribe dash" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: Inconsistent parameter expansion

2008-05-18 Thread Oleg Verych
> > I can't figure out why '*/FILE' and '*"/FILE"' are not expanded the same
> > way...

This and one from "[EXPAND] Fix slash treatment in expmeta"
work with Etch:

[EMAIL PROTECTED] dash -c 'echo "/"root*'
/root
[EMAIL PROTECTED] dash -c 'echo *"/FILE"'
A/FILE B/FILE C/FILE D/FILE
[EMAIL PROTECTED]


> This is a bug in dash.  The following patch should fix the problem,
> provided that Ubuntu hasn't built dash with glob(3) enabled because
> glob(3) has a similar bug and that needs to be fixed in glibc.

What was/is whole story? What are FNMATCH_BROKEN GLOB_BROKEN?

Thanks.

--
To unsubscribe from this list: send the line "unsubscribe dash" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: Inconsistent parameter expansion

2008-05-18 Thread Herbert Xu
Oleg Verych <[EMAIL PROTECTED]> wrote:
>
>> This is a bug in dash.  The following patch should fix the problem,
>> provided that Ubuntu hasn't built dash with glob(3) enabled because
>> glob(3) has a similar bug and that needs to be fixed in glibc.
> 
> What was/is whole story? What are FNMATCH_BROKEN GLOB_BROKEN?

I added fnmatch(3) and glob(3) support to dash in order to tap
into existing libc functions rather than duplicating them.  However
at the time it turned out that both were broken which is why these
macros were added until such a time when they were fixed.

The fnmatch(3) function is now correct as far as I know but
glob(3) still seems to be broken.

In any case you may enable them with --enable-fnmatch and --enable-glob
when running configure to see their effect on dash.

Cheers,
-- 
Visit Openswan at http://www.openswan.org/
Email: Herbert Xu ~{PmV>HI~} <[EMAIL PROTECTED]>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
--
To unsubscribe from this list: send the line "unsubscribe dash" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


shell and glibc (Re: Inconsistent parameter expansion)

2008-05-18 Thread Oleg Verych
> The fnmatch(3) function is now correct as far as I know but
> glob(3) still seems to be broken.

It seems, small glibc team cannot do much in areas without interest.

Very surprising for me was recent discovery of big performance penalty of
the most simple '^$' regexp; it turned to be glibc RE library problem:

http://bugs.debian.org/475474
(bonus: 4 ways of doing one thing with `sed`, not with `perl`:)

Thus, i think shell -- basic userspace tool, must be reliable with its
implementation. There are many other ways of size reduction (more on
that latter).

--
To unsubscribe from this list: send the line "unsubscribe dash" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: shell and glibc (Re: Inconsistent parameter expansion)

2008-05-18 Thread Herbert Xu
Oleg Verych <[EMAIL PROTECTED]> wrote:
> 
> It seems, small glibc team cannot do much in areas without interest.

Unfortunately all the cool kids want to work on the kernel instead :)

> Very surprising for me was recent discovery of big performance penalty of
> the most simple '^$' regexp; it turned to be glibc RE library problem:
> 
> http://bugs.debian.org/475474
> (bonus: 4 ways of doing one thing with `sed`, not with `perl`:)

Have you seen http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=65458 ?

Cheers,
-- 
Visit Openswan at http://www.openswan.org/
Email: Herbert Xu ~{PmV>HI~} <[EMAIL PROTECTED]>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
--
To unsubscribe from this list: send the line "unsubscribe dash" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html