* Patch setfiles to only warn if add_remove fails to lstat on user initiated excludes.
@ 2009-08-10 15:13 Daniel J Walsh
2009-08-10 20:03 ` Stephen Smalley
0 siblings, 1 reply; 6+ messages in thread
From: Daniel J Walsh @ 2009-08-10 15:13 UTC (permalink / raw)
To: SE Linux
[-- Attachment #1: Type: text/plain, Size: 281 bytes --]
Currently in F12 if you have file systems that root can not read
# restorecon -R -v /var/lib/libvirt/
Can't stat directory "/home/dwalsh/.gvfs", Permission denied.
Can't stat directory "/home/dwalsh/redhat", Permission denied.
After patch
# ./restorecon -R -v /var/lib/libvirt/
[-- Attachment #2: policycoreutils-setfiles.patch --]
[-- Type: text/plain, Size: 1251 bytes --]
diff -up policycoreutils-2.0.70/setfiles/setfiles.c~ policycoreutils-2.0.70/setfiles/setfiles.c
--- policycoreutils-2.0.70/setfiles/setfiles.c~ 2009-08-05 15:11:11.000000000 -0400
+++ policycoreutils-2.0.70/setfiles/setfiles.c 2009-08-10 11:06:54.000000000 -0400
@@ -234,7 +234,7 @@ void filespec_destroy(void)
fl_head = NULL;
}
-static int add_exclude(const char *directory)
+static int add_exclude(const char *directory, int warn)
{
struct stat sb;
size_t len = 0;
@@ -244,8 +244,8 @@ static int add_exclude(const char *direc
return 1;
}
if (lstat(directory, &sb)) {
- fprintf(stderr, "Can't stat directory \"%s\", %s.\n",
- directory, strerror(errno));
+ if (warn) fprintf(stderr, "Can't stat directory \"%s\", %s.\n",
+ directory, strerror(errno));
return 0;
}
if ((sb.st_mode & S_IFDIR) == 0) {
@@ -727,7 +727,7 @@ static void exclude_non_seclabel_mounts(
/* exclude mount points without the seclabel option */
if (!found)
- add_exclude(mount_info[1]);
+ add_exclude(mount_info[1], 0);
}
free(buf);
@@ -840,7 +840,7 @@ int main(int argc, char **argv)
}
case 'e':
remove_exclude(optarg);
- if (add_exclude(optarg))
+ if (add_exclude(optarg, 1))
exit(1);
break;
case 'f':
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: Patch setfiles to only warn if add_remove fails to lstat on user initiated excludes. 2009-08-10 15:13 Patch setfiles to only warn if add_remove fails to lstat on user initiated excludes Daniel J Walsh @ 2009-08-10 20:03 ` Stephen Smalley 2009-08-10 20:12 ` Stephen Smalley 0 siblings, 1 reply; 6+ messages in thread From: Stephen Smalley @ 2009-08-10 20:03 UTC (permalink / raw) To: Daniel J Walsh; +Cc: SE Linux On Mon, 2009-08-10 at 11:13 -0400, Daniel J Walsh wrote: > Currently in F12 if you have file systems that root can not read > > # restorecon -R -v /var/lib/libvirt/ > Can't stat directory "/home/dwalsh/.gvfs", Permission denied. > Can't stat directory "/home/dwalsh/redhat", Permission denied. > > After patch > > # ./restorecon -R -v /var/lib/libvirt/ But if you were to run ./restorecon -R /home/dwalsh that would try to descend into .gvfs and redhat, right? I think you want instead to ignore the lstat error if the error was permission denied and add the entry to the exclude list so that restorecon will not try to descend into it. It is ok to exclude a directory to which you lack permission. Try this: diff --git a/policycoreutils/setfiles/setfiles.c b/policycoreutils/setfiles/setfiles.c index d219225..4190ded 100644 --- a/policycoreutils/setfiles/setfiles.c +++ b/policycoreutils/setfiles/setfiles.c @@ -243,17 +243,18 @@ static int add_exclude(const char *directory) directory); return 1; } - if (lstat(directory, &sb)) { + if (lstat(directory, &sb) == 0) { + if ((sb.st_mode & S_IFDIR) == 0) { + fprintf(stderr, + "\"%s\" is not a Directory: mode %o, ignoring\n", + directory, sb.st_mode); + return 0; + } + } else if (errno != EACCES) { fprintf(stderr, "Can't stat directory \"%s\", %s.\n", directory, strerror(errno)); return 0; } - if ((sb.st_mode & S_IFDIR) == 0) { - fprintf(stderr, - "\"%s\" is not a Directory: mode %o, ignoring\n", - directory, sb.st_mode); - return 0; - } if (excludeCtr == MAX_EXCLUDES) { fprintf(stderr, "Maximum excludes %d exceeded.\n", -- Stephen Smalley National Security Agency -- This message was distributed to subscribers of the selinux mailing list. If you no longer wish to subscribe, send mail to majordomo@tycho.nsa.gov with the words "unsubscribe selinux" without quotes as the message. ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: Patch setfiles to only warn if add_remove fails to lstat on user initiated excludes. 2009-08-10 20:03 ` Stephen Smalley @ 2009-08-10 20:12 ` Stephen Smalley 2009-08-11 12:12 ` Daniel J Walsh 0 siblings, 1 reply; 6+ messages in thread From: Stephen Smalley @ 2009-08-10 20:12 UTC (permalink / raw) To: Daniel J Walsh; +Cc: SE Linux On Mon, 2009-08-10 at 16:03 -0400, Stephen Smalley wrote: > On Mon, 2009-08-10 at 11:13 -0400, Daniel J Walsh wrote: > > Currently in F12 if you have file systems that root can not read > > > > # restorecon -R -v /var/lib/libvirt/ > > Can't stat directory "/home/dwalsh/.gvfs", Permission denied. > > Can't stat directory "/home/dwalsh/redhat", Permission denied. > > > > After patch > > > > # ./restorecon -R -v /var/lib/libvirt/ > > But if you were to run > ./restorecon -R /home/dwalsh > that would try to descend into .gvfs and redhat, right? > > I think you want instead to ignore the lstat error if the error was > permission denied and add the entry to the exclude list so that > restorecon will not try to descend into it. It is ok to exclude a > directory to which you lack permission. Try this: Also, why limit -e to only directories? Why not let the user exclude individual files if they choose to do so? In which case we could drop the mode test altogether, and possibly drop the lstat() call altogether? Or if you truly want to warn the user about non-existent paths, then take the lstat() and warning to the 'e' option processing in main() instead of doing it inside of add_exclude(). -- Stephen Smalley National Security Agency -- This message was distributed to subscribers of the selinux mailing list. If you no longer wish to subscribe, send mail to majordomo@tycho.nsa.gov with the words "unsubscribe selinux" without quotes as the message. ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: Patch setfiles to only warn if add_remove fails to lstat on user initiated excludes. 2009-08-10 20:12 ` Stephen Smalley @ 2009-08-11 12:12 ` Daniel J Walsh 2009-08-11 13:33 ` Stephen Smalley 0 siblings, 1 reply; 6+ messages in thread From: Daniel J Walsh @ 2009-08-11 12:12 UTC (permalink / raw) To: Stephen Smalley; +Cc: SE Linux On 08/10/2009 04:12 PM, Stephen Smalley wrote: > On Mon, 2009-08-10 at 16:03 -0400, Stephen Smalley wrote: >> On Mon, 2009-08-10 at 11:13 -0400, Daniel J Walsh wrote: >>> Currently in F12 if you have file systems that root can not read >>> >>> # restorecon -R -v /var/lib/libvirt/ >>> Can't stat directory "/home/dwalsh/.gvfs", Permission denied. >>> Can't stat directory "/home/dwalsh/redhat", Permission denied. >>> >>> After patch >>> >>> # ./restorecon -R -v /var/lib/libvirt/ >> >> But if you were to run >> ./restorecon -R /home/dwalsh >> that would try to descend into .gvfs and redhat, right? >> >> I think you want instead to ignore the lstat error if the error was >> permission denied and add the entry to the exclude list so that >> restorecon will not try to descend into it. It is ok to exclude a >> directory to which you lack permission. Try this: > > Also, why limit -e to only directories? Why not let the user exclude > individual files if they choose to do so? In which case we could drop > the mode test altogether, and possibly drop the lstat() call altogether? > Or if you truly want to warn the user about non-existent paths, then > take the lstat() and warning to the 'e' option processing in main() > instead of doing it inside of add_exclude(). > I agree lets remove the directory check and warn on non existing files. -- This message was distributed to subscribers of the selinux mailing list. If you no longer wish to subscribe, send mail to majordomo@tycho.nsa.gov with the words "unsubscribe selinux" without quotes as the message. ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: Patch setfiles to only warn if add_remove fails to lstat on user initiated excludes. 2009-08-11 12:12 ` Daniel J Walsh @ 2009-08-11 13:33 ` Stephen Smalley 2009-08-11 14:12 ` Daniel J Walsh 0 siblings, 1 reply; 6+ messages in thread From: Stephen Smalley @ 2009-08-11 13:33 UTC (permalink / raw) To: Daniel J Walsh; +Cc: SE Linux On Tue, 2009-08-11 at 08:12 -0400, Daniel J Walsh wrote: > On 08/10/2009 04:12 PM, Stephen Smalley wrote: > > On Mon, 2009-08-10 at 16:03 -0400, Stephen Smalley wrote: > >> On Mon, 2009-08-10 at 11:13 -0400, Daniel J Walsh wrote: > >>> Currently in F12 if you have file systems that root can not read > >>> > >>> # restorecon -R -v /var/lib/libvirt/ > >>> Can't stat directory "/home/dwalsh/.gvfs", Permission denied. > >>> Can't stat directory "/home/dwalsh/redhat", Permission denied. > >>> > >>> After patch > >>> > >>> # ./restorecon -R -v /var/lib/libvirt/ > >> > >> But if you were to run > >> ./restorecon -R /home/dwalsh > >> that would try to descend into .gvfs and redhat, right? > >> > >> I think you want instead to ignore the lstat error if the error was > >> permission denied and add the entry to the exclude list so that > >> restorecon will not try to descend into it. It is ok to exclude a > >> directory to which you lack permission. Try this: > > > > Also, why limit -e to only directories? Why not let the user exclude > > individual files if they choose to do so? In which case we could drop > > the mode test altogether, and possibly drop the lstat() call altogether? > > Or if you truly want to warn the user about non-existent paths, then > > take the lstat() and warning to the 'e' option processing in main() > > instead of doing it inside of add_exclude(). > > > I agree lets remove the directory check and warn on non existing files. Does this handle it correctly for you? Remove the directory check for the -e option and only apply the existence test to user-specified entries. Also ignore permission denied errors as it is ok to exclude a directory or file to which the caller lacks permission. diff --git a/policycoreutils/setfiles/setfiles.c b/policycoreutils/setfiles/setfiles.c index d219225..4c47f21 100644 --- a/policycoreutils/setfiles/setfiles.c +++ b/policycoreutils/setfiles/setfiles.c @@ -236,25 +236,13 @@ void filespec_destroy(void) static int add_exclude(const char *directory) { - struct stat sb; size_t len = 0; + if (directory == NULL || directory[0] != '/') { fprintf(stderr, "Full path required for exclude: %s.\n", directory); return 1; } - if (lstat(directory, &sb)) { - fprintf(stderr, "Can't stat directory \"%s\", %s.\n", - directory, strerror(errno)); - return 0; - } - if ((sb.st_mode & S_IFDIR) == 0) { - fprintf(stderr, - "\"%s\" is not a Directory: mode %o, ignoring\n", - directory, sb.st_mode); - return 0; - } - if (excludeCtr == MAX_EXCLUDES) { fprintf(stderr, "Maximum excludes %d exceeded.\n", MAX_EXCLUDES); @@ -840,6 +828,11 @@ int main(int argc, char **argv) } case 'e': remove_exclude(optarg); + if (lstat(optarg, &sb) < 0 && errno != EACCES) { + fprintf(stderr, "Can't stat exclude path \"%s\", %s - ignoring.\n", + optarg, strerror(errno)); + break; + } if (add_exclude(optarg)) exit(1); break; -- Stephen Smalley National Security Agency -- This message was distributed to subscribers of the selinux mailing list. If you no longer wish to subscribe, send mail to majordomo@tycho.nsa.gov with the words "unsubscribe selinux" without quotes as the message. ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: Patch setfiles to only warn if add_remove fails to lstat on user initiated excludes. 2009-08-11 13:33 ` Stephen Smalley @ 2009-08-11 14:12 ` Daniel J Walsh 0 siblings, 0 replies; 6+ messages in thread From: Daniel J Walsh @ 2009-08-11 14:12 UTC (permalink / raw) To: Stephen Smalley; +Cc: SE Linux On 08/11/2009 09:33 AM, Stephen Smalley wrote: > On Tue, 2009-08-11 at 08:12 -0400, Daniel J Walsh wrote: >> On 08/10/2009 04:12 PM, Stephen Smalley wrote: >>> On Mon, 2009-08-10 at 16:03 -0400, Stephen Smalley wrote: >>>> On Mon, 2009-08-10 at 11:13 -0400, Daniel J Walsh wrote: >>>>> Currently in F12 if you have file systems that root can not read >>>>> >>>>> # restorecon -R -v /var/lib/libvirt/ >>>>> Can't stat directory "/home/dwalsh/.gvfs", Permission denied. >>>>> Can't stat directory "/home/dwalsh/redhat", Permission denied. >>>>> >>>>> After patch >>>>> >>>>> # ./restorecon -R -v /var/lib/libvirt/ >>>> >>>> But if you were to run >>>> ./restorecon -R /home/dwalsh >>>> that would try to descend into .gvfs and redhat, right? >>>> >>>> I think you want instead to ignore the lstat error if the error was >>>> permission denied and add the entry to the exclude list so that >>>> restorecon will not try to descend into it. It is ok to exclude a >>>> directory to which you lack permission. Try this: >>> >>> Also, why limit -e to only directories? Why not let the user exclude >>> individual files if they choose to do so? In which case we could drop >>> the mode test altogether, and possibly drop the lstat() call altogether? >>> Or if you truly want to warn the user about non-existent paths, then >>> take the lstat() and warning to the 'e' option processing in main() >>> instead of doing it inside of add_exclude(). >>> >> I agree lets remove the directory check and warn on non existing files. > > Does this handle it correctly for you? > > Remove the directory check for the -e option and only apply the > existence test to user-specified entries. Also ignore permission denied > errors as it is ok to exclude a directory or file to which the caller > lacks permission. > > diff --git a/policycoreutils/setfiles/setfiles.c b/policycoreutils/setfiles/setfiles.c > index d219225..4c47f21 100644 > --- a/policycoreutils/setfiles/setfiles.c > +++ b/policycoreutils/setfiles/setfiles.c > @@ -236,25 +236,13 @@ void filespec_destroy(void) > > static int add_exclude(const char *directory) > { > - struct stat sb; > size_t len = 0; > + > if (directory == NULL || directory[0] != '/') { > fprintf(stderr, "Full path required for exclude: %s.\n", > directory); > return 1; > } > - if (lstat(directory, &sb)) { > - fprintf(stderr, "Can't stat directory \"%s\", %s.\n", > - directory, strerror(errno)); > - return 0; > - } > - if ((sb.st_mode & S_IFDIR) == 0) { > - fprintf(stderr, > - "\"%s\" is not a Directory: mode %o, ignoring\n", > - directory, sb.st_mode); > - return 0; > - } > - > if (excludeCtr == MAX_EXCLUDES) { > fprintf(stderr, "Maximum excludes %d exceeded.\n", > MAX_EXCLUDES); > @@ -840,6 +828,11 @@ int main(int argc, char **argv) > } > case 'e': > remove_exclude(optarg); > + if (lstat(optarg, &sb) < 0 && errno != EACCES) { > + fprintf(stderr, "Can't stat exclude path \"%s\", %s - ignoring.\n", > + optarg, strerror(errno)); > + break; > + } > if (add_exclude(optarg)) > exit(1); > break; > I like it ack. -- This message was distributed to subscribers of the selinux mailing list. If you no longer wish to subscribe, send mail to majordomo@tycho.nsa.gov with the words "unsubscribe selinux" without quotes as the message. ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2009-08-11 14:12 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2009-08-10 15:13 Patch setfiles to only warn if add_remove fails to lstat on user initiated excludes Daniel J Walsh 2009-08-10 20:03 ` Stephen Smalley 2009-08-10 20:12 ` Stephen Smalley 2009-08-11 12:12 ` Daniel J Walsh 2009-08-11 13:33 ` Stephen Smalley 2009-08-11 14:12 ` Daniel J Walsh
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.