From: Tim Kientzle Date: Sat, 26 Feb 2011 05:24:54 +0000 (-0500) Subject: Change archive_set_error() to clear the error string before X-Git-Tag: v3.0.0a~679 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=53bd17eb51cdee60c929a205c831a08b353da52c;p=thirdparty%2Flibarchive.git Change archive_set_error() to clear the error string before putting the new error into it. SVN-Revision: 2989 --- diff --git a/Makefile.am b/Makefile.am index f6cf9ad48..6bd1a4a36 100644 --- a/Makefile.am +++ b/Makefile.am @@ -244,6 +244,7 @@ libarchive_test_SOURCES= \ libarchive/test/test_acl_pax.c \ libarchive/test/test_acl_posix1e.c \ libarchive/test/test_archive_api_feature.c \ + libarchive/test/test_archive_set_error.c \ libarchive/test/test_bad_fd.c \ libarchive/test/test_compat_bzip2.c \ libarchive/test/test_compat_cpio.c \ diff --git a/libarchive/archive_util.c b/libarchive/archive_util.c index bad58ea89..21ea2d9f2 100644 --- a/libarchive/archive_util.c +++ b/libarchive/archive_util.c @@ -175,6 +175,7 @@ archive_set_error(struct archive *a, int error_number, const char *fmt, ...) return; } + archive_string_empty(&(a->error_string)); va_start(ap, fmt); archive_string_vsprintf(&(a->error_string), fmt, ap); va_end(ap); diff --git a/libarchive/test/CMakeLists.txt b/libarchive/test/CMakeLists.txt index b319ed1e7..ace9a4900 100644 --- a/libarchive/test/CMakeLists.txt +++ b/libarchive/test/CMakeLists.txt @@ -13,6 +13,7 @@ IF(ENABLE_TEST) test_acl_pax.c test_acl_posix1e.c test_archive_api_feature.c + test_archive_set_error.c test_bad_fd.c test_compat_bzip2.c test_compat_cpio.c diff --git a/libarchive/test/test_archive_set_error.c b/libarchive/test/test_archive_set_error.c new file mode 100644 index 000000000..18897fbda --- /dev/null +++ b/libarchive/test/test_archive_set_error.c @@ -0,0 +1,51 @@ +/*- + * Copyright (c) 2011 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$"); + +static void +test(struct archive *a, int code, const char *msg) +{ + archive_set_error(a, code, "%s", msg); + + assertEqualInt(code, archive_errno(a)); + assertEqualString(msg, archive_error_string(a)); +} + +DEFINE_TEST(test_archive_set_error) +{ + struct archive* a = archive_read_new(); + + /* unlike printf("%s", NULL), + * archive_set_error(a, code, "%s", NULL) + * segfaults, so it's not tested here */ + test(a, 12, "abcdefgh"); + test(a, 0, "123456"); + test(a, -1, "tuvw"); + test(a, 34, "XYZ"); + + archive_read_finish(a); +}