Module Name: src
Committed By: christos
Date: Sun Jan 14 16:42:58 UTC 2024
Modified Files:
src/usr.bin/hexdump: display.c
Log Message:
PR/57851: Ricardo Branco: stat(2) does not return correct size information
for kernfs/procfs files. Minor KNF.
To generate a diff of this commit:
cvs rdiff -u -r1.25 -r1.26 src/usr.bin/hexdump/display.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/usr.bin/hexdump/display.c
diff -u src/usr.bin/hexdump/display.c:1.25 src/usr.bin/hexdump/display.c:1.26
--- src/usr.bin/hexdump/display.c:1.25 Thu Mar 3 22:02:52 2016
+++ src/usr.bin/hexdump/display.c Sun Jan 14 11:42:58 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: display.c,v 1.25 2016/03/04 03:02:52 dholland Exp $ */
+/* $NetBSD: display.c,v 1.26 2024/01/14 16:42:58 christos Exp $ */
/*
* Copyright (c) 1989, 1993
@@ -38,7 +38,7 @@
#if 0
static char sccsid[] = "@(#)display.c 8.1 (Berkeley) 6/6/93";
#else
-__RCSID("$NetBSD: display.c,v 1.25 2016/03/04 03:02:52 dholland Exp $");
+__RCSID("$NetBSD: display.c,v 1.26 2024/01/14 16:42:58 christos Exp $");
#endif
#endif /* not lint */
@@ -256,16 +256,16 @@ get(void)
*/
if (!length || (ateof && !next())) {
if (need == blocksize)
- return(NULL);
+ return NULL ;
if (!need && vflag != ALL &&
!memcmp(curp, savp, nread)) {
if (vflag != DUP)
(void)printf("*\n");
- return(NULL);
+ return NULL ;
}
memset((char *)curp + nread, 0, need);
eaddress = address + nread;
- return(curp);
+ return curp ;
}
n = fread((char *)curp + nread, sizeof(u_char),
length == -1 ? need : MIN(length, need), stdin);
@@ -283,7 +283,7 @@ get(void)
memcmp(curp, savp, blocksize)) {
if (vflag == DUP || vflag == FIRST)
vflag = WAIT;
- return(curp);
+ return curp ;
}
if (vflag == WAIT)
(void)printf("*\n");
@@ -313,9 +313,11 @@ stashargv(char **argv)
* The "done" flag doesn't mean "we are done", it means "we are done
* once we run out of filenames".
*
- * XXX: is there any reason not to remove the logic that inhibits
+ * Is there any reason not to remove the logic that inhibits
* calling fstat if using stdin and not a filename? It should be safe
- * to call fstat on any fd.
+ * to call fstat on any fd. Yes, because on stdin it st_size will not
+ * convey useful information. In addition on kernfs/procfs stat might
+ * not return proper size info.
*
* Note: I have ruled that if there is one file on the command line
* and it doesn't open, we should exit after complaining about it and
@@ -341,7 +343,7 @@ next(void)
statok = 1;
} else {
if (done++)
- return(0);
+ return 0 ;
statok = 0;
}
if (skip)
@@ -349,7 +351,7 @@ next(void)
if (*_argv)
++_argv;
if (!skip)
- return(1);
+ return 1 ;
}
/* NOTREACHED */
}
@@ -362,8 +364,10 @@ doskip(const char *fname, int statok)
if (statok) {
if (fstat(fileno(stdin), &sb))
- err(1, "fstat %s", fname);
- if (S_ISREG(sb.st_mode) && skip >= sb.st_size) {
+ err(EXIT_FAILURE, "fstat %s", fname);
+ /* kernfs/procfs files have dev_t == -1 */
+ if (sb.st_dev != (dev_t)-1 &&
+ S_ISREG(sb.st_mode) && skip >= sb.st_size) {
address += sb.st_size;
skip -= sb.st_size;
return;