Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 26 Jun 2000 22:40:03 -0700 (PDT)
From:      Kelly Yancey <kbyanc@posi.net>
To:        freebsd-bugs@FreeBSD.org
Subject:   Re: bin/19537: patch to prevent cat'ing directories
Message-ID:  <200006270540.WAA84094@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR bin/19537; it has been noted by GNATS.

From: Kelly Yancey <kbyanc@posi.net>
To: freebsd-gnats-submit@FreeBSD.org
Cc:  
Subject: Re: bin/19537: patch to prevent cat'ing directories
Date: Mon, 26 Jun 2000 22:32:59 -0700 (PDT)

   Actually, the following is a more correct patch, please apply it instead.
 
   Kelly
 
 Index: bin/cat/cat.c
 ===================================================================
 RCS file: /home/cvs/src/bin/cat/cat.c,v
 retrieving revision 1.15
 diff -u -r1.15 cat.c
 --- bin/cat/cat.c	2000/04/14 21:01:35	1.15
 +++ bin/cat/cat.c	2000/06/27 05:24:39
 @@ -68,6 +68,7 @@
  int main __P((int argc, char *argv[]));
  void raw_args __P((char *argv[]));
  void raw_cat __P((int));
 +void checkmode __P((struct stat *, char *));
  
  int
  main(argc, argv)
 @@ -121,6 +122,7 @@
  cook_args(argv)
  	char **argv;
  {
 +	struct stat sb;
  	register FILE *fp;
  
  	fp = stdin;
 @@ -129,12 +131,14 @@
  		if (*argv) {
  			if (!strcmp(*argv, "-"))
  				fp = stdin;
 -			else if ((fp = fopen(*argv, "r")) == NULL) {
 +			else if ((fp = fopen(*argv, "r")) == NULL ||
 +			    fstat(fileno(fp), &sb)) {
  				warn("%s", *argv);
  				rval = 1;
  				++argv;
  				continue;
  			}
 +			checkmode(&sb, *argv);
  			filename = *argv++;
  		}
  		cook_buf(fp);
 @@ -211,6 +215,7 @@
  raw_args(argv)
  	char **argv;
  {
 +	struct stat sb;
  	register int fd;
  
  	fd = fileno(stdin);
 @@ -219,12 +224,14 @@
  		if (*argv) {
  			if (!strcmp(*argv, "-"))
  				fd = fileno(stdin);
 -			else if ((fd = open(*argv, O_RDONLY, 0)) < 0) {
 +			else if ((fd = open(*argv, O_RDONLY, 0)) < 0 ||
 +			    fstat(fd, &sb)) {
  				warn("%s", *argv);
  				rval = 1;
  				++argv;
  				continue;
  			}
 +			checkmode(&sb, *argv);
  			filename = *argv++;
  		}
  		raw_cat(fd);
 @@ -259,4 +266,21 @@
  		warn("%s", filename);
  		rval = 1;
  	}
 +}
 +
 +void
 +checkmode(sb, fname)
 +	struct stat *sb;	
 +	char *fname;
 +{
 +	if (S_ISDIR(sb->st_mode))
 +		errx(1, "%s is a directory", fname);
 +	if (S_ISLNK(sb->st_mode))
 +		/* This should be transparently resolved and
 +		 * thus never happen.
 +		 */
 +		errx(1, "%s is a symlink", fname);
 +	if (S_ISWHT(sb->st_mode))
 +		/* This should never happen. */
 +		errx(1, "%s is a whiteout entry", fname);
  }
 
 


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200006270540.WAA84094>