test_write_open_memory.c revision 228753
1228753Smm/*- 2228753Smm * Copyright (c) 2003-2007 Tim Kientzle 3228753Smm * All rights reserved. 4228753Smm * 5228753Smm * Redistribution and use in source and binary forms, with or without 6228753Smm * modification, are permitted provided that the following conditions 7228753Smm * are met: 8228753Smm * 1. Redistributions of source code must retain the above copyright 9228753Smm * notice, this list of conditions and the following disclaimer. 10228753Smm * 2. Redistributions in binary form must reproduce the above copyright 11228753Smm * notice, this list of conditions and the following disclaimer in the 12228753Smm * documentation and/or other materials provided with the distribution. 13228753Smm * 14228753Smm * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR 15228753Smm * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 16228753Smm * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 17228753Smm * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, 18228753Smm * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 19228753Smm * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 20228753Smm * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 21228753Smm * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22228753Smm * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 23228753Smm * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24228753Smm */ 25228753Smm#include "test.h" 26228753Smm__FBSDID("$FreeBSD: head/lib/libarchive/test/test_write_open_memory.c 189308 2009-03-03 17:02:51Z kientzle $"); 27228753Smm 28228753Smm/* Try to force archive_write_open_memory.c to write past the end of an array. */ 29228753Smmstatic unsigned char buff[16384]; 30228753Smm 31228753SmmDEFINE_TEST(test_write_open_memory) 32228753Smm{ 33228753Smm unsigned int i; 34228753Smm struct archive *a; 35228753Smm struct archive_entry *ae; 36228753Smm const char *name="/tmp/test"; 37228753Smm 38228753Smm /* Create a simple archive_entry. */ 39228753Smm assert((ae = archive_entry_new()) != NULL); 40228753Smm archive_entry_set_pathname(ae, name); 41228753Smm archive_entry_set_mode(ae, S_IFREG); 42228753Smm assertEqualString(archive_entry_pathname(ae), name); 43228753Smm 44228753Smm /* Try writing with different buffer sizes. */ 45228753Smm /* Make sure that we get failure on too-small buffers, success on 46228753Smm * large enough ones. */ 47228753Smm for (i = 100; i < 1600; i++) { 48228753Smm size_t s; 49228753Smm size_t blocksize = 94; 50228753Smm assert((a = archive_write_new()) != NULL); 51228753Smm assertA(0 == archive_write_set_format_ustar(a)); 52228753Smm assertA(0 == archive_write_set_bytes_in_last_block(a, 1)); 53228753Smm assertA(0 == archive_write_set_bytes_per_block(a, (int)blocksize)); 54228753Smm buff[i] = 0xAE; 55228753Smm assertA(0 == archive_write_open_memory(a, buff, i, &s)); 56228753Smm /* If buffer is smaller than a tar header, this should fail. */ 57228753Smm if (i < (511/blocksize)*blocksize) 58228753Smm assertA(ARCHIVE_FATAL == archive_write_header(a,ae)); 59228753Smm else 60228753Smm assertA(0 == archive_write_header(a, ae)); 61228753Smm /* If buffer is smaller than a tar header plus 1024 byte 62228753Smm * end-of-archive marker, then this should fail. */ 63228753Smm if (i < 1536) 64228753Smm assertA(ARCHIVE_FATAL == archive_write_close(a)); 65228753Smm else 66228753Smm assertA(0 == archive_write_close(a)); 67228753Smm#if ARCHIVE_VERSION_NUMBER < 2000000 68228753Smm archive_write_finish(a); 69228753Smm#else 70228753Smm assert(0 == archive_write_finish(a)); 71228753Smm#endif 72228753Smm assert(buff[i] == 0xAE); 73228753Smm assert(s <= i); 74228753Smm } 75228753Smm archive_entry_free(ae); 76228753Smm} 77