summaryrefslogtreecommitdiff
path: root/src/wc.c
diff options
context:
space:
mode:
authorPádraig Brady <P@draigBrady.com>2015-07-01 22:37:26 +0100
committerPádraig Brady <P@draigBrady.com>2015-07-02 03:53:59 +0100
commita645ce6c04719ad616ecd3bd7a16cd14772d6a74 (patch)
treeb223ae17b9c075d76178b4ee1b02b232012c77ae /src/wc.c
parent8bf2af685cf2cb1291fb03ec8a6942c26a7e0bd7 (diff)
downloadcoreutils-a645ce6c04719ad616ecd3bd7a16cd14772d6a74.tar.xz
wc: fix reading of /proc files on aarch64
tests/misc/wc-proc.sh fails when the page size is 64K * src/wc.c (wc): The lseek adjustment should be based on st_blksize, rather than on the internal buffer size. This is significant on aarch64 where st_blksize in /proc is the 64K (the page size) and thus larger than the internal buffer. * src/split.c (main): Even though the similar processing is done on the internal buffer size, that's based on st_blksize and so fine in this regard. Add an assert to enforce this. Avoid this path for the undocumented ---io-blksize option.
Diffstat (limited to 'src/wc.c')
-rw-r--r--src/wc.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/src/wc.c b/src/wc.c
index eb7b5b69a..9fbaee7bc 100644
--- a/src/wc.c
+++ b/src/wc.c
@@ -36,6 +36,7 @@
#include "quotearg.h"
#include "readtokens0.h"
#include "safe-read.h"
+#include "stat-size.h"
#include "xfreopen.h"
#if !defined iswspace && !HAVE_ISWSPACE
@@ -238,14 +239,14 @@ wc (int fd, char const *file_x, struct fstatus *fstatus, off_t current_pos)
if (0 < fstatus->failed)
fstatus->failed = fstat (fd, &fstatus->st);
- /* For sized files, seek to one buffer before EOF rather than to EOF.
+ /* For sized files, seek to one st_blksize before EOF rather than to EOF.
This works better for files in proc-like file systems where
the size is only approximate. */
if (! fstatus->failed && usable_st_size (&fstatus->st)
&& 0 <= fstatus->st.st_size)
{
size_t end_pos = fstatus->st.st_size;
- off_t hi_pos = end_pos - end_pos % BUFFER_SIZE;
+ off_t hi_pos = end_pos - end_pos % (ST_BLKSIZE (fstatus->st) + 1);
if (current_pos < 0)
current_pos = lseek (fd, 0, SEEK_CUR);
if (0 <= current_pos && current_pos < hi_pos