svn commit: r323123 - in head/usr.bin/tail: . tests

Ngie Cooper yaneurabeya at gmail.com
Sat Sep 2 01:26:03 UTC 2017


> On Sep 1, 2017, at 15:37, Conrad Meyer <cem at FreeBSD.org> wrote:
> 
> Author: cem
> Date: Fri Sep  1 22:37:49 2017
> New Revision: 323123
> URL: https://svnweb.freebsd.org/changeset/base/323123
> 
> Log:
>  tail(1): Do not print bogus errno string
> 
>  In the case where write(2) does not return -1, it does not initialize errno.
>  This can happen when a broken pipe causes a short write.
> 
>  I attempted to adapt the submitted test case to ATF but could not figure out
>  how to make the test run in the ATF environment.  So the aborted test is
>  left disabled, in case someone would like to run it manually or fix it.
> 
>  PR:        221976
>  Submitted by:    <martin AT lispworks.com> (earlier version)
>  Sponsored by:    Dell EMC Isilon
> 
> Modified:
>  head/usr.bin/tail/extern.h
>  head/usr.bin/tail/tests/tail_test.sh
> 
> Modified: head/usr.bin/tail/extern.h
> ==============================================================================
> --- head/usr.bin/tail/extern.h    Fri Sep  1 22:04:45 2017    (r323122)
> +++ head/usr.bin/tail/extern.h    Fri Sep  1 22:37:49 2017    (r323123)
> @@ -32,9 +32,15 @@
>  */
> 
> #define    WR(p, size) do { \
> -    if (write(STDOUT_FILENO, p, size) != (ssize_t)size) \
> -        oerr(); \
> -    } while(0)
> +    ssize_t res; \
> +    res = write(STDOUT_FILENO, p, size); \
> +    if (res != (ssize_t)size) { \
> +        if (res == -1) \
> +            oerr(); \
> +        else \
> +            errx(1, "stdout"); \
> +    } \
> +} while (0)
> 
> #define TAILMAPLEN (4<<20)
> 
> 
> Modified: head/usr.bin/tail/tests/tail_test.sh
> ==============================================================================
> --- head/usr.bin/tail/tests/tail_test.sh    Fri Sep  1 22:04:45 2017    (r323122)
> +++ head/usr.bin/tail/tests/tail_test.sh    Fri Sep  1 22:37:49 2017    (r323123)
> @@ -215,7 +215,20 @@ longfile_rn2500_body()
>    atf_check cmp expectfile outpipe
> }
> 
> +atf_test_case broken_pipe
> +broken_pipe_head()
> +{
> +    atf_set "descr" "Do not print bogus errno based output on short writes"
> +}
> +broken_pipe_body()
> +{
> +    atf_expect_fail "Can't seem to get testcase to work in test environment.  Reproduces easily in interactive shell."
> 
> +    seq -f '%128g' 1 1000 > ints
> +    atf_check -s exit:1 -o ignore -e "inline:tail: stdout" tail -n 856 ints | awk '{ exit }'

Use need to use -x to run the command through the shell, e.g.

atf_check ... -x 'tail 856 ints| awk "{exit}"'

What the original pattern does is pipes atf_check to awk--which probably isn't what you want.

Seems like it could be written to not use a temporary file too.. I'll have to think about this.

-Ngie


More information about the svn-src-all mailing list