summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/wc.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/src/wc.c b/src/wc.c
index 34b3e0872..4d307cd18 100644
--- a/src/wc.c
+++ b/src/wc.c
@@ -216,14 +216,15 @@ wc (fd, file)
if (print_chars && !print_words && !print_lines)
{
- struct stat stats;
off_t current_pos, end_pos;
- if (fstat (fd, &stats) == 0 && S_ISREG (stats.st_mode)
- && (current_pos = lseek (fd, (off_t)0, SEEK_CUR)) != -1
- && (end_pos = lseek (fd, (off_t)0, SEEK_END)) != -1)
+ if ((current_pos = lseek (fd, (off_t) 0, SEEK_CUR)) != -1
+ && (end_pos = lseek (fd, (off_t) 0, SEEK_END)) != -1)
{
- chars = end_pos - current_pos;
+ off_t diff;
+ /* Be careful here. The current position may actually be
+ beyond the end of the file. As in the example above. */
+ chars = (diff = end_pos - current_pos) < 0 ? 0 : diff;
}
else
{