Compare commits

...

6 Commits
rawhide ... f7

Author SHA1 Message Date
Fedora Release Engineering 30c5b4a8f5 dist-git conversion 2010-07-28 09:34:30 +00:00
Jiří Moskovčák 774911caad Fixed segfault when using only "--" as parameter (rhbz#430458) 2008-01-28 15:37:54 +00:00
Jiří Moskovčák 789e5ea71b Fixed setfacl exitcode 2007-11-08 14:08:28 +00:00
Jiří Moskovčák b2af30c5be New walk tree patch - better symlink handling 2007-11-07 09:49:31 +00:00
Jiří Moskovčák fc2a310f01 Rewriten path_max patch to support long UTF8 names 2007-09-20 14:48:10 +00:00
Bill Nottingham 86ae26a782 Initialize branch F-7 for acl 2007-05-18 02:43:33 +00:00
7 changed files with 103 additions and 230 deletions

View File

View File

@ -1,6 +0,0 @@
# Makefile for source rpm: acl
# $Id$
NAME := acl
SPECFILE = $(firstword $(wildcard *.spec))
include ../common/Makefile.common

27
acl-2.2.39-exitcode.patch Normal file
View File

@ -0,0 +1,27 @@
--- acl-2.2.39/setfacl/setfacl.c.exitcode 2007-11-08 14:45:01.000000000 +0100
+++ acl-2.2.39/setfacl/setfacl.c 2007-11-08 14:39:19.000000000 +0100
@@ -144,7 +144,7 @@ restore(
if (error < 0)
goto fail;
if (error == 0)
- return 0;
+ return status;
if (path_p == NULL) {
if (filename) {
@@ -158,6 +158,7 @@ restore(
"aborting\n"),
progname, backup_line);
}
+ status = 1;
goto getout;
}
@@ -176,6 +177,7 @@ restore(
fprintf(stderr, _("%s: %s: %s in line %d\n"),
progname, xquote(filename), strerror(errno),
line);
+ status = 1;
goto getout;
}

View File

@ -14,11 +14,11 @@
int c;
- char linebuf[1024];
+ /*
+ Max PATH_MAX bytes even for UTF-8 path names and additional 6
+ bytes for "#file:". Not a good solution but for now it is the
+ Max PATH_MAX bytes even for UTF-8 path names and additional 9
+ bytes for "# file: ".Not a good solution but for now it is the
+ best I can do without too much impact on the code. [tw]
+ */
+ char linebuf[PATH_MAX+6];
+ char linebuf[(4*PATH_MAX)+9];
char *cp;
char *p;
int comments_read = 0;

11
acl-2.2.39-segfault.patch Normal file
View File

@ -0,0 +1,11 @@
--- acl-2.2.45/setfacl/setfacl.c.segfault 2008-01-28 13:56:36.000000000 +0100
+++ acl-2.2.45/setfacl/setfacl.c 2008-01-28 13:58:08.000000000 +0100
@@ -679,6 +679,8 @@ int main(int argc, char *argv[])
}
}
while (optind < argc) {
+ if(!seq)
+ goto synopsis;
if (seq_empty(seq))
goto synopsis;
saw_files = 1;

View File

@ -1,152 +1,13 @@
--- acl-2.2.39/getfacl/getfacl.c.walk 2006-06-20 08:51:25.000000000 +0200
+++ acl-2.2.39/getfacl/getfacl.c 2007-03-21 10:52:07.000000000 +0100
@@ -34,7 +34,6 @@
#include <dirent.h>
#include <libgen.h>
#include <getopt.h>
-#include <ftw.h>
#include <locale.h>
#include "config.h"
#include "user_group.h"
@@ -70,9 +69,9 @@
const char *progname;
const char *cmd_line_options;
-int opt_recursive; /* recurse into sub-directories? */
-int opt_walk_logical; /* always follow symbolic links */
-int opt_walk_physical; /* never follow symbolic links */
+int opt_recursive = 0; /* recurse into sub-directories? */
+int opt_walk_logical = 0; /* always follow symbolic links */
+int opt_walk_physical = 0; /* never follow symbolic links */
int opt_print_acl = 0;
int opt_print_default_acl = 0;
int opt_strip_leading_slash = 1;
@@ -562,71 +561,140 @@
static int __errors;
-int __do_print(const char *file, const struct stat *stat,
- int flag, struct FTW *ftw)
+
+int walk_tree(const char *file)
--- acl-2.2.39/getfacl/getfacl.c.old 2007-11-08 14:38:56.000000000 +0100
+++ acl-2.2.39/getfacl/getfacl.c 2007-11-08 14:39:19.000000000 +0100
@@ -598,17 +598,17 @@ int __do_print(const char *file, const s
char *resolve_symlinks(const char *file)
{
- int saved_errno = errno;
+ static int level = 0;
+ static int link_count = 0;
+ DIR *dir;
+ struct dirent *entry;
+ struct stat buf;
+ 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
specified on the command line. Always skip symbolic links if
doing a physical walk. */
- if (S_ISLNK(stat->st_mode) &&
- (opt_walk_physical || (ftw->level > 0 && !opt_walk_logical)))
+ 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))
- __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)
- 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];
- char *path = NULL;
static char buffer[4096];
+ struct stat stat;
char *path = NULL;
- ssize_t len;
-
- len = readlink(file, buffer, sizeof(buffer)-1);
- if (len < 0) {
- if (errno == EINVAL) /* not a symlink, use given path */
@ -154,82 +15,44 @@
- } else {
- buffer[len+1] = '\0';
- path = buffer;
+ return 1;
+ }
}
- return path;
-}
-
-int walk_tree(const char *file)
-{
- const char *p;
- __errors = 0;
- if ((p = resolve_symlinks(file)) == NULL) {
- fprintf(stderr, "%s: %s: %s\n", progname,
- xquote(file), strerror(errno));
- __errors++;
- } else if (nftw(p, __do_print, 0, opt_walk_logical? 0 : FTW_PHYS) < 0) {
- fprintf(stderr, "%s: %s: %s\n", progname, xquote(file),
- strerror(errno));
+ if (do_print(file, &buf))
__errors++;
- }
+ if (lstat(file, &stat) == -1)
+ return path;
+
+ /* it is a directory, walk */
+ if (S_ISDIR(buf.st_mode)) {
+ dir = opendir(file);
+ if (!dir) {
+ fprintf(stderr, "%s: %s: %s\n", progname,
+ xquote(file), strerror(errno));
+ __errors++;
+ return 0;
+ }
+ if (S_ISLNK(stat.st_mode) && !opt_walk_physical)
+ path = realpath(file, buffer);
+ else
+ path = (char *)file; /* not a symlink, use given path */
+
+ level++;
+ while ((entry = readdir(dir)) != NULL) {
+ if (! strcmp(entry->d_name, ".") ||
+ ! strcmp(entry->d_name, ".."))
+ continue;
+
+ snprintf(path, FILENAME_MAX, "%s/%s", file,
+ entry->d_name);
+
+ /* ignore result, walk every entry */
+ res = walk_tree(path);
+ }
+ level--;
+
+ closedir(dir);
}
- return __errors;
+
+ return 1;
return path;
}
int main(int argc, char *argv[])
@@ -762,15 +830,22 @@
if (*line == '\0')
continue;
--- acl-2.2.39/setfacl/setfacl.c.old 2006-06-20 08:51:25.000000000 +0200
+++ acl-2.2.39/setfacl/setfacl.c 2007-11-08 14:39:19.000000000 +0100
@@ -314,17 +316,17 @@ int __do_set(const char *file, const str
char *resolve_symlinks(const char *file)
{
static char buffer[4096];
+ struct stat stat;
char *path = NULL;
- ssize_t len;
- 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);
- len = readlink(file, buffer, sizeof(buffer)-1);
- if (len < 0) {
- if (errno == EINVAL) /* not a symlink, use given path */
- path = (char *)file;
- } else {
- buffer[len+1] = '\0';
- path = buffer;
- }
+ if (lstat(file, &stat) == -1)
+ return path;
+
+ if (S_ISLNK(stat.st_mode) && !opt_walk_physical)
+ path = realpath(file, buffer);
+ else
+ path = (char *)file; /* not a symlink, use given path */
+
return path;
}

