From aeac648465f402f72d68b524e13c740293bf49ce Mon Sep 17 00:00:00 2001 From: ph10 Date: Mon, 13 Nov 2017 17:12:55 +0000 Subject: [PATCH] Fix crash for --line-buffered with a .gz or .bz2 file in pcre2grep. --- ChangeLog | 4 ++++ doc/pcre2grep.1 | 34 +++++++++++++++++++--------------- src/pcre2grep.c | 1 + 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6881e62..99bb834 100644 --- a/ChangeLog +++ b/ChangeLog @@ -51,6 +51,10 @@ subsequent lines. Behaviour was different with and without colouring, and sometimes context lines were incorrectly printed and/or line endings were lost. All these issues should now be fixed. +14. If --line-buffered was specified for pcre2grep when input was from a +compressed file (.gz or .bz2) a segfault occurred. (Line buffering should be +ignored for compressed files.) + Version 10.30 14-August-2017 ---------------------------- diff --git a/doc/pcre2grep.1 b/doc/pcre2grep.1 index 1f6146f..e4c8687 100644 --- a/doc/pcre2grep.1 +++ b/doc/pcre2grep.1 @@ -1,4 +1,4 @@ -.TH PCRE2GREP 1 "23 October 2017" "PCRE2 10.31" +.TH PCRE2GREP 1 "13 November 2017" "PCRE2 10.31" .SH NAME pcre2grep - a grep with Perl-compatible regular expressions. .SH SYNOPSIS @@ -101,11 +101,13 @@ The \fB--locale\fP option can be used to override this. .rs .sp It is possible to compile \fBpcre2grep\fP so that it uses \fBlibz\fP or -\fBlibbz2\fP to read files whose names end in \fB.gz\fP or \fB.bz2\fP, -respectively. You can find out whether your binary has support for one or both -of these file types by running it with the \fB--help\fP option. If the -appropriate support is not present, files are treated as plain text. The -standard input is always so treated. +\fBlibbz2\fP to read compressed files whose names end in \fB.gz\fP or +\fB.bz2\fP, respectively. You can find out whether your \fBpcre2grep\fP binary +has support for one or both of these file types by running it with the +\fB--help\fP option. If the appropriate support is not present, all files are +treated as plain text. The standard input is always so treated. When input is +from a compressed .gz or .bz2 file, the \fB--line-buffered\fP option is +ignored. . . .SH "BINARY FILES" @@ -417,14 +419,16 @@ are being output. If not supplied, "(standard input)" is used. There is no short form for this option. .TP \fB--line-buffered\fP -When this option is given, input is read and processed line by line, and the -output is flushed after each write. By default, input is read in large chunks, -unless \fBpcre2grep\fP can determine that it is reading from a terminal (which -is currently possible only in Unix-like environments). Output to terminal is -normally automatically flushed by the operating system. This option can be -useful when the input or output is attached to a pipe and you do not want -\fBpcre2grep\fP to buffer up large amounts of data. However, its use will -affect performance, and the \fB-M\fP (multiline) option ceases to work. +When this option is given, non-compressed input is read and processed line by +line, and the output is flushed after each write. By default, input is read in +large chunks, unless \fBpcre2grep\fP can determine that it is reading from a +terminal (which is currently possible only in Unix-like environments). Output +to terminal is normally automatically flushed by the operating system. This +option can be useful when the input or output is attached to a pipe and you do +not want \fBpcre2grep\fP to buffer up large amounts of data. However, its use +will affect performance, and the \fB-M\fP (multiline) option ceases to work. +When input is from a compressed .gz or .bz2 file, \fB--line-buffered\fP is +ignored. .TP \fB--line-offsets\fP Instead of showing lines or parts of lines that match, show each match as a @@ -858,6 +862,6 @@ Cambridge, England. .rs .sp .nf -Last updated: 23 October 2017 +Last updated: 13 November 2017 Copyright (c) 1997-2017 University of Cambridge. .fi diff --git a/src/pcre2grep.c b/src/pcre2grep.c index bec07e1..c7c95c5 100644 --- a/src/pcre2grep.c +++ b/src/pcre2grep.c @@ -2332,6 +2332,7 @@ if (frtype != FR_LIBZ && frtype != FR_LIBBZ2) in = (FILE *)handle; if (is_file_tty(in)) input_line_buffered = TRUE; } +else input_line_buffered = FALSE; bufflength = fill_buffer(handle, frtype, main_buffer, bufsize, input_line_buffered);