svn commit: r189473 - in head/lib/libarchive: . test

Tim Kientzle kientzle at FreeBSD.org
Fri Mar 6 18:09:22 PST 2009


Author: kientzle
Date: Sat Mar  7 02:09:21 2009
New Revision: 189473
URL: http://svn.freebsd.org/changeset/base/189473

Log:
  Merge r658 from libarchive.googlecode.com: Only flush and close the
  file if it was actually opened.  Test for this case.

Added:
  head/lib/libarchive/test/test_read_file_nonexistent.c   (contents, props changed)
Modified:
  head/lib/libarchive/archive_read_open_filename.c
  head/lib/libarchive/test/Makefile

Modified: head/lib/libarchive/archive_read_open_filename.c
==============================================================================
--- head/lib/libarchive/archive_read_open_filename.c	Sat Mar  7 01:21:46 2009	(r189472)
+++ head/lib/libarchive/archive_read_open_filename.c	Sat Mar  7 02:09:21 2009	(r189473)
@@ -238,30 +238,32 @@ file_close(struct archive *a, void *clie
 
 	(void)a; /* UNUSED */
 
-	/*
-	 * Sometimes, we should flush the input before closing.
-	 *   Regular files: faster to just close without flush.
-	 *   Devices: must not flush (user might need to
-	 *      read the "next" item on a non-rewind device).
-	 *   Pipes and sockets:  must flush (otherwise, the
-	 *      program feeding the pipe or socket may complain).
-	 * Here, I flush everything except for regular files and
-	 * device nodes.
-	 */
-	if (!S_ISREG(mine->st_mode)
-	    && !S_ISCHR(mine->st_mode)
-	    && !S_ISBLK(mine->st_mode)) {
-		ssize_t bytesRead;
-		do {
-			bytesRead = read(mine->fd, mine->buffer,
-			    mine->block_size);
-		} while (bytesRead > 0);
+	/* Only flush and close if open succeeded. */
+	if (mine->fd >= 0) {
+		/*
+		 * Sometimes, we should flush the input before closing.
+		 *   Regular files: faster to just close without flush.
+		 *   Devices: must not flush (user might need to
+		 *      read the "next" item on a non-rewind device).
+		 *   Pipes and sockets:  must flush (otherwise, the
+		 *      program feeding the pipe or socket may complain).
+		 * Here, I flush everything except for regular files and
+		 * device nodes.
+		 */
+		if (!S_ISREG(mine->st_mode)
+		    && !S_ISCHR(mine->st_mode)
+		    && !S_ISBLK(mine->st_mode)) {
+			ssize_t bytesRead;
+			do {
+				bytesRead = read(mine->fd, mine->buffer,
+				    mine->block_size);
+			} while (bytesRead > 0);
+		}
+		/* If a named file was opened, then it needs to be closed. */
+		if (mine->filename[0] != '\0')
+			close(mine->fd);
 	}
-	/* If a named file was opened, then it needs to be closed. */
-	if (mine->filename[0] != '\0')
-		close(mine->fd);
-	if (mine->buffer != NULL)
-		free(mine->buffer);
+	free(mine->buffer);
 	free(mine);
 	return (ARCHIVE_OK);
 }

Modified: head/lib/libarchive/test/Makefile
==============================================================================
--- head/lib/libarchive/test/Makefile	Sat Mar  7 01:21:46 2009	(r189472)
+++ head/lib/libarchive/test/Makefile	Sat Mar  7 02:09:21 2009	(r189473)
@@ -29,6 +29,7 @@ TESTS= \
 	test_read_data_large.c			\
 	test_read_disk.c			\
 	test_read_extract.c			\
+	test_read_file_nonexistent.c		\
 	test_read_format_ar.c			\
 	test_read_format_cpio_bin.c		\
 	test_read_format_cpio_bin_Z.c		\

Added: head/lib/libarchive/test/test_read_file_nonexistent.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/lib/libarchive/test/test_read_file_nonexistent.c	Sat Mar  7 02:09:21 2009	(r189473)
@@ -0,0 +1,37 @@
+/*-
+ * Copyright (c) 2003-2009 Tim Kientzle
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+#include "test.h"
+__FBSDID("$FreeBSD$");
+
+DEFINE_TEST(test_read_file_nonexistent)
+{
+	struct archive* a = archive_read_new();
+	assertEqualInt(ARCHIVE_OK, archive_read_support_format_all(a));
+	assertEqualInt(ARCHIVE_FATAL,
+	    archive_read_open_filename(a, "notexistent.tar", 512));
+	archive_read_finish(a);
+}
+
+


More information about the svn-src-all mailing list