diff --git a/acl-2.2.39-walk.patch b/acl-2.2.39-walk.patch index ee15d84..01194f6 100644 --- a/acl-2.2.39-walk.patch +++ b/acl-2.2.39-walk.patch @@ -1,5 +1,5 @@ --- acl-2.2.39/getfacl/getfacl.c.walk 2006-06-20 08:51:25.000000000 +0200 -+++ acl-2.2.39/getfacl/getfacl.c 2007-02-16 18:58:29.000000000 +0100 ++++ acl-2.2.39/getfacl/getfacl.c 2007-03-21 10:52:07.000000000 +0100 @@ -34,7 +34,6 @@ #include #include @@ -21,7 +21,7 @@ int opt_print_acl = 0; int opt_print_default_acl = 0; int opt_strip_leading_slash = 1; -@@ -562,71 +561,84 @@ +@@ -562,71 +561,140 @@ static int __errors; @@ -36,7 +36,13 @@ + DIR *dir; + struct dirent *entry; + struct stat buf; -+ char path[FILENAME_MAX+1]; ++ char path[FILENAME_MAX]; ++ char path2[FILENAME_MAX]; ++ char path3[FILENAME_MAX]; ++ char *dir_name; ++ size_t len; ++ ssize_t slen; ++ int res; /* Process the target of a symbolic link, and traverse the link, only if doing a logical walk, or if the symbolic link was @@ -45,32 +51,96 @@ - if (S_ISLNK(stat->st_mode) && - (opt_walk_physical || (ftw->level > 0 && !opt_walk_logical))) -+ if (level > 0 && !opt_recursive) ++ len = strlen(file); ++ /* check for FILENAME_MAX */ ++ if (len >= FILENAME_MAX) { ++ fprintf(stderr, "%s: %s: %s\n", progname, xquote(file), ++ strerror(ENAMETOOLONG)); ++ __errors++; return 0; ++ } ++ /* string ends with '/', remove it and restart */ ++ if (len > 1 && file[len-1] == '/') { ++ strncpy(path, file, len); ++ path[len-1] = '\0'; /* overwrite slash */ ++ return walk_tree(path); ++ } - if (do_print(file, stat)) -+ if (lstat(file, &buf) != 0) { -+ fprintf(stderr, "%s: %s: %s\n", progname, xquote(file), -+ strerror(errno)); - __errors++; -- +- __errors++; ++ if (level > 0 && !opt_recursive) ++ return 0; + - if (flag == FTW_DNR && opt_recursive) { - /* Item is a directory which can't be read. */ - fprintf(stderr, "%s: %s: %s\n", - progname, file, strerror(saved_errno)); ++ if (lstat(file, &buf) != 0) { ++ fprintf(stderr, "%s: %s: %s\n", progname, xquote(file), ++ strerror(errno)); ++ __errors++; return 0; } - /* We also get here in non-recursive mode. In that case, - return something != 0 to abort nftw. */ -- ++ if (S_ISLNK(buf.st_mode)) { ++ /* physical means: no links at all */ ++ if (opt_walk_physical) ++ return 1; ++ ++ /* logical: show information or walk if points to directory ++ * also for symbolic link arguments on level 0 */ ++ if (opt_walk_logical || level == 0) { ++ /* copy and append terminating '\0' */ ++ strncpy(path2, file, len+1); ++ ++ /* get directory name */ ++ dir_name = dirname(path2); ++ ++ /* get link target */ ++ slen = readlink(file, path, FILENAME_MAX-1); ++ if (slen < 0) { ++ fprintf(stderr, "%s: %s: %s\n", progname, ++ xquote(file), strerror(errno)); ++ __errors++; ++ return 0; ++ } ++ path[slen] = '\0'; + - if (!opt_recursive) -+ if (S_ISLNK(buf.st_mode) && opt_walk_physical) - return 1; +- return 1; ++ if (slen == 0 || path[0] == '/') { ++ /* absolute: ++ * copy and append terminating '\0' */ ++ strncpy(path3, path, slen+1); ++ } else ++ /* relative */ ++ snprintf(path3, FILENAME_MAX, "%s/%s", ++ dir_name, path); ++ ++ if (lstat(path3, &buf) != 0) { ++ fprintf(stderr, "%s: %s: %s\n", progname, ++ xquote(path), strerror(errno)); ++ __errors++; ++ return 0; ++ } - return 0; -} -- ++ if ((S_ISDIR(buf.st_mode) && opt_recursive && ++ link_count < 1) || S_ISLNK(buf.st_mode)) { ++ /* walk directory or follow symlink on level ++ * 0 */ ++ link_count++; ++ res = walk_tree(path3); ++ link_count--; ++ if (res != 1) ++ return 0; ++ } else ++ if (do_print(path3, &buf)) ++ __errors++; + -char *resolve_symlinks(const char *file) -{ - static char buffer[4096]; @@ -84,19 +154,6 @@ - } else { - buffer[len+1] = '\0'; - path = buffer; -+ if (S_ISLNK(buf.st_mode) && opt_walk_logical && opt_recursive) { -+ if (stat(file, &buf) != 0) { -+ fprintf(stderr, "%s: %s: %s\n", progname, xquote(file), -+ strerror(errno)); -+ __errors++; -+ return 0; -+ } -+ if (S_ISDIR(buf.st_mode) && link_count < 1) { -+ link_count++; -+ snprintf(path, FILENAME_MAX, "%s/", file); -+ if (walk_tree(path) != 1) -+ return 0; -+ link_count--; + return 1; + } } @@ -118,8 +175,8 @@ + if (do_print(file, &buf)) __errors++; + ++ /* it is a directory, walk */ + if (S_ISDIR(buf.st_mode)) { -+ level++; + dir = opendir(file); + if (!dir) { + fprintf(stderr, "%s: %s: %s\n", progname, @@ -128,23 +185,21 @@ + return 0; + } + ++ level++; + while ((entry = readdir(dir)) != NULL) { + if (! strcmp(entry->d_name, ".") || + ! strcmp(entry->d_name, "..")) + continue; + -+ if (file[strlen(file)-1] == '/') -+ snprintf(path, FILENAME_MAX, "%s%s", file, -+ entry->d_name); -+ else -+ snprintf(path, FILENAME_MAX, "%s/%s", file, -+ entry->d_name); ++ snprintf(path, FILENAME_MAX, "%s/%s", file, ++ entry->d_name); + -+ if (walk_tree(path) != 1) -+ return 0; ++ /* ignore result, walk every entry */ ++ res = walk_tree(path); + } -+ closedir(dir); + level--; ++ ++ closedir(dir); } - return __errors; + @@ -152,3 +207,29 @@ } int main(int argc, char *argv[]) +@@ -762,15 +830,22 @@ + if (*line == '\0') + continue; + +- had_errors += walk_tree(line); ++ /* ignore result of walk_tree, use __errors */ ++ __errors = 0; ++ walk_tree(line); ++ had_errors += __errors; + } + if (!feof(stdin)) { + fprintf(stderr, _("%s: Standard input: %s\n"), + progname, strerror(errno)); + had_errors++; + } +- } else +- had_errors += walk_tree(argv[optind]); ++ } else { ++ /* ignore result of walk_tree, use __errors */ ++ __errors = 0; ++ walk_tree(argv[optind]); ++ had_errors += __errors; ++ } + optind++; + } while (optind < argc); + diff --git a/acl.spec b/acl.spec index 78c863f..584b12e 100644 --- a/acl.spec +++ b/acl.spec @@ -1,7 +1,7 @@ Summary: Access control list utilities Name: acl Version: 2.2.39 -Release: 3%{?dist} +Release: 3.1%{?dist} BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: libattr-devel >= 2.4.1 Source: ftp://oss.sgi.com/projects/xfs/cmd_tars/acl_%{version}-1.tar.gz @@ -102,6 +102,9 @@ rm -rf $RPM_BUILD_ROOT /%{_lib}/libacl.so.* %changelog +* Wed Mar 21 2007 Thomas Woerner 2.2.39-3.1 +- new improved walk patch with fixed getfacl exit code (rhbz#232884) + * Fri Feb 23 2007 Karsten Hopp 2.2.39-3 - fix buildroot - remove trailing dot from summary