1248590Smm/*- 2248590Smm * Copyright (c) 2003-2007 Tim Kientzle 3248590Smm * Copyright (c) 2009-2011 Michihiro NAKAJIMA 4248590Smm * All rights reserved. 5248590Smm * 6248590Smm * Redistribution and use in source and binary forms, with or without 7248590Smm * modification, are permitted provided that the following conditions 8248590Smm * are met: 9248590Smm * 1. Redistributions of source code must retain the above copyright 10248590Smm * notice, this list of conditions and the following disclaimer. 11248590Smm * 2. Redistributions in binary form must reproduce the above copyright 12248590Smm * notice, this list of conditions and the following disclaimer in the 13248590Smm * documentation and/or other materials provided with the distribution. 14248590Smm * 15248590Smm * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR 16248590Smm * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 17248590Smm * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18248590Smm * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, 19248590Smm * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 20248590Smm * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 21248590Smm * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 22248590Smm * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23248590Smm * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 24248590Smm * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25248590Smm */ 26248590Smm#include "test.h" 27248590Smm__FBSDID("$FreeBSD: head/lib/libarchive/test/test_read_uu.c 201248 2009-12-30 06:12:03Z kientzle $"); 28248590Smm 29248590Smmstatic const char archive[] = { 30248590Smm"begin 644 test_read_uu.Z\n" 31248590Smm"M'YV0+@`('$BPH,&#\"!,J7,BP(4(8$&_4J`$\"`,08$F%4O)AQ(\\2/(#7&@#%C\n" 32248590Smm"M!@T8-##.L`$\"QL@:-F(``%'#H<V;.'/J!%!G#ITP<BS\"H).FS<Z$1(T>/1A2\n" 33248590Smm"IHU\"0%9=*G4JUJM6K6+-JW<JUJ]>O8,.*'4NVK-FS:-.J7<NVK=NW9P$`\n" 34248590Smm"`\n" 35248590Smm"end\n" 36248590Smm}; 37248590Smm 38248590Smmstatic const char archive64[] = { 39248590Smm"begin-base64 644 test_read_uu.Z\n" 40248590Smm"H52QLgAIHEiwoMGDCBMqXMiwIUIYEG/UqAECAMQYEmFUvJhxI8SPIDXGgDFjBg0YNDDOsAECxsga\n" 41248590Smm"NmIAAFHDoc2bOHPqBFBnDp0wcizCoJOmzc6ERI0ePRhSo1CQFZdKnUq1qtWrWLNq3cq1q9evYMOK\n" 42248590Smm"HUu2rNmzaNOqXcu2rdu3ZwE=\n" 43248590Smm"====\n" 44248590Smm}; 45248590Smm 46248590Smmstatic const char extradata[] = { 47248590Smm"From uudecode@libarchive Mon Jun 2 03:03:31 2008\n" 48248590Smm"Return-Path: <uudecode@libarchive>\n" 49248590Smm"Received: from libarchive (localhost [127.0.0.1])\n" 50248590Smm" by libarchive (8.14.2/8.14.2) with ESMTP id m5233UT1006448\n" 51248590Smm" for <uudecode@libarchive>; Mon, 2 Jun 2008 03:03:31 GMT\n" 52248590Smm" (envelope-from uudecode@libarchive)\n" 53248590Smm"Received: (from uudecode@localhost)\n" 54248590Smm" by libarchive (8.14.2/8.14.2/Submit) id m5233U3e006406\n" 55248590Smm" for uudecode; Mon, 2 Jun 2008 03:03:30 GMT\n" 56248590Smm" (envelope-from root)\n" 57248590Smm"Date: Mon, 2 Jun 2008 03:03:30 GMT\n" 58248590Smm"From: Libarchive Test <uudecode@libarchive>\n" 59248590Smm"Message-Id: <200806020303.m5233U3e006406@libarchive>\n" 60248590Smm"To: uudecode@libarchive\n" 61248590Smm"Subject: Libarchive uudecode test\n" 62248590Smm"\n" 63248590Smm"* Redistribution and use in source and binary forms, with or without\n" 64248590Smm"* modification, are permitted provided that the following conditions\n" 65248590Smm"* are met:\n" 66248590Smm"\n" 67248590Smm"01234567890abcdeghijklmnopqrstuvwxyz\n" 68248590Smm"01234567890ABCEFGHIJKLMNOPQRSTUVWXYZ\n" 69248590Smm"\n" 70248590Smm}; 71248590Smm 72248590Smmstatic void 73248590Smmtest_read_uu_sub(const char *uudata, size_t uusize, int no_nl) 74248590Smm{ 75248590Smm struct archive_entry *ae; 76248590Smm struct archive *a; 77248590Smm char *buff; 78248590Smm char extradata_no_nl[sizeof(extradata)]; 79248590Smm const char *extradata_ptr; 80248590Smm int extra; 81248590Smm size_t size; 82248590Smm 83248590Smm if (no_nl) { 84248590Smm /* Remove '\n' from extra data to make a very long line. */ 85248590Smm char *p; 86248590Smm memcpy(extradata_no_nl, extradata, sizeof(extradata)); 87248590Smm extradata_ptr = extradata_no_nl; 88248590Smm for (p = extradata_no_nl; 89248590Smm *p && (p = strchr(p, '\n')) != NULL; p++) 90248590Smm *p = ' ';/* Replace '\n' with ' ' a space character. */ 91248590Smm } else 92248590Smm extradata_ptr = extradata; 93248590Smm 94248590Smm assert(NULL != (buff = malloc(uusize + 1024 * 1024))); 95248590Smm if (buff == NULL) 96248590Smm return; 97248590Smm for (extra = 0; extra <= 64; extra = extra==0?1:extra*2) { 98248590Smm char *p = buff; 99248590Smm 100248590Smm size = extra * 1024; 101248590Smm /* Add extra text size of which is from 1K bytes to 102248590Smm * 64Kbytes before uuencoded data. */ 103248590Smm while (size) { 104248590Smm if (size > sizeof(extradata)-1) { 105248590Smm memcpy(p, extradata_ptr, sizeof(extradata)-1); 106248590Smm p += sizeof(extradata)-1; 107248590Smm size -= sizeof(extradata)-1; 108248590Smm } else { 109248590Smm memcpy(p, extradata_ptr, size-1); 110248590Smm p += size-1; 111248590Smm *p++ = '\n';/* the last of extra text must have 112248590Smm * '\n' character. */ 113248590Smm break; 114248590Smm } 115248590Smm } 116248590Smm memcpy(p, uudata, uusize); 117248590Smm size = extra * 1024 + uusize; 118248590Smm 119248590Smm assert((a = archive_read_new()) != NULL); 120248590Smm assertEqualIntA(a, ARCHIVE_OK, 121248590Smm archive_read_support_filter_all(a)); 122248590Smm assertEqualIntA(a, ARCHIVE_OK, 123248590Smm archive_read_support_format_all(a)); 124248590Smm assertEqualIntA(a, ARCHIVE_OK, 125248590Smm read_open_memory(a, buff, size, 2)); 126248590Smm assertEqualIntA(a, ARCHIVE_OK, 127248590Smm archive_read_next_header(a, &ae)); 128248590Smm failure("archive_filter_name(a, 0)=\"%s\"" 129248590Smm "extra %d, NL %d", 130248590Smm archive_filter_name(a, 0), extra, !no_nl); 131248590Smm assertEqualInt(archive_filter_code(a, 0), 132248590Smm ARCHIVE_FILTER_COMPRESS); 133248590Smm failure("archive_format_name(a)=\"%s\"" 134248590Smm "extra %d, NL %d", 135248590Smm archive_format_name(a), extra, !no_nl); 136248590Smm assertEqualInt(archive_format(a), 137248590Smm ARCHIVE_FORMAT_TAR_USTAR); 138248590Smm assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); 139248590Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 140248590Smm } 141248590Smm 142248590Smm /* UUdecode bidder shouldn't scan too much data; make sure it 143248590Smm * fails if we put 512k of data before the start. */ 144248590Smm size = 512 * 1024; 145248590Smm for (extra = 0; (size_t)extra < size; ++extra) 146248590Smm buff[extra + 1024] = buff[extra]; 147248590Smm buff[size - 1] = '\n'; 148248590Smm memcpy(buff + size, uudata, uusize); 149248590Smm size += uusize; 150248590Smm assert((a = archive_read_new()) != NULL); 151248590Smm assertEqualIntA(a, ARCHIVE_OK, 152248590Smm archive_read_support_filter_all(a)); 153248590Smm assertEqualIntA(a, ARCHIVE_OK, 154248590Smm archive_read_support_format_all(a)); 155248590Smm assertEqualIntA(a, ARCHIVE_FATAL, 156248590Smm read_open_memory(a, buff, size, 2)); 157248590Smm assertEqualInt(ARCHIVE_OK, archive_read_free(a)); 158248590Smm 159248590Smm free(buff); 160248590Smm} 161248590Smm 162248590SmmDEFINE_TEST(test_read_filter_uudecode) 163248590Smm{ 164248590Smm /* Read the traditional uuencoded data. */ 165248590Smm test_read_uu_sub(archive, sizeof(archive)-1, 0); 166248590Smm /* Read the traditional uuencoded data with very long line extra 167248590Smm * data in front of it. */ 168248590Smm test_read_uu_sub(archive, sizeof(archive)-1, 1); 169248590Smm} 170248590Smm 171248590SmmDEFINE_TEST(test_read_filter_uudecode_base64) 172248590Smm{ 173248590Smm /* Read the Base64 uuencoded data. */ 174248590Smm test_read_uu_sub(archive64, sizeof(archive64)-1, 0); 175248590Smm /* Read the Base64 uuencoded data with very long line extra data 176248590Smm * in front of it. */ 177248590Smm test_read_uu_sub(archive64, sizeof(archive64)-1, 1); 178248590Smm} 179