From: Jim Meyering Date: Sat, 16 Aug 2003 17:34:41 +0000 (+0000) Subject: (tail_lines): Fix a potential (but very hard to exercise) X-Git-Tag: v5.0.91~189 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f6008be14a876cbb13897b73e1feeaa0a7208aa5;p=thirdparty%2Fcoreutils.git (tail_lines): Fix a potential (but very hard to exercise) race condition bug. The bug would be triggered when tailing a file with file pointer not at beginning of file, and where the file was truncated to have a length of less than the initial offset at just the right moment (between the two lseek calls in this function). --- diff --git a/src/tail.c b/src/tail.c index 7d83787070..f4299c9b8f 100644 --- a/src/tail.c +++ b/src/tail.c @@ -1184,7 +1184,7 @@ tail_lines (const char *pretty_filename, int fd, uintmax_t n_lines, } else { - off_t start_pos; + off_t start_pos = -1; off_t end_pos; /* Use file_lines only if FD refers to a regular file for @@ -1201,6 +1201,13 @@ tail_lines (const char *pretty_filename, int fd, uintmax_t n_lines, } else { + /* Under very unlikely circumstances, it is possible to reach + this point after positioning the file pointer to end of file + via the `lseek (...SEEK_END)' above. In that case, reposition + the file pointer back to start_pos before calling pipe_lines. */ + if (start_pos != -1) + xlseek (fd, start_pos, SEEK_SET, pretty_filename); + return pipe_lines (pretty_filename, fd, n_lines, read_pos); } }