View File

@ -1,7 +1,7 @@
Summary: Access control list utilities
Name: acl
Version: 2.2.39
Release: 3.1%{?dist}
Release: 7%{?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
@ -9,6 +9,8 @@ Patch0: acl-2.2.3-multilib.patch
Patch1: acl-2.2.39-build.patch
Patch2: acl-2.2.39-path_max.patch
Patch3: acl-2.2.39-walk.patch
Patch4: acl-2.2.39-exitcode.patch
Patch5: acl-2.2.39-segfault.patch
BuildRequires: autoconf, libtool >= 1.5, gettext
License: GPL
Group: System Environment/Base
@ -47,6 +49,8 @@ defined in POSIX 1003.1e draft standard 17.
%patch1 -p1 -b .build
%patch2 -p1 -b .path_max
%patch3 -p1 -b .walk
%patch4 -p1 -b .exitcode
%patch5 -p1 -b .segfault
autoconf
%build
@ -102,6 +106,20 @@ rm -rf $RPM_BUILD_ROOT
/%{_lib}/libacl.so.*
%changelog
* Mon Jan 28 2008 Jiri Moskovcak <jmoskovc@redhat.com> 2.2.39-7
- Fixed segfault when using only "--" as parameter
- Resolves: #430458
* Thu Nov 8 2007 Jiri Moskovcak <jmoskovc@redhat.com> 2.2.39-6
- Fixed setfacl exitcodes
* Wed Nov 7 2007 Jiri Moskovcak <jmoskovc@redhat.com> 2.2.39-5
- New walk patch backported from upstream - better symlink handling
* Thu Sep 20 2007 Jiri Moskovcak <jmoskovc@redhat.com> 2.2.39-4
- Rewriten path_max patch to support long UTF8 names
- Resolves #287701, #183181
* Wed Mar 21 2007 Thomas Woerner <twoerner@redhat.com> 2.2.39-3.1
- new improved walk patch with fixed getfacl exit code (rhbz#232884)