From owner-freebsd-bugs@FreeBSD.ORG Sun Feb 11 00:50:10 2007 Return-Path: X-Original-To: freebsd-bugs@freebsd.org Delivered-To: freebsd-bugs@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 69BDB16A401 for ; Sun, 11 Feb 2007 00:50:10 +0000 (UTC) (envelope-from kientzle@freebsd.org) Received: from kientzle.com (h-66-166-149-50.snvacaid.covad.net [66.166.149.50]) by mx1.freebsd.org (Postfix) with ESMTP id 436D013C441 for ; Sun, 11 Feb 2007 00:50:10 +0000 (UTC) (envelope-from kientzle@freebsd.org) Received: from [10.0.0.222] (p54.kientzle.com [66.166.149.54]) by kientzle.com (8.12.9/8.12.9) with ESMTP id l1B0FG24096801 for ; Sat, 10 Feb 2007 16:15:16 -0800 (PST) (envelope-from kientzle@freebsd.org) Message-ID: <45CE6014.2000500@freebsd.org> Date: Sat, 10 Feb 2007 16:15:16 -0800 From: Tim Kientzle User-Agent: Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.7.12) Gecko/20060422 X-Accept-Language: en-us, en MIME-Version: 1.0 CC: freebsd-bugs@freebsd.org References: <200702092105.l19L5rUg025648@freefall.freebsd.org> In-Reply-To: <200702092105.l19L5rUg025648@freefall.freebsd.org> Content-Type: text/plain; charset=us-ascii; format=flowed Content-Transfer-Encoding: 7bit Subject: Re: bin/108990: incorrect error handling in tar(1) for files that change size X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 11 Feb 2007 00:50:10 -0000 Ade Lovett wrote: > Synopsis: incorrect error handling in tar(1) for files that change size > > http://www.freebsd.org/cgi/query-pr.cgi?pr=108990 This is caused by a recent fix to libarchive, which no longer silently consumes data written past the end of the entry. I think the patch presented in the PR is acceptable, but I like this better. Any concerns? Index: write.c =================================================================== --- write.c (revision 120) +++ write.c (working copy) @@ -851,11 +851,19 @@ bytes_read = read(fd, buff, sizeof(buff)); while (bytes_read > 0) { bytes_written = archive_write_data(a, buff, bytes_read); - if (bytes_written <= 0) { + if (bytes_written < 0) { /* Write failed; this is bad */ bsdtar_warnc(bsdtar, 0, "%s", archive_error_string(a)); return (-1); } + if (bytes_written < bytes_read) { + /* Write was truncated; warn but continue. */ + bsdtar_warnc(bsdtar, 0, + "Truncated write; file may have grown while being archived."); + /* Make bsdtar return a final error. */ + bsdtar->return_value = 1; + return (0); + } bytes_read = read(fd, buff, sizeof(buff)); } return 0;