Return to BSD News archive
Path: sserve!newshost.anu.edu.au!munnari.oz.au!news.Hawaii.Edu!ames!haven.umd.edu!news.umbc.edu!eff!news.kei.com!yeshua.marcam.com!zip.eecs.umich.edu!quip.eecs.umich.edu!dmuntz
From: dmuntz@quip.eecs.umich.edu (Dan Muntz)
Newsgroups: comp.os.386bsd.bugs
Subject: csh glob bug
Date: 2 Nov 1993 05:06:27 GMT
Organization: University of Michigan EECS Dept., Ann Arbor, MI
Lines: 72
Message-ID: <2b4psj$83o@zip.eecs.umich.edu>
NNTP-Posting-Host: quip.eecs.umich.edu
This applies to NetBSD 0.9 and probably FreeBSD.
Any wildcard which matches nothing causes a "No match" for the entire argument
list. The included patch takes care to mimic the standard globbing of csh.
To see the bug:
% touch aa bb
% ls
aa bb
% ls *b *ccc
ls: No match.
-Dan
dmuntz@eecs.umich.edu
And the patch (to /usr/src/bin/csh/glob.c):
*** glob.c.ORIG Tue Nov 2 00:00:41 1993
--- glob.c Tue Nov 2 00:01:04 1993
***************
*** 355,361 ****
libglob(vl)
Char **vl;
{
! int gflgs = GLOB_QUOTE | GLOB_NOCHECK;
glob_t globv;
char *ptr;
--- 355,361 ----
libglob(vl)
Char **vl;
{
! int gflgs = GLOB_QUOTE | GLOB_NOCHECK, badmagic = 0, goodmagic = 0;
glob_t globv;
char *ptr;
***************
*** 378,389 ****
}
if (!nonomatch && (globv.gl_matchc == 0) &&
(globv.gl_flags & GLOB_MAGCHAR)) {
! globfree(&globv);
! return (NULL);
! }
gflgs |= GLOB_APPEND;
}
while (*++vl);
vl = blk2short(globv.gl_pathv);
globfree(&globv);
return (vl);
--- 378,398 ----
}
if (!nonomatch && (globv.gl_matchc == 0) &&
(globv.gl_flags & GLOB_MAGCHAR)) {
! badmagic = 1;
! globv.gl_pathc--;
! free(globv.gl_pathv[globv.gl_pathc]);
! globv.gl_pathv[globv.gl_pathc] = (char *)0;
! } else
! if (!nonomatch && (globv.gl_matchc > 0) &&
! (globv.gl_flags & GLOB_MAGCHAR))
! goodmagic = 1;
gflgs |= GLOB_APPEND;
}
while (*++vl);
+ if (badmagic && !goodmagic) {
+ globfree(&globv);
+ return (NULL);
+ }
vl = blk2short(globv.gl_pathv);
globfree(&globv);
return (vl);