coreutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: coreutils-8.14.116-1e18d on NetBSD 5.1 - split bug


From: Jim Meyering
Subject: Re: coreutils-8.14.116-1e18d on NetBSD 5.1 - split bug
Date: Thu, 05 Jan 2012 11:49:26 +0100

Jim Meyering wrote:

> Bruno Haible wrote:
>>>   http://meyering.net/cu/coreutils-8.14.116-1e18d.tar.xz
>>
>> On NetBSD 5.1/x86, I get this test failure in particular:
>>
>>
>> FAIL: split/l-chunk
>> ===================
>> split: /dev/zero: No such file or directory
>> stat: cannot stat `x*': No such file or directory
>> rm: cannot remove `x??': No such file or directory
>>
>>
>> The first among these messages comes from this command:
>> $ ./split -n l/2 /dev/zero
>> ./split: /dev/zero: No such file or directory
>>
>> Single-stepping it, it gets to call
>> lines_chunk_split (k=0, n=2, buf=0x7f7ffda01000 "", bufsize=65536,
>> file_size=2)
>> and at split.c:625 the call
>>   full_read (STDIN_FILENO, buf, bufsize)
>> returns 65536, the same value as bufsize. The code in line 627 is buggy:
>> It uses errno even when full_read returned bufsize. But that value is
>> undefined.
>>
>> This patch fixes the bug and make the test succeed:
>>
>>
>> 2012-01-04  Bruno Haible  <address@hidden>
>>
>>      split: Avoid failure due to leftover 'errno' value.
>>      * src/split.c (lines_chunk_split): Fix logic.
>>
>> --- src/split.c.bak     2012-01-05 03:03:16.000000000 +0100
>> +++ src/split.c 2012-01-05 03:25:31.000000000 +0100
>> @@ -623,11 +623,11 @@
>>      {
>>        char *bp = buf, *eob;
>>        size_t n_read = full_read (STDIN_FILENO, buf, bufsize);
>> -      n_read = MIN (n_read, file_size - n_written);
>>        if (n_read < bufsize && errno)
>>          error (EXIT_FAILURE, errno, "%s", infile);
>>        else if (n_read == 0)
>>          break; /* eof.  */
>> +      n_read = MIN (n_read, file_size - n_written);
>>        chunk_truncated = false;
>>        eob = buf + n_read;
>
> Thanks for the analysis and patch.
> There was another problem just like that in bytes_chunk_extract.
>
> Here's a proposed patch.
> At first I was going to add a test to exercise the
> other failure, say with "split -n 1/2 /dev/zero || fail=1"
> (and may still add that), but currently split uses stat.st_size
> for a non-regular file, and that is not valid.  I don't want to
> test for behavior that will soon change.  stat's .st_size
> member is valid only for regular files.  We'll have to address
> that separately, maybe post-release.  I expect to make applying
> split to /dev/null fail like it does for pipes and terminals:
>
>     $ :|split -n 1/2
>     split: `-': cannot determine file size
>     [Exit 1]
>
>
>>From adf89fec89e0e8df14881e7853a77f889891fe29 Mon Sep 17 00:00:00 2001
> From: Bruno Haible <address@hidden>
> Date: Thu, 5 Jan 2012 09:26:32 +0100
> Subject: [PATCH] split: avoid failure due to leftover 'errno' value
>
> * src/split.c (lines_chunk_split): Fix logic bug that led to
> unwarranted failure of "split -n l/2 /dev/zero" on NetBSD 5.1.
> The same would happen when splitting a growing file, where
> open/lseek-end gives one size, but by the time we read, there
> is more data available.
> (bytes_chunk_extract): Likewise.
> * NEWS (Bug fixes): Mention this.
> But introduced with the chunk-selecting feature in v8.7-25-gbe10739.

I noticed and fixed that typo: s/But/Bug/
while adding this test:

commit 931e0f2a708965001857d60cedf1b1940389cbe6
Author: Bruno Haible <address@hidden>
Date:   Thu Jan 5 09:26:32 2012 +0100

    split: avoid failure due to leftover 'errno' value

    * src/split.c (lines_chunk_split): Fix logic bug that led to
    unwarranted failure of "split -n l/2 /dev/zero" on NetBSD 5.1.
    The same would happen when splitting a growing file, where
    open/lseek-end gives one size, but by the time we read, there
    is more data available.
    (bytes_chunk_extract): Likewise.
    * NEWS (Bug fixes): Mention this.
    * tests/split/l-chunk: The latter case was not exercised.
    Add code to do that.
    Bug introduced with the chunk-selecting feature in v8.7-25-gbe10739.

    Co-authored-by: Jim Meyering <address@hidden>

diff --git a/tests/split/l-chunk b/tests/split/l-chunk
index dd92b70..c4e6968 100755
--- a/tests/split/l-chunk
+++ b/tests/split/l-chunk
@@ -40,6 +40,9 @@ split -n l/2 /dev/zero
 test "$(stat -c %s x* | wc -l)" = '2' || fail=1
 rm x??

+# Repeat the above,  but with 1/2, not l/2:
+split -n 1/2 /dev/zero || fail=1
+
 # Ensure --elide-empty-files is honored
 split -e -n l/10 /dev/null || fail=1
 stat x?? 2>/dev/null && fail=1



reply via email to

[Prev in Thread] Current Thread [Next in Thread]