socsvn commit: r224306 -
soc2011/gk/ino64-head/tools/regression/readdir-lint
gk at FreeBSD.org
gk at FreeBSD.org
Sat Jul 16 10:43:28 UTC 2011
Author: gk
Date: Sat Jul 16 10:43:25 2011
New Revision: 224306
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=224306
Log:
readdir-lint: Fix directory offset check, add minimal buffer size options
Modified:
soc2011/gk/ino64-head/tools/regression/readdir-lint/readdir-lint.c
Modified: soc2011/gk/ino64-head/tools/regression/readdir-lint/readdir-lint.c
==============================================================================
--- soc2011/gk/ino64-head/tools/regression/readdir-lint/readdir-lint.c Sat Jul 16 10:43:14 2011 (r224305)
+++ soc2011/gk/ino64-head/tools/regression/readdir-lint/readdir-lint.c Sat Jul 16 10:43:25 2011 (r224306)
@@ -65,6 +65,8 @@
static int opt_verbose;
static int opt_skip;
+static size_t opt_minsize_start = DIRSIZE_MIN;
+static size_t opt_minsize_end = sizeof(struct dirent);
static char *opt_path;
#ifdef HAVE_DIRENT_NAMLEN
@@ -75,6 +77,7 @@
static int warn_seekoff;
static int warn_zerooff;
#endif
+static int warn_offchange;
static int warn_noerr;
static int warn_zeroino;
static int warn_reclen;
@@ -178,6 +181,7 @@
"Zero d_fileno: 0x%08jx #%ju %s",
(uintmax_t)di->d_off,
(uintmax_t)di->d_fileno, di->d_name);
+ continue;
}
#ifndef NO_DIRENT_OFF
if (di->d_off == 0)
@@ -296,15 +300,23 @@
static void
test_bufsize(struct dirbuf *dir_expect, struct dirbuf *dir)
{
- int tests_bufsize[] = { DIRSIZE_PAGE, DIRSIZE_BLOCK, DIRSIZE_ENTRY, 0 };
- int *ip;
+ size_t tests_bufsize[] = {
+ DIRSIZE_PAGE, DIRSIZE_BLOCK, DIRSIZE_ENTRY, 0
+ };
+ size_t *ip;
for (ip = tests_bufsize; *ip != 0; ip++) {
if (opt_skip > 0) {
opt_skip--;
continue;
}
- printf("Test buffer sizes: %d -- %d\n", DIRSIZE_MAX, *ip);
+ if (*ip < opt_minsize_end) {
+ printf("Skip test buffer sizes: %zd -- %zd\n",
+ (size_t)DIRSIZE_MAX, *ip);
+ continue;
+ }
+ printf("Test buffer sizes: %zd -- %zd\n",
+ (size_t)DIRSIZE_MAX, *ip);
dir_init(dir, opt_path, *ip);
dir_seek(dir_expect, 0);
dir_lint(dir_expect, dir);
@@ -324,7 +336,7 @@
}
printf("Test minimal buffer size (fuzzy %d)\n", fuzzy);
- dir_init(dir, opt_path, DIRSIZE_ENTRY);
+ dir_init(dir, opt_path, opt_minsize_end);
dir_seek(dir_expect, 0);
dir_read(dir_expect);
cnt = 0;
@@ -338,15 +350,18 @@
}
#endif
prevoff = dir_offset(dir);
- for (dir->bufsize = DIRSIZE_MIN; dir->bufsize <= DIRSIZE_ENTRY;
- dir->bufsize += 4) {
+ for (dir->bufsize = opt_minsize_start;
+ dir->bufsize <= opt_minsize_end; dir->bufsize += 4) {
len = dir_readx(dir);
if (len <= 0) {
- if (prevoff != dir_offset(dir))
- errx(2, "Directory offset changed but "
+ if (prevoff != dir_offset(dir)) {
+ WARNX(warn_offchange,
+ "Directory offset changed but "
"no data read: 0x%08jx 0x%08jx",
(uintmax_t)prevoff,
(uintmax_t)dir_offset(dir));
+ continue;
+ }
if (len == 0) {
WARNX(warn_noerr,
"EINVAL expected for small buffer "
@@ -366,7 +381,7 @@
dir->dp->d_reclen, dir->bufsize);
break;
}
- if (dir->bufsize > DIRSIZE_ENTRY) {
+ if (dir->bufsize > opt_minsize_end) {
errx(2, "Couldn't read entry at offset 0x%08jx",
(uintmax_t)dir_offset(dir));
}
@@ -384,7 +399,8 @@
static void
usage(int exitcode)
{
- fprintf(stderr, "usage: %s directory\n", getprogname());
+ fprintf(stderr, "usage: %s [-v] [-s skip] [-mM minsize] directory\n",
+ getprogname());
exit(exitcode);
}
@@ -396,8 +412,26 @@
int len, opt;
long prevbase;
- while ((opt = getopt(argc, argv, "hs:v")) != -1) {
+ while ((opt = getopt(argc, argv, "hm:M:s:v")) != -1) {
switch (opt) {
+ case 'm':
+ opt_minsize_start = atoi(optarg);
+ if (opt_minsize_start < DIRSIZE_MIN ||
+ opt_minsize_start % 4 != 0) {
+ fprintf(stderr, "invalid option argument: %s",
+ optarg);
+ return (-1);
+ }
+ break;
+ case 'M':
+ opt_minsize_end = atoi(optarg);
+ if (opt_minsize_end < DIRSIZE_MIN ||
+ opt_minsize_end % 4 != 0) {
+ fprintf(stderr, "invalid option argument: %s",
+ optarg);
+ return (-1);
+ }
+ break;
case 's':
opt_skip = atoi(optarg);
break;
@@ -419,6 +453,8 @@
if (argc == 0)
usage(1);
opt_path = argv[0];
+ if (opt_minsize_end < opt_minsize_start)
+ opt_minsize_end = opt_minsize_start;
dir_init(&dir_max, opt_path, DIRSIZE_MAX);
dir_read(&dir_max);
More information about the svn-soc-all
mailing list