Re: Is there a command line tool that returns 1 if a file is in the wrong context?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, 2008-05-27 at 15:53 -0400, Eamon Walsh wrote:
> Stephen Smalley wrote:
> > On Sat, 2008-05-24 at 18:58 -0500, Joe Nall wrote:
> >   
> >> Is there a command line tool that returns 1 if a file is in the wrong  
> >> context?. I want to add a %verifyscript to our rpms to validate the  
> >> installed file context when rpm -V is invoked.
> >>     
> >
> > I was going to suggest matchpathcon -V, except when trying it, I found
> > that there is a bug in the current libselinux that makes it seg fault
> > and it also doesn't return the status but rather displays it.  So how
> > about the patch below to fix the bug and make the exit status usable?
> >
> > After this patch, you can run '/usr/sbin/matchpathcon -Vq path1
> > [path2...]' and check the exit status; 0 will mean that all verified;
> > non-zero will be the count of failures.
> >   
> 
> Minor nit, but return codes are limited to 1 byte; multiples of 256 
> errors will "succeed":

Ok, that's already a bug in the current matchpathcon utility in that
case.  So I'll just make it always exit 0 or 1.

> 
> $ for i in {250..260}; do sh -c "exit $i"; echo $? ; done
> 250
> 251
> 252
> 253
> 254
> 255
> 0
> 1
> 2
> 3
> 4
> 
> 
> 
> 
> 
> > Index: libselinux/utils/matchpathcon.c
> > ===================================================================
> > --- libselinux/utils/matchpathcon.c	(revision 2883)
> > +++ libselinux/utils/matchpathcon.c	(working copy)
> > @@ -12,7 +12,7 @@
> >  void usage(const char *progname)
> >  {
> >  	fprintf(stderr,
> > -		"usage:  %s [-N] [-n] [-f file_contexts] [-p prefix] [-V] path...\n",
> > +		"usage:  %s [-N] [-n] [-f file_contexts] [-p prefix] [-Vq] path...\n",
> >  		progname);
> >  	exit(1);
> >  }
> > @@ -42,11 +42,12 @@
> >  	int verify = 0;
> >  	int notrans = 0;
> >  	int error = 0;
> > +	int quiet = 0;
> >  
> >  	if (argc < 2)
> >  		usage(argv[0]);
> >  
> > -	while ((opt = getopt(argc, argv, "Nnf:p:V")) > 0) {
> > +	while ((opt = getopt(argc, argv, "Nnf:p:Vq")) > 0) {
> >  		switch (opt) {
> >  		case 'n':
> >  			header = 0;
> > @@ -90,6 +91,9 @@
> >  				exit(1);
> >  			}
> >  			break;
> > +		case 'q':
> > +			quiet = 1;
> > +			break;
> >  		default:
> >  			usage(argv[0]);
> >  		}
> > @@ -101,11 +105,18 @@
> >  			mode = buf.st_mode;
> >  
> >  		if (verify) {
> > +			if (quiet) {
> > +				if (selinux_file_context_verify(argv[i], 0))
> > +					continue;
> > +				else
> > +					exit(1);
> > +			}
> >  			if (selinux_file_context_verify(argv[i], 0)) {
> >  				printf("%s verified.\n", argv[i]);
> >  			} else {
> >  				security_context_t con;
> >  				int rc;
> > +				error++;
> >  				if (notrans)
> >  					rc = lgetfilecon_raw(argv[i], &con);
> >  				else
> > @@ -114,15 +125,13 @@
> >  				if (rc >= 0) {
> >  					printf("%s has context %s, should be ",
> >  					       argv[i], con);
> > -					error +=
> > -					    printmatchpathcon(argv[i], 0, mode);
> > +					printmatchpathcon(argv[i], 0, mode);
> >  					freecon(con);
> >  				} else {
> >  					printf
> >  					    ("actual context unknown: %s, should be ",
> >  					     strerror(errno));
> > -					error +=
> > -					    printmatchpathcon(argv[i], 0, mode);
> > +					printmatchpathcon(argv[i], 0, mode);
> >  				}
> >  			}
> >  		} else {
> > Index: libselinux/src/matchpathcon.c
> > ===================================================================
> > --- libselinux/src/matchpathcon.c	(revision 2883)
> > +++ libselinux/src/matchpathcon.c	(working copy)
> > @@ -372,6 +372,9 @@
> >  		else
> >  			return 0;
> >  	}
> > +	
> > +	if (!hnd && (matchpathcon_init_prefix(NULL, NULL) < 0))
> > +			return -1;
> >  
> >  	if (selabel_lookup_raw(hnd, &fcontext, path, mode) != 0) {
> >  		if (errno != ENOENT)
> > @@ -394,6 +397,9 @@
> >  	if (lstat(path, &st) != 0)
> >  		return rc;
> >  
> > +	if (!hnd && (matchpathcon_init_prefix(NULL, NULL) < 0))
> > +			return -1;
> > +
> >  	/* If there's an error determining the context, or it has none, 
> >  	   return to allow default context */
> >  	if (selabel_lookup_raw(hnd, &scontext, path, st.st_mode)) {
> >  
> >   
> 
> 
-- 
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@xxxxxxxxxxxxx with
the words "unsubscribe selinux" without quotes as the message.

[Index of Archives]     [Selinux Refpolicy]     [Linux SGX]     [Fedora Users]     [Fedora Desktop]     [Yosemite Photos]     [Yosemite Camping]     [Yosemite Campsites]     [KDE Users]     [Gnome Users]

  Powered by Linux