Call basename() in a portable way.

Pull a copy of the filename string before calling basename(). Change the
loop to not return on its own, so we can put a free() statement at the
bottom.
This commit is contained in:
Ed Schouten 2016-07-28 15:19:47 +00:00
parent 6718ba1851
commit 33f5799a81
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=303444

View File

@ -58,21 +58,26 @@ static int procline(struct str *l, int);
bool bool
file_matching(const char *fname) file_matching(const char *fname)
{ {
char *fname_base; char *fname_base, *fname_buf;
bool ret; bool ret;
ret = finclude ? false : true; ret = finclude ? false : true;
fname_base = basename(fname); fname_buf = strdup(fname);
if (fname_buf == NULL)
err(2, "strdup");
fname_base = basename(fname_buf);
for (unsigned int i = 0; i < fpatterns; ++i) { for (unsigned int i = 0; i < fpatterns; ++i) {
if (fnmatch(fpattern[i].pat, fname, 0) == 0 || if (fnmatch(fpattern[i].pat, fname, 0) == 0 ||
fnmatch(fpattern[i].pat, fname_base, 0) == 0) { fnmatch(fpattern[i].pat, fname_base, 0) == 0) {
if (fpattern[i].mode == EXCL_PAT) if (fpattern[i].mode == EXCL_PAT) {
return (false); ret = false;
else break;
} else
ret = true; ret = true;
} }
} }
free(fname_buf);
return (ret); return (ret);
} }