Module Name: src
Committed By: kre
Date: Wed Jun 1 05:10:41 UTC 2016
Modified Files:
src/bin/sh: eval.c
Log Message:
PR bin/43639
Redo earlier fix to only prohibit sourcing directories and block special files.
char specials (/dev/tty, /dev/null, ... incl /dev/rwd0a) and fifos are OK.
Posix actually requires that we find only readable files - that is not yet
implemented (doing it sanely, without opening the file twice, is going to
take some more modifications to code elsewhere).
To generate a diff of this commit:
cvs rdiff -u -r1.127 -r1.128 src/bin/sh/eval.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/bin/sh/eval.c
diff -u src/bin/sh/eval.c:1.127 src/bin/sh/eval.c:1.128
--- src/bin/sh/eval.c:1.127 Fri May 13 10:32:52 2016
+++ src/bin/sh/eval.c Wed Jun 1 05:10:41 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: eval.c,v 1.127 2016/05/13 10:32:52 kre Exp $ */
+/* $NetBSD: eval.c,v 1.128 2016/06/01 05:10:41 kre Exp $ */
/*-
* Copyright (c) 1993
@@ -37,7 +37,7 @@
#if 0
static char sccsid[] = "@(#)eval.c 8.9 (Berkeley) 6/8/95";
#else
-__RCSID("$NetBSD: eval.c,v 1.127 2016/05/13 10:32:52 kre Exp $");
+__RCSID("$NetBSD: eval.c,v 1.128 2016/06/01 05:10:41 kre Exp $");
#endif
#endif /* not lint */
@@ -1266,18 +1266,40 @@ find_dot_file(char *basename)
/* don't try this for absolute or relative paths */
if (strchr(basename, '/')) {
if (stat(basename, &statb) == 0) {
- if (S_ISREG(statb.st_mode))
- return basename;
- error("%s: not a regular file", basename);
- /* NOTREACHED */
+ if (S_ISDIR(statb.st_mode))
+ error("%s: is a directory", basename);
+ if (S_ISBLK(statb.st_mode))
+ error("%s: is a block device", basename);
+ return basename;
}
} else while ((fullname = padvance(&path, basename)) != NULL) {
- if ((stat(fullname, &statb) == 0) && S_ISREG(statb.st_mode)) {
- /*
- * Don't bother freeing here, since it will
- * be freed by the caller.
- */
- return fullname;
+ if ((stat(fullname, &statb) == 0)) {
+ /* weird format is to ease future code... */
+ if (S_ISDIR(statb.st_mode) || S_ISBLK(statb.st_mode))
+ ;
+#if notyet
+ else if (unreadable()) {
+ /*
+ * testing this via st_mode is ugly to get
+ * correct (and would ignore ACLs).
+ * better way is just to open the file.
+ * But doing that here would (currently)
+ * mean opening the file twice, which
+ * might not be safe. So, defer this
+ * test until code is restructures so
+ * we can return a fd. Then we also
+ * get to fix the mem leak just below...
+ */
+ }
+#endif
+ else {
+ /*
+ * Don't bother freeing here, since
+ * it will be freed by the caller.
+ * XXX no it won't - a bug for later.
+ */
+ return fullname;
+ }
}
stunalloc(fullname);
}