From 7d880888bb81af209c40b99768bd407b4b5c50e9 Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Tue, 19 Nov 2013 12:19:40 -0500 Subject: [PATCH 0001/1548] Split element --- tools/fiwalk/src/fiwalk_tsk.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/tools/fiwalk/src/fiwalk_tsk.cpp b/tools/fiwalk/src/fiwalk_tsk.cpp index ef7879930e..e322bd99bf 100644 --- a/tools/fiwalk/src/fiwalk_tsk.cpp +++ b/tools/fiwalk/src/fiwalk_tsk.cpp @@ -247,8 +247,8 @@ process_tsk_file(TSK_FS_FILE * fs_file, const char *path) { /* fs_file->meta */ file_info("filesize",fs_file->meta->size); - if(fs_file->meta->flags & TSK_FS_META_FLAG_ALLOC) file_info("alloc",1); - if(fs_file->meta->flags & TSK_FS_META_FLAG_UNALLOC) file_info("unalloc",1); + if(fs_file->meta->flags & TSK_FS_META_FLAG_ALLOC) file_info("alloc_inode",1); + if(fs_file->meta->flags & TSK_FS_META_FLAG_UNALLOC) file_info("alloc_inode",0); if(fs_file->meta->flags & TSK_FS_META_FLAG_USED) file_info("used",1); if(fs_file->meta->flags & TSK_FS_META_FLAG_UNUSED) file_info("unused",1); if(fs_file->meta->flags & TSK_FS_META_FLAG_ORPHAN) file_info("orphan",1); @@ -293,10 +293,15 @@ process_tsk_file(TSK_FS_FILE * fs_file, const char *path) } } } + + if(fs_file->name != NULL) + { + if(fs_file->name->flags & TSK_FS_META_FLAG_ALLOC) file_info("alloc_name",1); + if(fs_file->name->flags & TSK_FS_META_FLAG_UNALLOC) file_info("alloc_name",0); + } + if(fs_file->meta == NULL) { - if(fs_file->name->flags & TSK_FS_META_FLAG_ALLOC) file_info("alloc",1); - if(fs_file->name->flags & TSK_FS_META_FLAG_UNALLOC) file_info("unalloc",1); if(fs_file->name->flags & TSK_FS_META_FLAG_USED) file_info("used",1); if(fs_file->name->flags & TSK_FS_META_FLAG_UNUSED) file_info("unused",1); if(fs_file->name->flags & TSK_FS_META_FLAG_ORPHAN) file_info("orphan",1); From 9fb66b2a8eff93eec1e03deae4550167b702e254 Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Tue, 19 Nov 2013 12:24:23 -0500 Subject: [PATCH 0002/1548] Tag output version as extended 1.1.0 --- tools/fiwalk/src/fiwalk.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/fiwalk/src/fiwalk.cpp b/tools/fiwalk/src/fiwalk.cpp index e32c55aa3c..23b3712967 100644 --- a/tools/fiwalk/src/fiwalk.cpp +++ b/tools/fiwalk/src/fiwalk.cpp @@ -690,7 +690,7 @@ int main(int argc, char * const *argv1) "\n xmlns='http://www.forensicswiki.org/wiki/Category:Digital_Forensics_XML'" "\n xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'" "\n xmlns:dc='http://purl.org/dc/elements/1.1/'" - "\n version='1.0'" ); + "\n version='1.1.0+'" ); x->push("metadata", ""); x->xmlout("dc:type","Disk Image",fw_empty,false); x->pop(); From 5c0b65ef1e941702fb95ef29316d08ac42339fe9 Mon Sep 17 00:00:00 2001 From: Alex Nelson Date: Wed, 20 Nov 2013 11:38:54 -0500 Subject: [PATCH 0003/1548] Reorder allocation elements --- tools/fiwalk/src/fiwalk_tsk.cpp | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/tools/fiwalk/src/fiwalk_tsk.cpp b/tools/fiwalk/src/fiwalk_tsk.cpp index e322bd99bf..593910515d 100644 --- a/tools/fiwalk/src/fiwalk_tsk.cpp +++ b/tools/fiwalk/src/fiwalk_tsk.cpp @@ -243,12 +243,26 @@ process_tsk_file(TSK_FS_FILE * fs_file, const char *path) file_info("id",next_id++); file_info("name_type",tsk_fs_name_type_str[fs_file->name->type]); - if(fs_file->meta != NULL) + /* Report metadata structures' allocation first */ + if (fs_file->meta != NULL) { - /* fs_file->meta */ - file_info("filesize",fs_file->meta->size); + // Also report filesize to preserve the original element order, and save an if branch + file_info("filesize",fs_file->meta->size); + if(fs_file->meta->flags & TSK_FS_META_FLAG_ALLOC) file_info("alloc_inode",1); if(fs_file->meta->flags & TSK_FS_META_FLAG_UNALLOC) file_info("alloc_inode",0); + } + if(fs_file->name != NULL) + { + if(fs_file->name->flags & TSK_FS_META_FLAG_ALLOC) file_info("alloc_name",1); + if(fs_file->name->flags & TSK_FS_META_FLAG_UNALLOC) file_info("alloc_name",0); + } + + + /* Report contents of metadata structures */ + if(fs_file->meta != NULL) + { + /* fs_file->meta */ if(fs_file->meta->flags & TSK_FS_META_FLAG_USED) file_info("used",1); if(fs_file->meta->flags & TSK_FS_META_FLAG_UNUSED) file_info("unused",1); if(fs_file->meta->flags & TSK_FS_META_FLAG_ORPHAN) file_info("orphan",1); @@ -294,12 +308,6 @@ process_tsk_file(TSK_FS_FILE * fs_file, const char *path) } } - if(fs_file->name != NULL) - { - if(fs_file->name->flags & TSK_FS_META_FLAG_ALLOC) file_info("alloc_name",1); - if(fs_file->name->flags & TSK_FS_META_FLAG_UNALLOC) file_info("alloc_name",0); - } - if(fs_file->meta == NULL) { if(fs_file->name->flags & TSK_FS_META_FLAG_USED) file_info("used",1); From 8a23dcb1d2b67cc356c2c2a2d0df89e83a98ad92 Mon Sep 17 00:00:00 2001 From: Shujian Yang Date: Sun, 21 Feb 2016 20:58:59 -0600 Subject: [PATCH 0004/1548] Use GUID partition type as gpt partition description --- tsk/vs/gpt.c | 93 ++++++++++++++++++++++++++++++++++++++---------- tsk/vs/tsk_gpt.h | 16 +++++++-- 2 files changed, 88 insertions(+), 21 deletions(-) diff --git a/tsk/vs/gpt.c b/tsk/vs/gpt.c index 22754c193b..c2437c6fb2 100644 --- a/tsk/vs/gpt.c +++ b/tsk/vs/gpt.c @@ -16,6 +16,73 @@ #include "tsk_dos.h" +/* + *Check if GUID matches a given value. + */ +static int +gpt_guid_match(GUID * g, uint32_t d1, uint16_t d2, uint16_t d3, uint64_t d4) +{ + if(g->data_1 != d1 || g->data_2 != d2 || g->data_3 != d3) + return 0; + + uint64_t p4 = (uint64_t)g->data_4[0]; + int i; + for(i=1; i<8; ++i){ + p4 = p4 << 8; + p4 += (uint64_t)g->data_4[i]; + } + + if(p4 != d4) + return 0; + else + return 1; +} + + + +/* + *get_guid_type + * + *Get partition type by reading GUID value. + * + *Source: https://en.wikipedia.org/wiki/GUID_Partition_Table + */ +static void +gpt_guid_type(char * desc, GUID * g) +{ + if(gpt_guid_match(g, 0, 0, 0, 0)) + snprintf(desc, GUID_DESC_LEN, "Unused entry"); + else if(gpt_guid_match(g, 0x024DEE41, 0x33E7, 0x11D3, 0x9D690008C781F39F)) + snprintf(desc, GUID_DESC_LEN, "MBR partition scheme"); + else if(gpt_guid_match(g, 0xC12A7328, 0xF81F, 0x11D2, 0xBA4B00A0C93EC93B)) + snprintf(desc, GUID_DESC_LEN, "EFI System partition"); + else if(gpt_guid_match(g, 0x21686148, 0x6449, 0x6E6F, 0x744E656564454649)) + snprintf(desc, GUID_DESC_LEN, "BIOS Boot partition"); + else if(gpt_guid_match(g, 0xD3BFE2DE, 0x3DAF, 0x11DF, 0xBA40E3A556D89593)) + snprintf(desc, GUID_DESC_LEN, "Intel Fast Flash partition"); + else if(gpt_guid_match(g, 0xF4019732, 0x066E, 0x4E12, 0x8273346C5641494F)) + snprintf(desc, GUID_DESC_LEN, "Sony boot partition"); + else if(gpt_guid_match(g, 0xBFBFAFE7, 0xA34F, 0x448A, 0x9A5B6213EB736C22)) + snprintf(desc, GUID_DESC_LEN, "Lenovo boot partition"); + else if(gpt_guid_match(g, 0xE3C9E316, 0x0B5C, 0x4DB8, 0x817DF92DF00215AE)) + snprintf(desc, GUID_DESC_LEN, "Microsoft Reserved Partition"); + else if(gpt_guid_match(g, 0xDE94BBA4, 0x06D1, 0x4D40, 0xA16ABFD50179D6AC)) + snprintf(desc, GUID_DESC_LEN, "Windows Recovery Environment"); + else if(gpt_guid_match(g, 0xEBD0A0A2, 0xB9E5, 0x4433, 0x87C068B6B72699C7)) + snprintf(desc, GUID_DESC_LEN, "Basic data partition"); + else if(gpt_guid_match(g, 0x5808C8AA, 0x7E8F, 0x42E0, 0x85D2E1E90434CFB3)) + snprintf(desc, GUID_DESC_LEN, "Logical Disk Manager metadata partition"); + else if(gpt_guid_match(g, 0xAF9B60A0, 0x1431, 0x4F62, 0xBC683311714A69AD)) + snprintf(desc, GUID_DESC_LEN, "Logical Disk Manager data partition"); + else if(gpt_guid_match(g, 0x37AFFC90, 0xEF7D, 0x4E96, 0x91C32D7AE055B174)) + snprintf(desc, GUID_DESC_LEN, "GPFS partition"); + else if(gpt_guid_match(g, 0xE75CAF8F, 0xF680, 0x4CEE, 0xAFA3B001E56EFC2D)) + snprintf(desc, GUID_DESC_LEN, "Storage Spaces partition"); + else + snprintf(desc, GUID_DESC_LEN, "[Unkown type]"); +} + + /* * Process the partition table at the sector address * @@ -192,9 +259,9 @@ gpt_load_table(TSK_VS_INFO * vs) for (; (uintptr_t) ent < (uintptr_t) ent_buf + vs->block_size && i < tsk_getu32(vs->endian, &head->tab_num_ent); i++) { - UTF16 *name16; + /*UTF16 *name16; UTF8 *name8; - int retVal; + int retVal;*/ if (tsk_verbose) tsk_fprintf(stderr, @@ -223,28 +290,16 @@ gpt_load_table(TSK_VS_INFO * vs) } - if ((name = tsk_malloc(256)) == NULL) { + if ((name = tsk_malloc(GUID_DESC_LEN)) == NULL) { free(sect_buf); free(ent_buf); return 1; } - name16 = (UTF16 *) ((uintptr_t) ent->name); - name8 = (UTF8 *) name; - - retVal = - tsk_UTF16toUTF8(vs->endian, (const UTF16 **) &name16, - (UTF16 *) ((uintptr_t) name16 + sizeof(ent->name)), - &name8, - (UTF8 *) ((uintptr_t) name8 + 256), TSKlenientConversion); - - if (retVal != TSKconversionOK) { - if (tsk_verbose) - tsk_fprintf(stderr, - "gpt_load_table: Error converting name to UTF8: %d\n", - retVal); - *name = '\0'; - } + + /*Find GUID partition type and use as description*/ + gpt_guid_type(name, &(ent->type_guid)); + if (NULL == tsk_vs_part_add(vs, (TSK_DADDR_T) tsk_getu64(vs->endian, ent->start_lba), diff --git a/tsk/vs/tsk_gpt.h b/tsk/vs/tsk_gpt.h index b265bcc2bc..172d905fa1 100644 --- a/tsk/vs/tsk_gpt.h +++ b/tsk/vs/tsk_gpt.h @@ -28,6 +28,18 @@ extern "C" { #define GPT_HEAD_OFFSET 1 #define GPT_HEAD_SIG 0x5452415020494645ULL +/*Length of a GUID partition type description*/ +#define GUID_DESC_LEN 64 + +/*Definiation of GUID struct.*/ + typedef struct{ + uint32_t data_1; + uint16_t data_2; + uint16_t data_3; + uint8_t data_4[8]; + } GUID; + + typedef struct { uint8_t signature[8]; /* EFI PART */ uint8_t version[4]; @@ -49,8 +61,8 @@ extern "C" { /* The location of this is specified in the header - tab_start */ typedef struct { - uint8_t type_guid[16]; /* partition type guid */ - uint8_t id_guid[16]; /* unique partition GUID */ + GUID type_guid; /* partition type GUID */ + GUID id_guid; /* unique partition GUID */ uint8_t start_lba[8]; /* Starting lba of part */ uint8_t end_lba[8]; /* end lba of part */ uint8_t flags[8]; /* flags */ From 875fc5c79a4d0b473cd0657d67ee0df29693def1 Mon Sep 17 00:00:00 2001 From: Shujian Yang Date: Fri, 26 Aug 2016 06:39:14 -0500 Subject: [PATCH 0005/1548] Improve GUID type analysis. --- tsk/vs/gpt.c | 252 ++++++++++++++++++++++++++++++++++++++++++++--- tsk/vs/tsk_gpt.h | 8 +- 2 files changed, 242 insertions(+), 18 deletions(-) diff --git a/tsk/vs/gpt.c b/tsk/vs/gpt.c index c2437c6fb2..8f0fd8c0fb 100644 --- a/tsk/vs/gpt.c +++ b/tsk/vs/gpt.c @@ -16,11 +16,19 @@ #include "tsk_dos.h" -/* - *Check if GUID matches a given value. +/** + * Check if GUID matches a given value. + * + * @param g The GUID to match. + * @param d1 First 4 bytes of the given value. + * @param d2 Next 2 bytes of the given value following d1. + * @param d3 Next 2 bytes of the given value following d2. + * @param d4 Next 8 bytes of the given value following d3. + * @returns 1 if they match, 0 if they do not. + * */ static int -gpt_guid_match(GUID * g, uint32_t d1, uint16_t d2, uint16_t d3, uint64_t d4) +gpt_guid_match(gpt_guid * g, uint32_t d1, uint16_t d2, uint16_t d3, uint64_t d4) { if(g->data_1 != d1 || g->data_2 != d2 || g->data_3 != d3) return 0; @@ -40,15 +48,18 @@ gpt_guid_match(GUID * g, uint32_t d1, uint16_t d2, uint16_t d3, uint64_t d4) -/* - *get_guid_type +/** * - *Get partition type by reading GUID value. + * Get partition type by reading GUID value. + * Source: https://en.wikipedia.org/wiki/GUID_Partition_Table + * + * @param desc C-string to store the description. + * @param g Type GUID to compare. + * @returns 1 if matched type found, 0 if not. * - *Source: https://en.wikipedia.org/wiki/GUID_Partition_Table */ -static void -gpt_guid_type(char * desc, GUID * g) +static int +gpt_guid_type(char * desc, gpt_guid * g) { if(gpt_guid_match(g, 0, 0, 0, 0)) snprintf(desc, GUID_DESC_LEN, "Unused entry"); @@ -64,6 +75,7 @@ gpt_guid_type(char * desc, GUID * g) snprintf(desc, GUID_DESC_LEN, "Sony boot partition"); else if(gpt_guid_match(g, 0xBFBFAFE7, 0xA34F, 0x448A, 0x9A5B6213EB736C22)) snprintf(desc, GUID_DESC_LEN, "Lenovo boot partition"); + else if(gpt_guid_match(g, 0xE3C9E316, 0x0B5C, 0x4DB8, 0x817DF92DF00215AE)) snprintf(desc, GUID_DESC_LEN, "Microsoft Reserved Partition"); else if(gpt_guid_match(g, 0xDE94BBA4, 0x06D1, 0x4D40, 0xA16ABFD50179D6AC)) @@ -78,8 +90,202 @@ gpt_guid_type(char * desc, GUID * g) snprintf(desc, GUID_DESC_LEN, "GPFS partition"); else if(gpt_guid_match(g, 0xE75CAF8F, 0xF680, 0x4CEE, 0xAFA3B001E56EFC2D)) snprintf(desc, GUID_DESC_LEN, "Storage Spaces partition"); - else + + else if(gpt_guid_match(g, 0x75894C1E, 0x3AEB, 0x11D3, 0xB7C17B03A0000000)) + snprintf(desc, GUID_DESC_LEN, "HP-UX Data partition"); + else if(gpt_guid_match(g, 0xE2A1E728, 0x32E3, 0x11D6, 0xA6827B03A0000000)) + snprintf(desc, GUID_DESC_LEN, "HP-UX Data partition"); + + else if(gpt_guid_match(g, 0x0FC63DAF, 0x8483, 0x4772, 0x8E793D69D8477DE4)) + snprintf(desc, GUID_DESC_LEN, "Linux filesystem data"); + else if(gpt_guid_match(g, 0xA19D880F, 0x05FC, 0x4D3B, 0xA006743F0F84911E)) + snprintf(desc, GUID_DESC_LEN, "Linux RAID partition"); + else if(gpt_guid_match(g, 0x44479540, 0xF297, 0x41B2, 0x9AF7D131D5F0458A)) + snprintf(desc, GUID_DESC_LEN, "Linux Root partition (x86)"); + else if(gpt_guid_match(g, 0x4F68BCE3, 0xE8CD, 0x4DB1, 0x96E7FBCAF984B709)) + snprintf(desc, GUID_DESC_LEN, "Linux Root partition (x86-64)"); + else if(gpt_guid_match(g, 0x69DAD710, 0x2CE4, 0x4E3C, 0xB16C21A1D49ABED3)) + snprintf(desc, GUID_DESC_LEN, "Linux Root partition (32-bit ARM)"); + else if(gpt_guid_match(g, 0x0657FD6D, 0xA4AB, 0x43C4, 0x84E50933C84B4F4F)) + snprintf(desc, GUID_DESC_LEN, "Linux swap partition"); + else if(gpt_guid_match(g, 0x933AC7E1, 0x2EB4, 0x4F13, 0xB8440E14E2AEF915)) + snprintf(desc, GUID_DESC_LEN, "Linux /home partition"); + else if(gpt_guid_match(g, 0x3B8F8425, 0x20E0, 0x4F3B, 0x907F1A25A76F98E8)) + snprintf(desc, GUID_DESC_LEN, "/srv (server data) partition"); + else if(gpt_guid_match(g, 0x7FFEC5C9, 0x2D00, 0x49B7, 0x89413EA10A5586B7)) + snprintf(desc, GUID_DESC_LEN, "Plain dm-crypt partition"); + else if(gpt_guid_match(g, 0xCA7D7CCB, 0x63ED, 0x4C53, 0x861C1742536059CC)) + snprintf(desc, GUID_DESC_LEN, "LUKS partition"); + else if(gpt_guid_match(g, 0x8DA63339, 0x0007, 0x60C0, 0xC436083AC8230908)) + snprintf(desc, GUID_DESC_LEN, "Reserved"); + + else if(gpt_guid_match(g, 0x83BD6B9D, 0x7F41, 0x11DC, 0xBE0B001560B84F0F)) + snprintf(desc, GUID_DESC_LEN, "FreeBSD Boot partition"); + else if(gpt_guid_match(g, 0x516E7CB4, 0x6ECF, 0x11D6, 0x8FF800022D09712B)) + snprintf(desc, GUID_DESC_LEN, "FreeBSD Data partition"); + else if(gpt_guid_match(g, 0x516E7CB5, 0x6ECF, 0x11D6, 0x8FF800022D09712B)) + snprintf(desc, GUID_DESC_LEN, "FreeBSD Swap partition"); + else if(gpt_guid_match(g, 0x516E7CB6, 0x6ECF, 0x11D6, 0x8FF800022D09712B)) + snprintf(desc, GUID_DESC_LEN, "FreeBSD Unix File System (UFS) partition"); + else if(gpt_guid_match(g, 0x516E7CB8, 0x6ECF, 0x11D6, 0x8FF800022D09712B)) + snprintf(desc, GUID_DESC_LEN, "FreeBSD Vinum volume manager partition"); + else if(gpt_guid_match(g, 0x516E7CBA, 0x6ECF, 0x11D6, 0x8FF800022D09712B)) + snprintf(desc, GUID_DESC_LEN, "FreeBSD ZFS partition"); + + else if(gpt_guid_match(g, 0x48465300, 0x0000, 0x11AA, 0xAA1100306543ECAC)) + snprintf(desc, GUID_DESC_LEN, "OS X Hierarchical File System Plus (HFS+) partition"); + else if(gpt_guid_match(g, 0x55465300, 0x0000, 0x11AA, 0xAA1100306543ECAC)) + snprintf(desc, GUID_DESC_LEN, "OS X Apple UFS"); + else if(gpt_guid_match(g, 0x6A898CC3, 0x1DD2, 0x11B2, 0x99A6080020736631)) + snprintf(desc, GUID_DESC_LEN, "OS X ZFS"); + else if(gpt_guid_match(g, 0x52414944, 0x0000, 0x11AA, 0xAA1100306543ECAC)) + snprintf(desc, GUID_DESC_LEN, "OS X Apple RAID partition"); + else if(gpt_guid_match(g, 0x52414944, 0x5F4F, 0x11AA, 0xAA1100306543ECAC)) + snprintf(desc, GUID_DESC_LEN, "OS X Apple RAID partition, offline"); + else if(gpt_guid_match(g, 0x426F6F74, 0x0000, 0x11AA, 0xAA1100306543ECAC)) + snprintf(desc, GUID_DESC_LEN, "OS X Apple Boot partition (Recovery HD)"); + else if(gpt_guid_match(g, 0x4C616265, 0x6C00, 0x11AA, 0xAA1100306543ECAC)) + snprintf(desc, GUID_DESC_LEN, "OS X Apple Label"); + else if(gpt_guid_match(g, 0x5265636F, 0x7665, 0x11AA, 0xAA1100306543ECAC)) + snprintf(desc, GUID_DESC_LEN, "OS X Apple TV Recovery partition"); + else if(gpt_guid_match(g, 0x53746F72, 0x6167, 0x11AA, 0xAA1100306543ECAC)) + snprintf(desc, GUID_DESC_LEN, "OS X Apple Core Storage (i.e. Lion FileVault) partition"); + else if(gpt_guid_match(g, 0x6A82CB45, 0x1DD2, 0x11B2, 0x99A6080020736631)) + + snprintf(desc, GUID_DESC_LEN, "Solaris Boot partition"); + else if(gpt_guid_match(g, 0x6A85CF4D, 0x1DD2, 0x11B2, 0x99A6080020736631)) + snprintf(desc, GUID_DESC_LEN, "Solaris Root partition"); + else if(gpt_guid_match(g, 0x6A87C46F, 0x1DD2, 0x11B2, 0x99A6080020736631)) + snprintf(desc, GUID_DESC_LEN, "Solaris Swap partition"); + else if(gpt_guid_match(g, 0x6A8B642B, 0x1DD2, 0x11B2, 0x99A6080020736631)) + snprintf(desc, GUID_DESC_LEN, "Solaris Backup partition"); + else if(gpt_guid_match(g, 0x6A898CC3, 0x1DD2, 0x11B2, 0x99A6080020736631)) + snprintf(desc, GUID_DESC_LEN, "Solaris /usr partition"); + else if(gpt_guid_match(g, 0x6A8EF2E9, 0x1DD2, 0x11B2, 0x99A6080020736631)) + snprintf(desc, GUID_DESC_LEN, "Solaris /var partition"); + else if(gpt_guid_match(g, 0x6A90BA39, 0x1DD2, 0x11B2, 0x99A6080020736631)) + snprintf(desc, GUID_DESC_LEN, "Solaris /home partition"); + else if(gpt_guid_match(g, 0x6A9283A5, 0x1DD2, 0x11B2, 0x99A6080020736631)) + snprintf(desc, GUID_DESC_LEN, "Solaris Alternate sector"); + else if(gpt_guid_match(g, 0x6A945A3B, 0x1DD2, 0x11B2, 0x99A6080020736631)) + snprintf(desc, GUID_DESC_LEN, "Solaris Reserved partition"); + else if(gpt_guid_match(g, 0x6A9630D1, 0x1DD2, 0x11B2, 0x99A6080020736631)) + snprintf(desc, GUID_DESC_LEN, "Solaris Reserved partition"); + else if(gpt_guid_match(g, 0x6A980767, 0x1DD2, 0x11B2, 0x99A6080020736631)) + snprintf(desc, GUID_DESC_LEN, "Solaris Reserved partition"); + else if(gpt_guid_match(g, 0x6A96237F, 0x1DD2, 0x11B2, 0x99A6080020736631)) + snprintf(desc, GUID_DESC_LEN, "Solaris Reserved partition"); + else if(gpt_guid_match(g, 0x6A8D2AC7, 0x1DD2, 0x11B2, 0x99A6080020736631)) + snprintf(desc, GUID_DESC_LEN, "Solaris Reserved partition"); + + else if(gpt_guid_match(g, 0x49F48D32, 0xB10E, 0x11DC, 0xB99B0019D1879648)) + snprintf(desc, GUID_DESC_LEN, "NetBSD Swap partition"); + else if(gpt_guid_match(g, 0x49F48D5A, 0xB10E, 0x11DC, 0xB99B0019D1879648)) + snprintf(desc, GUID_DESC_LEN, "NetBSD FFS partition"); + else if(gpt_guid_match(g, 0x49F48D82, 0xB10E, 0x11DC, 0xB99B0019D1879648)) + snprintf(desc, GUID_DESC_LEN, "NetBSD LFS partition"); + else if(gpt_guid_match(g, 0x49F48DAA, 0xB10E, 0x11DC, 0xB99B0019D1879648)) + snprintf(desc, GUID_DESC_LEN, "NetBSD RAID partition"); + else if(gpt_guid_match(g, 0x2DB519C4, 0xB10F, 0x11DC, 0xB99B0019D1879648)) + snprintf(desc, GUID_DESC_LEN, "NetBSD Concatenated partition"); + else if(gpt_guid_match(g, 0x2DB519EC, 0xB10F, 0x11DC, 0xB99B0019D1879648)) + snprintf(desc, GUID_DESC_LEN, "NetBSD Encrypted partition"); + + else if(gpt_guid_match(g, 0xFE3A2A5D, 0x4F32, 0x41A7, 0xB725ACCC3285A309)) + snprintf(desc, GUID_DESC_LEN, "ChromeOS kernel"); + else if(gpt_guid_match(g, 0x3CB8E202, 0x3B7E, 0x47DD, 0x8A3C7FF2A13CFCEC)) + snprintf(desc, GUID_DESC_LEN, "ChromeOS rootfs"); + else if(gpt_guid_match(g, 0x2E0A753D, 0x9E48, 0x43B0, 0x8337B15192CB1B5E)) + snprintf(desc, GUID_DESC_LEN, "ChromeOS future use"); + + else if(gpt_guid_match(g, 0x42465331, 0x3BA3, 0x10F1, 0x802A4861696B7521)) + snprintf(desc, GUID_DESC_LEN, "Haiku BFS"); + + else if(gpt_guid_match(g, 0x85D5E45E, 0x237C, 0x11E1, 0xB4B3E89A8F7FC3A7)) + snprintf(desc, GUID_DESC_LEN, "MidnightBSD Boot partition"); + else if(gpt_guid_match(g, 0x85D5E45A, 0x237C, 0x11E1, 0xB4B3E89A8F7FC3A7)) + snprintf(desc, GUID_DESC_LEN, "MidnightBSD Data partition"); + else if(gpt_guid_match(g, 0x85D5E45B, 0x237C, 0x11E1, 0xB4B3E89A8F7FC3A7)) + snprintf(desc, GUID_DESC_LEN, "MidnightBSD Swap partition"); + else if(gpt_guid_match(g, 0x0394EF8B, 0x237E, 0x11E1, 0xB4B3E89A8F7FC3A7)) + snprintf(desc, GUID_DESC_LEN, "MidnightBSD Unix File System (UFS) partition"); + else if(gpt_guid_match(g, 0x85D5E45C, 0x237C, 0x11E1, 0xB4B3E89A8F7FC3A7)) + snprintf(desc, GUID_DESC_LEN, "MidnightBSD Vinum volume manager partition"); + else if(gpt_guid_match(g, 0x85D5E45D, 0x237C, 0x11E1, 0xB4B3E89A8F7FC3A7)) + snprintf(desc, GUID_DESC_LEN, "MidnightBSD ZFS partition"); + + else if(gpt_guid_match(g, 0x45B0969E, 0x9B03, 0x4F30, 0xB4C6B4B80CEFF106)) + snprintf(desc, GUID_DESC_LEN, "Ceph Journal"); + else if(gpt_guid_match(g, 0x45B0969E, 0x9B03, 0x4F30, 0xB4C65EC00CEFF106)) + snprintf(desc, GUID_DESC_LEN, "Ceph dm-crypt Encrypted Journal"); + else if(gpt_guid_match(g, 0x4FBD7E29, 0x9D25, 0x41B8, 0xAFD0062C0CEFF05D)) + snprintf(desc, GUID_DESC_LEN, "Ceph OSD"); + else if(gpt_guid_match(g, 0x4FBD7E29, 0x9D25, 0x41B8, 0xAFD05EC00CEFF05D)) + snprintf(desc, GUID_DESC_LEN, "Ceph dm-crypt OSD"); + else if(gpt_guid_match(g, 0x89C57F98, 0x2FE5, 0x4DC0, 0x89C1F3AD0CEFF2BE)) + snprintf(desc, GUID_DESC_LEN, "Ceph disk in creation"); + else if(gpt_guid_match(g, 0x89C57F98, 0x2FE5, 0x4DC0, 0x89C15EC00CEFF2BE)) + snprintf(desc, GUID_DESC_LEN, "Ceph dm-crypt disk in creation"); + + else if(gpt_guid_match(g, 0x824CC7A0, 0x36A8, 0x11E3, 0x890A952519AD3F61)) + snprintf(desc, GUID_DESC_LEN, "OpenBSD Data partition"); + + else if(gpt_guid_match(g, 0xCEF5A9AD, 0x73BC, 0x4601, 0x89F3CDEEEEE321A1)) + snprintf(desc, GUID_DESC_LEN, "QNX Power-safe (QNX6) file system"); + + else if(gpt_guid_match(g, 0xC91818F9, 0x8025, 0x47AF, 0x89D2F030D7000C2C)) + snprintf(desc, GUID_DESC_LEN, "Plan 9 partition"); + else if(gpt_guid_match(g, 0x9D275380, 0x40AD, 0x11DB, 0xBF97000C2911D1B8)) + snprintf(desc, GUID_DESC_LEN, "vmkcore (coredump partition)"); + else if(gpt_guid_match(g, 0xAA31E02A, 0x400F, 0x11DB, 0x9590000C2911D1B8)) + snprintf(desc, GUID_DESC_LEN, "VMFS filesystem partition"); + else if(gpt_guid_match(g, 0x9198EFFC, 0x31C0, 0x11DB, 0x8F78000C2911D1B8)) + snprintf(desc, GUID_DESC_LEN, "VMware Reserved"); + + else if(gpt_guid_match(g, 0x2568845D, 0x2332, 0x4675, 0xBC398FA5A4748D15)) + snprintf(desc, GUID_DESC_LEN, "Android-IA Bootloader"); + else if(gpt_guid_match(g, 0x114EAFFE, 0x1552, 0x4022, 0xB26E9B053604CF84)) + snprintf(desc, GUID_DESC_LEN, "Android-IA Bootloader2"); + else if(gpt_guid_match(g, 0x49A4D17F, 0x93A3, 0x45C1, 0xA0DEF50B2EBE2599)) + snprintf(desc, GUID_DESC_LEN, "Android-IA Boot"); + else if(gpt_guid_match(g, 0x4177C722, 0x9E92, 0x4AAB, 0x864443502BFD5506)) + snprintf(desc, GUID_DESC_LEN, "Android-IA Recovery"); + else if(gpt_guid_match(g, 0xEF32A33B, 0xA409, 0x486C, 0x91419FFB711F6266)) + snprintf(desc, GUID_DESC_LEN, "Android-IA Misc"); + else if(gpt_guid_match(g, 0x20AC26BE, 0x20B7, 0x11E3, 0x84C56CFDB94711E9)) + snprintf(desc, GUID_DESC_LEN, "Android-IA Metadata"); + else if(gpt_guid_match(g, 0x38F428E6, 0xD326, 0x425D, 0x91406E0EA133647C)) + snprintf(desc, GUID_DESC_LEN, "Android-IA System"); + else if(gpt_guid_match(g, 0xA893EF21, 0xE428, 0x470A, 0x9E550668FD91A2D9)) + snprintf(desc, GUID_DESC_LEN, "Android-IA Cache"); + else if(gpt_guid_match(g, 0xDC76DDA9, 0x5AC1, 0x491C, 0xAF42A82591580C0D)) + snprintf(desc, GUID_DESC_LEN, "Android-IA Data"); + else if(gpt_guid_match(g, 0xEBC597D0, 0x2053, 0x4B15, 0x8B64E0AAC75F4DB1)) + snprintf(desc, GUID_DESC_LEN, "Android-IA Persistent"); + else if(gpt_guid_match(g, 0x8F68CC74, 0xC5E5, 0x48DA, 0xBE91A0C8C15E9C80)) + snprintf(desc, GUID_DESC_LEN, "Android-IA Factory"); + else if(gpt_guid_match(g, 0x767941D0, 0x2085, 0x11E3, 0xAD3B6CFDB94711E9)) + snprintf(desc, GUID_DESC_LEN, "Android-IA Fastboot / Tertiary"); + else if(gpt_guid_match(g, 0xAC6D7924, 0xEB71, 0x4DF8, 0xB48DE267B27148FF)) + snprintf(desc, GUID_DESC_LEN, "Android-IA OEM"); + + else if(gpt_guid_match(g, 0x7412F7D5, 0xA156, 0x4B13, 0x81DC867174929325)) + snprintf(desc, GUID_DESC_LEN, "ONIE Boot"); + else if(gpt_guid_match(g, 0xD4E6E2CD, 0x4469, 0x46F3, 0xB5CB1BFF57AFC149)) + snprintf(desc, GUID_DESC_LEN, "ONIE Config"); + + else if(gpt_guid_match(g, 0x9E1A2D38, 0xC612, 0x4316, 0xAA268B49521E5A8B)) + snprintf(desc, GUID_DESC_LEN, "PowerPC PReP boot"); + + else if(gpt_guid_match(g, 0xBC13C2FF, 0x59E6, 0x4262, 0xA352B275FD6F7172)) + snprintf(desc, GUID_DESC_LEN, "Freedesktop Extended Boot Partition ($BOOT)"); + + else { snprintf(desc, GUID_DESC_LEN, "[Unkown type]"); + return 0; + } + + return 1; } @@ -259,9 +465,9 @@ gpt_load_table(TSK_VS_INFO * vs) for (; (uintptr_t) ent < (uintptr_t) ent_buf + vs->block_size && i < tsk_getu32(vs->endian, &head->tab_num_ent); i++) { - /*UTF16 *name16; + UTF16 *name16; UTF8 *name8; - int retVal;*/ + int retVal; if (tsk_verbose) tsk_fprintf(stderr, @@ -297,8 +503,26 @@ gpt_load_table(TSK_VS_INFO * vs) } - /*Find GUID partition type and use as description*/ - gpt_guid_type(name, &(ent->type_guid)); + /*Find GUID partition type and use as description.*/ + /*If GUID type is unknown, use description stored in gpt entry.*/ + if( ! gpt_guid_type(name, &(ent->type_guid))) { + name16 = (UTF16 *) ((uintptr_t) ent->name); + name8 = (UTF8 *) name; + + retVal = + tsk_UTF16toUTF8(vs->endian, (const UTF16 **) &name16, + (UTF16 *) ((uintptr_t) name16 + sizeof(ent->name)), + &name8, + (UTF8 *) ((uintptr_t) name8 + 256), TSKlenientConversion); + + if (retVal != TSKconversionOK) { + if (tsk_verbose) + tsk_fprintf(stderr, + "gpt_load_table: Error converting name to UTF8: %d\n", + retVal); + *name = '\0'; + } + } if (NULL == tsk_vs_part_add(vs, diff --git a/tsk/vs/tsk_gpt.h b/tsk/vs/tsk_gpt.h index 172d905fa1..75e9302375 100644 --- a/tsk/vs/tsk_gpt.h +++ b/tsk/vs/tsk_gpt.h @@ -29,7 +29,7 @@ extern "C" { #define GPT_HEAD_SIG 0x5452415020494645ULL /*Length of a GUID partition type description*/ -#define GUID_DESC_LEN 64 +#define GUID_DESC_LEN 256 /*Definiation of GUID struct.*/ typedef struct{ @@ -37,7 +37,7 @@ extern "C" { uint16_t data_2; uint16_t data_3; uint8_t data_4[8]; - } GUID; + } gpt_guid; typedef struct { @@ -61,8 +61,8 @@ extern "C" { /* The location of this is specified in the header - tab_start */ typedef struct { - GUID type_guid; /* partition type GUID */ - GUID id_guid; /* unique partition GUID */ + gpt_guid type_guid; /* partition type GUID */ + gpt_guid id_guid; /* unique partition GUID */ uint8_t start_lba[8]; /* Starting lba of part */ uint8_t end_lba[8]; /* end lba of part */ uint8_t flags[8]; /* flags */ From f8c1cada7f01826b15a82b20600b8df7562fa2ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B6kt=C3=BCrk=20Y=C3=BCksek?= Date: Wed, 28 Nov 2018 21:33:46 -0500 Subject: [PATCH 0006/1548] Allow --enable-offline to accept a directory argument for jar libs Allow the hardcoded default_jar_location in build.xml to /usr/share/java to be changed using the argument provided to --enable-offline. Note that this changes the behavior of the switch from "anything other than yes or no is incorrect" to "anything other than no implies offline mode". --- bindings/java/Makefile.am | 4 ++++ configure.ac | 10 +++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/bindings/java/Makefile.am b/bindings/java/Makefile.am index ad27526eda..f0bb9f687d 100644 --- a/bindings/java/Makefile.am +++ b/bindings/java/Makefile.am @@ -7,6 +7,10 @@ jar_DATA = $(tsk_jar) if OFFLINE ant_args=-Doffline=true +if CUSTOM_DEFAULT_JAR_LOCATION + ant_args+= -Ddefault-jar-location="@DEFAULT_JAR_LOCATION@" +else +endif else endif diff --git a/configure.ac b/configure.ac index dc9026ed75..d3d41646cb 100644 --- a/configure.ac +++ b/configure.ac @@ -221,10 +221,18 @@ AC_ARG_ENABLE([offline], [case "${enableval}" in yes) offline=true ;; no) offline=false ;; - *) AC_MSG_ERROR([bad value ${enableval} for --enable-online]) ;; + *) + offline=true + default_jar_location="${enableval}" + ;; esac],[offline=false]) AM_CONDITIONAL([OFFLINE], [test "x$offline" = xtrue]) +AM_CONDITIONAL([CUSTOM_DEFAULT_JAR_LOCATION], [test "x$default_jar_location" != "x"]) +AM_COND_IF([CUSTOM_DEFAULT_JAR_LOCATION], + [AC_SUBST([DEFAULT_JAR_LOCATION], [$default_jar_location])] +) + dnl Check if we should link libewf. From 6a46aea77e97d930cb5398cd646a4fae36364757 Mon Sep 17 00:00:00 2001 From: sokdak Date: Thu, 28 Feb 2019 16:58:46 +0900 Subject: [PATCH 0007/1548] XFS implementation --- Makefile.am | 2 +- tsk/fs/Makefile.am | 3 +- tsk/fs/fs_open.c | 4 + tsk/fs/fs_types.c | 1 + tsk/fs/tsk_fs.h | 14 +- tsk/fs/tsk_fs_i.h | 2 + tsk/fs/tsk_xfs.h | 1363 ++++++++++++++++++++++++++++++++++++++++++++ tsk/fs/xfs.c | 891 +++++++++++++++++++++++++++++ tsk/fs/xfs_dent.c | 424 ++++++++++++++ 9 files changed, 2701 insertions(+), 3 deletions(-) create mode 100644 tsk/fs/tsk_xfs.h create mode 100644 tsk/fs/xfs.c create mode 100644 tsk/fs/xfs_dent.c diff --git a/Makefile.am b/Makefile.am index 45ac05e297..a684d0edd1 100644 --- a/Makefile.am +++ b/Makefile.am @@ -80,7 +80,7 @@ nobase_include_HEADERS = tsk/libtsk.h tsk/tsk_incs.h \ tsk/vs/tsk_mac.h tsk/vs/tsk_sun.h \ tsk/fs/tsk_fs.h tsk/fs/tsk_ffs.h tsk/fs/tsk_ext2fs.h tsk/fs/tsk_fatfs.h \ tsk/fs/tsk_ntfs.h tsk/fs/tsk_iso9660.h tsk/fs/tsk_hfs.h tsk/fs/tsk_yaffs.h \ - tsk/fs/tsk_exfatfs.h tsk/fs/tsk_fatxxfs.h \ + tsk/fs/tsk_exfatfs.h tsk/fs/tsk_fatxxfs.h tsk/fs/tsk_xfs.h \ tsk/hashdb/tsk_hashdb.h tsk/auto/tsk_auto.h \ tsk/auto/tsk_is_image_supported.h diff --git a/tsk/fs/Makefile.am b/tsk/fs/Makefile.am index 797d3d48e0..a8473e9af5 100644 --- a/tsk/fs/Makefile.am +++ b/tsk/fs/Makefile.am @@ -13,11 +13,12 @@ libtskfs_la_SOURCES = tsk_fs_i.h fs_inode.c fs_io.c fs_block.c fs_open.c \ exfatfs.c exfatfs_meta.c exfatfs_dent.c \ fatfs_utils.c \ ntfs.c ntfs_dent.cpp swapfs.c rawfs.c \ + xfs.c xfs_dent.c \ iso9660.c iso9660_dent.c \ hfs.c hfs_dent.c hfs_journal.c hfs_unicompare.c lzvn.c lzvn.h \ dcalc_lib.c dcat_lib.c dls_lib.c dstat_lib.c ffind_lib.c \ fls_lib.c icat_lib.c ifind_lib.c ils_lib.c usn_journal.c usnjls_lib.c \ - walk_cpp.cpp yaffs.cpp + walk_cpp.cpp yaffs.cpp indent: indent *.c *.h diff --git a/tsk/fs/fs_open.c b/tsk/fs/fs_open.c index 602d3677dc..b52e7b883a 100644 --- a/tsk/fs/fs_open.c +++ b/tsk/fs/fs_open.c @@ -96,6 +96,7 @@ tsk_fs_open_img(TSK_IMG_INFO * a_img_info, TSK_OFF_T a_offset, { "EXT2/3/4", ext2fs_open, TSK_FS_TYPE_EXT_DETECT }, { "UFS", ffs_open, TSK_FS_TYPE_FFS_DETECT }, { "YAFFS2", yaffs2_open, TSK_FS_TYPE_YAFFS2_DETECT }, + { "XFS", xfs_open, TSK_FS_TYPE_XFS_DETECT }, #if TSK_USE_HFS { "HFS", hfs_open, TSK_FS_TYPE_HFS_DETECT }, #endif @@ -183,6 +184,9 @@ tsk_fs_open_img(TSK_IMG_INFO * a_img_info, TSK_OFF_T a_offset, else if (TSK_FS_TYPE_ISYAFFS2(a_ftype)) { return yaffs2_open(a_img_info, a_offset, a_ftype, 0); } + else if (TSK_FS_TYPE_ISXFS(a_ftype)) { + return xfs_open(a_img_info, a_offset, a_ftype, 0); + } tsk_error_reset(); tsk_error_set_errno(TSK_ERR_FS_UNSUPTYPE); tsk_error_set_errstr("%X", (int) a_ftype); diff --git a/tsk/fs/fs_types.c b/tsk/fs/fs_types.c index aea78769e9..ec6db23218 100644 --- a/tsk/fs/fs_types.c +++ b/tsk/fs/fs_types.c @@ -56,6 +56,7 @@ static FS_TYPES fs_type_table[] = { {"ufs1", TSK_FS_TYPE_FFS1, "UFS1"}, {"ufs2", TSK_FS_TYPE_FFS2, "UFS2"}, {"yaffs2", TSK_FS_TYPE_YAFFS2, "YAFFS2"}, + {"xfs", TSK_FS_TYPE_XFS, "XFS"}, {0,0,""} }; diff --git a/tsk/fs/tsk_fs.h b/tsk/fs/tsk_fs.h index c1669e3f9e..2fa3ae689c 100644 --- a/tsk/fs/tsk_fs.h +++ b/tsk/fs/tsk_fs.h @@ -426,7 +426,10 @@ extern "C" { typedef enum TSK_FS_META_CONTENT_TYPE_ENUM { TSK_FS_META_CONTENT_TYPE_DEFAULT = 0x0, - TSK_FS_META_CONTENT_TYPE_EXT4_EXTENTS = 0x1 ///< Ext4 with extents instead of individual pointers + TSK_FS_META_CONTENT_TYPE_EXT4_EXTENTS = 0x1, ///< Ext4 with extents instead of individual pointers + TSK_FS_META_CONTENT_TYPE_XFS_DATA_FORK_SHORTFORM = 0x02, + TSK_FS_META_CONTENT_TYPE_XFS_DATA_FORK_EXTENTS = 0x03, + TSK_FS_META_CONTENT_TYPE_XFS_DATA_FORK_BTREE = 0x04 } TSK_FS_META_CONTENT_TYPE_ENUM; @@ -797,6 +800,8 @@ extern "C" { TSK_FS_TYPE_EXT4 = 0x00002000, ///< Ext4 file system TSK_FS_TYPE_YAFFS2 = 0x00004000, ///< YAFFS2 file system TSK_FS_TYPE_YAFFS2_DETECT = 0x00004000, ///< YAFFS2 auto detection + TSK_FS_TYPE_XFS = 0x00008000, ///< XFS file system + TSK_FS_TYPE_XFS_DETECT = 0x00008000, ///< XFS auto detection TSK_FS_TYPE_UNSUPP = 0xffffffff, ///< Unsupported file system }; /* NOTE: Update bindings/java/src/org/sleuthkit/datamodel/TskData.java @@ -859,6 +864,13 @@ extern "C" { #define TSK_FS_TYPE_ISYAFFS2(ftype) \ (((ftype) & TSK_FS_TYPE_YAFFS2_DETECT)?1:0) + /** + * \ingroup fslib + * Macro that takes a file system type and returns 1 if the type + * is for a YAFFS2 file system. */ +#define TSK_FS_TYPE_ISXFS(ftype) \ + (((ftype) & TSK_FS_TYPE_XFS_DETECT)?1:0) + /** * \ingroup fslib * Macro that takes a file system type and returns 1 if the type diff --git a/tsk/fs/tsk_fs_i.h b/tsk/fs/tsk_fs_i.h index fe2714927c..98403cd9ef 100644 --- a/tsk/fs/tsk_fs_i.h +++ b/tsk/fs/tsk_fs_i.h @@ -199,6 +199,8 @@ extern "C" { TSK_FS_TYPE_ENUM, uint8_t); extern TSK_FS_INFO *yaffs2_open(TSK_IMG_INFO *, TSK_OFF_T, TSK_FS_TYPE_ENUM, uint8_t); + extern TSK_FS_INFO *xfs_open(TSK_IMG_INFO *, TSK_OFF_T, + TSK_FS_TYPE_ENUM, uint8_t); /* Generic functions for swap and raw -- many say "not supported" */ extern uint8_t tsk_fs_nofs_fsstat(TSK_FS_INFO * fs, FILE * hFile); diff --git a/tsk/fs/tsk_xfs.h b/tsk/fs/tsk_xfs.h new file mode 100644 index 0000000000..5727b7929e --- /dev/null +++ b/tsk/fs/tsk_xfs.h @@ -0,0 +1,1363 @@ +#ifndef _TSK_XFS_H +#define _TSK_XFS_H + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +static int files_found; + +typedef int64_t xfs_off_t; /* type */ +typedef uint32_t xfs_rfsblock_t; /* blockno in filesystem (raw) */ +typedef uint64_t XFS_AGNUM_T; +typedef uint xfs_dir2_data_aoff_t; /* argument form */ +typedef uint32_t xfs_dir2_dataptr_t; + +#define __round_mask(x, y) ((__typeof__(x))((y)-1)) +#define round_up(x, y) ((((x)-1) | __round_mask(x, y))+1) + +#define XFS_MIN_AG_BLOCKS 64 +// for checking filesystem sanity checking +#define XFS_MAX_DBLOCKS(fs, s) ( \ + tsk_getu32(&(fs->endian), (s)->sb_agcount) * \ + tsk_getu32(&(fs->endian), (s)->sb_agblocks)) + +#define XFS_MIN_DBLOCKS(fs, s) ( \ + (tsk_getu32(&(fs->endian), ((s)->sb_agcount)) - 1) * \ + tsk_getu32(&(fs->endian), (s)->sb_agblocks) + XFS_MIN_AG_BLOCKS) + + +/* + * masks with n high/low bits set, 64-bit values + */ +static inline uint64_t xfs_mask64hi(int n) +{ + return (uint64_t)-1 << (64 - (n)); +} + +static inline uint32_t xfs_mask32lo(int n) +{ + return ((uint32_t)1 << (n)) - 1; +} + +static inline uint64_t xfs_mask64lo(int n) +{ + return ((uint64_t)1 << (n)) - 1; +} + + +#define XFS_FSB_TO_AGNO(xfs,fsbno) \ + ((uint32_t)((fsbno) >> (xfs)->fs->sb_agblklog)) + +#define XFS_FSB_TO_AGBNO(xfs,fsbno) \ + ((uint32_t)((fsbno) & xfs_mask32lo((xfs)->fs->sb_agblklog))) + +#define XFS_FSB_TO_SECNO(xfs,fsbno) \ + ((uint32_t)((fsbno) & xfs_mask32lo((xfs)->fs->sb_agblklog))) + +#define XFS_MAXNAMELEN 255 + +#define XFS_INODE_CORE_SIZE_VER4 96 +#define XFS_INODE_CORE_SIZE_VER5 176 + +/* + * Bmap btree record and extent descriptor. + * l0:63 is an extent flag (value 1 indicates non-normal). + * l0:9-62 are startoff. + * l0:0-8 and l1:21-63 are startblock. + * l1:0-20 are blockcount. + */ +#define BMBT_EXNTFLAG_BITLEN 1 +#define BMBT_STARTOFF_BITLEN 54 +#define BMBT_STARTBLOCK_BITLEN 52 +#define BMBT_BLOCKCOUNT_BITLEN 21 + +#define XFS_CONTENT_LEN_V4(xfs) (tsk_getu16((xfs)->fs_info.endian, (xfs)->fs->sb_inodesize) - XFS_INODE_CORE_SIZE_VER4) +#define XFS_CONTENT_LEN_V5(xfs) (tsk_getu16((xfs)->fs_info.endian, (xfs)->fs->sb_inodesize) - XFS_INODE_CORE_SIZE_VER5) + +/* + * Minimum and maximum blocksize and sectorsize. + * The blocksize upper limit is pretty much arbitrary. + * The sectorsize upper limit is due to sizeof(sb_sectsize). + * CRC enable filesystems use 512 byte inodes, meaning 512 byte block sizes + * cannot be used. + */ +#define XFS_MIN_BLOCKSIZE_LOG 9 /* i.e. 512 bytes */ +#define XFS_MAX_BLOCKSIZE_LOG 16 /* i.e. 65536 bytes */ +#define XFS_MIN_BLOCKSIZE (1 << XFS_MIN_BLOCKSIZE_LOG) +#define XFS_MAX_BLOCKSIZE (1 << XFS_MAX_BLOCKSIZE_LOG) +#define XFS_MIN_CRC_BLOCKSIZE (1 << (XFS_MIN_BLOCKSIZE_LOG + 1)) +#define XFS_MIN_SECTORSIZE_LOG 9 /* i.e. 512 bytes */ +#define XFS_MAX_SECTORSIZE_LOG 15 /* i.e. 32768 bytes */ +#define XFS_MIN_SECTORSIZE (1 << XFS_MIN_SECTORSIZE_LOG) +#define XFS_MAX_SECTORSIZE (1 << XFS_MAX_SECTORSIZE_LOG) + +/* + * Inode minimum and maximum sizes. + */ +#define XFS_DINODE_MIN_LOG 8 +#define XFS_DINODE_MAX_LOG 11 +#define XFS_DINODE_MIN_SIZE (1 << XFS_DINODE_MIN_LOG) +#define XFS_DINODE_MAX_SIZE (1 << XFS_DINODE_MAX_LOG) + +// XFS Log (journal) constants +#define XLOG_MIN_ICLOGS 2 +#define XLOG_MAX_ICLOGS 8 +#define XLOG_HEADER_MAGIC_NUM 0xFEEDbabe /* Invalid cycle number */ +#define XLOG_VERSION_1 1 +#define XLOG_VERSION_2 2 /* Large IClogs, Log sunit */ +#define XLOG_VERSION_OKBITS (XLOG_VERSION_1 | XLOG_VERSION_2) +#define XLOG_MIN_RECORD_BSIZE (16*1024) /* eventually 32k */ +#define XLOG_BIG_RECORD_BSIZE (32*1024) /* 32k buffers */ +#define XLOG_MAX_RECORD_BSIZE (256*1024) +#define XLOG_HEADER_CYCLE_SIZE (32*1024) /* cycle data in header */ +#define XLOG_MIN_RECORD_BSHIFT 14 /* 16384 == 1 << 14 */ +#define XLOG_BIG_RECORD_BSHIFT 15 /* 32k == 1 << 15 */ +#define XLOG_MAX_RECORD_BSHIFT 18 /* 256k == 1 << 18 */ +#define XLOG_BTOLSUNIT(log, b) (((b)+(log)->l_mp->m_sb.sb_logsunit-1) / \ + (log)->l_mp->m_sb.sb_logsunit) +#define XLOG_LSUNITTOB(log, su) ((su) * (log)->l_mp->m_sb.sb_logsunit) +#define XLOG_HEADER_SIZE 512 + +/* Minimum number of transactions that must fit in the log (defined by mkfs) */ +#define XFS_MIN_LOG_FACTOR 3 + +/* + * RealTime Device format definitions + */ + +/* Min and max rt extent sizes, specified in bytes */ +#define XFS_MAX_RTEXTSIZE (1024 * 1024 * 1024) /* 1GB */ +#define XFS_DFL_RTEXTSIZE (64 * 1024) /* 64kB */ +#define XFS_MIN_RTEXTSIZE (4 * 1024) /* 4kB */ + +// start offset of superblock +#define XFS_SBOFF 0 + +// fs magicnumber +#define XFS_FS_MAGIC 0x58465342 + +// first inode number +#define XFS_FIRSTINO 0 // it + +// superblock related constants & macros +// sb version +#define XFS_SB_VERSION_1 1 /* 5.3, 6.0.1, 6.1 */ +#define XFS_SB_VERSION_2 2 /* 6.2 - attributes */ +#define XFS_SB_VERSION_3 3 /* 6.2 - new inode version */ +#define XFS_SB_VERSION_4 4 /* 6.2+ - bitmask version */ +#define XFS_SB_VERSION_5 5 /* CRC enabled filesystem */ + +#define XFS_SB_FEAT_COMPAT_ALL 0 +#define XFS_SB_FEAT_COMPAT_UNKNOWN ~XFS_SB_FEAT_COMPAT_ALL +// sb version checker + + +// sb version bitmask +#define XFS_SB_VERSION_NUMBITS 0x000f +#define XFS_SB_VERSION_ALLFBITS 0xfff0 +#define XFS_SB_VERSION_ATTRBIT 0x0010 +#define XFS_SB_VERSION_NLINKBIT 0x0020 +#define XFS_SB_VERSION_QUOTABIT 0x0040 +#define XFS_SB_VERSION_ALIGNBIT 0x0080 +#define XFS_SB_VERSION_DALIGNBIT 0x0100 +#define XFS_SB_VERSION_SHAREDBIT 0x0200 +#define XFS_SB_VERSION_LOGV2BIT 0x0400 +#define XFS_SB_VERSION_SECTORBIT 0x0800 +#define XFS_SB_VERSION_EXTFLGBIT 0x1000 +#define XFS_SB_VERSION_DIRV2BIT 0x2000 +#define XFS_SB_VERSION_BORGBIT 0x4000 /* ASCII only case-insens. */ +#define XFS_SB_VERSION_MOREBITSBIT 0x8000 + +// Checking if sb has compat feature + + +// superblock feature ro compat: for normal blocks +#define XFS_SB_FEAT_RO_COMPAT_FINOBT (1 << 0) /* free inode btree */ +#define XFS_SB_FEAT_RO_COMPAT_RMAPBT (1 << 1) /* reverse map btree */ +#define XFS_SB_FEAT_RO_COMPAT_REFLINK (1 << 2) /* reflinked files */ +#define XFS_SB_FEAT_RO_COMPAT_ALL \ + (XFS_SB_FEAT_RO_COMPAT_FINOBT | \ + XFS_SB_FEAT_RO_COMPAT_RMAPBT | \ + XFS_SB_FEAT_RO_COMPAT_REFLINK) +#define XFS_SB_FEAT_RO_COMPAT_UNKNOWN ~XFS_SB_FEAT_RO_COMPAT_ALL + + +// superblock feature ro compat: for journal +#define XFS_SB_FEAT_INCOMPAT_FTYPE (1 << 0) /* filetype in dirent */ +#define XFS_SB_FEAT_INCOMPAT_SPINODES (1 << 1) /* sparse inode chunks */ +#define XFS_SB_FEAT_INCOMPAT_META_UUID (1 << 2) /* metadata UUID */ +#define XFS_SB_FEAT_INCOMPAT_ALL \ + (XFS_SB_FEAT_INCOMPAT_FTYPE| \ + XFS_SB_FEAT_INCOMPAT_SPINODES| \ + XFS_SB_FEAT_INCOMPAT_META_UUID) +#define XFS_SB_FEAT_INCOMPAT_UNKNOWN ~XFS_SB_FEAT_INCOMPAT_ALL + +#define XFS_SB_FEAT_INCOMPAT_LOG_ALL 0 +#define XFS_SB_FEAT_INCOMPAT_LOG_UNKNOWN ~XFS_SB_FEAT_INCOMPAT_LOG_ALL + +#define XFS_HAS_INCOMPAT_FEATURE(fs, sb, mask)\ + ((tsk_fs_guessu32(fs->endian, sb->sb_features_incompat) & mask) != 0) +/* +static inline bool xfs_sb_has_incompat_feature( + struct xfs_sb *sbp, + uint32_t feature) +{ + return !tsk_fs_guessu32(sbp->sb_features_incompat & feature, 0); +} +*/ +#define XFS_HAS_INCOMPAT_LOG_FEATURE(fs, sb, mask)\ + ((tsk_fs_guessu32(fs->endian, sb->sb_features_log_incompat) & mask) != 0) +/* +static inline bool xfs_sb_has_incompat_log_feature( + struct xfs_sb *sbp, + uint32_t feature) +{ + return !tsk_fs_guessu32(sbp->sb_features_log_incompat & feature, 0); +} +*/ +// Macros +// crc offset of sb +#define XFS_SB_CRC_OFF offsetof(struct xfs_sb, sb_crc) + +#define XFS_DIR3_FT_UNKNOWN 0 +#define XFS_DIR3_FT_REG_FILE 1 +#define XFS_DIR3_FT_DIR 2 +#define XFS_DIR3_FT_CHRDEV 3 +#define XFS_DIR3_FT_BLKDEV 4 +#define XFS_DIR3_FT_FIFO 5 +#define XFS_DIR3_FT_SOCK 6 +#define XFS_DIR3_FT_SYMLINK 7 +#define XFS_DIR3_FT_WHT 8 +#define XFS_DIR3_FT_MAX 9 + +/* + * For special situations, the dirent size ends up fixed because we always know + * what the size of the entry is. That's true for the "." and "..", and + * therefore we know that they are a fixed size and hence their offsets are + * constant, as is the first entry. + * + * Hence, this calculation is written as a macro to be able to be calculated at + * compile time and so certain offsets can be calculated directly in the + * structure initaliser via the macro. There are two macros - one for dirents + * with ftype and without so there are no unresolvable conditionals in the + * calculations. We also use round_up() as XFS_DIR2_DATA_ALIGN is always a power + * of 2 and the compiler doesn't reject it (unlike roundup()). + */ +#define XFS_DIR2_DATA_ENTSIZE(n) \ + round_up((offsetof(struct xfs_dir2_data_entry, name[0]) + (n) + \ + sizeof(uint16_t)), XFS_DIR2_DATA_ALIGN) + +#define XFS_DIR3_DATA_ENTSIZE(n) \ + round_up((offsetof(struct xfs_dir2_data_entry, name[0]) + (n) + \ + sizeof(uint16_t) + sizeof(uint8_t)), \ + XFS_DIR2_DATA_ALIGN) + +/* + Superblock - Must be padded to 64 bit alignment. +*/ +typedef struct xfs_sb { + uint8_t sb_magicnum[4]; /* magic number == XFS_SB_MAGIC */ + uint8_t sb_blocksize[4]; /* logical block size, bytes */ + uint8_t sb_dblocks[8]; /* number of data blocks */ + uint8_t sb_rblocks[8]; /* number of realtime blocks */ + uint8_t sb_rextents[8]; /* number of realtime extents */ + uint8_t sb_uuid[16]; /* user-visible file system unique id */ + uint8_t sb_logstart[8]; /* starting block of log if internal */ + uint8_t sb_rootino[8]; /* root inode number */ + uint8_t sb_rbmino[8]; /* bitmap inode for realtime extents */ + uint8_t sb_rsumino[8]; /* summary inode for rt bitmap */ + uint8_t sb_rextsize[4]; /* realtime extent size, blocks */ + uint8_t sb_agblocks[4]; /* size of an allocation group */ + uint8_t sb_agcount[4]; /* number of allocation groups */ + uint8_t sb_rbmblocks[4]; /* number of rt bitmap blocks */ + uint8_t sb_logblocks[4]; /* number of log blocks */ + uint8_t sb_versionnum[2]; /* header version == XFS_SB_VERSION */ + uint8_t sb_sectsize[2]; /* volume sector size, bytes */ + uint8_t sb_inodesize[2]; /* inode size, bytes */ + uint8_t sb_inopblock[2]; /* inodes per block */ + char sb_fname[12]; /* file system name */ + uint8_t sb_blocklog; /* log2 of sb_blocksize */ + uint8_t sb_sectlog; /* log2 of sb_sectsize */ + uint8_t sb_inodelog; /* log2 of sb_inodesize */ + uint8_t sb_inopblog; /* log2 of sb_inopblock */ + uint8_t sb_agblklog; /* log2 of sb_agblocks (rounded up) */ + uint8_t sb_rextslog; /* log2 of sb_rextents */ + uint8_t sb_inprogress; /* mkfs is in progress, don't mount */ + uint8_t sb_imax_pct; /* max % of fs for inode space */ + /* statistics */ + /* + * These fields must remain contiguous. If you really + * want to change their layout, make sure you fix the + * code in xfs_trans_apply_sb_deltas(). + */ + uint8_t sb_icount[8]; /* allocated inodes */ + uint8_t sb_ifree[8]; /* free inodes */ + uint8_t sb_fdblocks[8]; /* free data blocks */ + uint8_t sb_frextents[8]; /* free realtime extents */ + /* + * End contiguous fields. + */ + uint8_t sb_uquotino[8]; /* user quota inode */ + uint8_t sb_gquotino[8]; /* group quota inode */ + uint8_t sb_qflags[2]; /* quota flags */ + uint8_t sb_flags; /* misc. flags */ + uint8_t sb_shared_vn; /* shared version number */ + uint8_t sb_inoalignmt[4]; /* inode chunk alignment, fsblocks */ + uint8_t sb_unit[4]; /* stripe or raid unit */ + uint8_t sb_width[4]; /* stripe or raid width */ + uint8_t sb_dirblklog; /* log2 of dir block size (fsbs) */ + uint8_t sb_logsectlog; /* log2 of the log sector size */ + uint8_t sb_logsectsize[2]; /* sector size for the log, bytes */ + uint8_t sb_logsunit[4]; /* stripe unit size for the log */ + uint8_t sb_features2[4]; /* additional feature bits */ + /* + * bad features2 field as a result of failing to pad the sb + * structure to 64 bits. Some machines will be using this field + * for features2 bits. Easiest just to mark it bad and not use + * it for anything else. + */ + uint8_t sb_bad_features2[4]; + + /* version 5 superblock fields start here */ + + /* feature masks */ + uint8_t sb_features_compat[4]; + uint8_t sb_features_ro_compat[4]; + uint8_t sb_features_incompat[4]; + uint8_t sb_features_log_incompat[4]; + + uint8_t sb_crc[4]; /* superblock crc:: ->little endian<- */ + uint8_t sb_spino_align[4]; /* sparse inode chunk alignment */ + + uint8_t sb_pquotino[8]; /* project quota inode */ + uint8_t sb_lsn[8]; /* last write sequence */ + uint8_t sb_meta_uuid[16]; /* metadata file system unique id */ + + /* must be padded to 64 bit alignment */ +} xfs_sb; + +/* Journal Info */ +typedef struct { + + TSK_FS_FILE *fs_file; + TSK_INUM_T j_inum; + + uint32_t bsize; + TSK_DADDR_T first_block; + TSK_DADDR_T last_block; + + uint32_t start_seq; + TSK_DADDR_T start_blk; + +} XFS_JINFO; + +/* + * Structure of an XFS file system handle. + */ +typedef struct { + TSK_FS_INFO fs_info; /* super class */ + xfs_sb *fs; /* super block */ // modified by kyu + + /* lock protects */ + tsk_lock_t lock; + + // one of the below will be allocated and populated by XFS_group_load depending on the FS type + //XFS_agheader *XFS_ag_buf; /* cached AG header for XFS r/w shared - lock */ + XFS_AGNUM_T ag_num; /* cached AG number r/w shared - lock */ + + uint8_t *bmap_buf; /* cached block allocation bitmap r/w shared - lock */ + XFS_AGNUM_T bmap_grp_num; /* cached block bitmap nr r/w shared - lock */ + + uint8_t *imap_buf; /* cached inode allocation bitmap r/w shared - lock */ + XFS_AGNUM_T imap_grp_num; /* cached inode bitmap nr r/w shared - lock */ + + TSK_OFF_T ags_offset; /* offset to first group desc */ + XFS_AGNUM_T ags_count; /* nr of descriptor group blocks */ + + uint16_t inode_size; /* size of each inode */ + TSK_DADDR_T first_data_block; + + XFS_JINFO *jinfo; +} XFS_INFO; + + +/* + * Byte offset in a directory. + */ +typedef xfs_off_t xfs_dir2_off_t; + +#define XFS_DIR2_DATA_ALIGN_LOG 3 /* i.e., 8 bytes */ +#define XFS_DIR2_DATA_ALIGN (1 << XFS_DIR2_DATA_ALIGN_LOG) + + + +/* + * Convert byte in space to offset in a block + */ +static inline xfs_dir2_data_aoff_t +xfs_dir2_byte_to_off(XFS_INFO *xfs, xfs_dir2_off_t by) +{ + TSK_FS_INFO * fs = (TSK_FS_INFO *) &xfs->fs_info; + return (xfs_dir2_data_aoff_t)(by & ( + tsk_getu32(fs->endian, xfs->fs->sb_blocksize) - 1)); +} +/* + * Convert dataptr to byte in file space + */ +static inline xfs_dir2_off_t +xfs_dir2_dataptr_to_byte(xfs_dir2_dataptr_t dp) +{ + return (xfs_dir2_off_t)dp << XFS_DIR2_DATA_ALIGN_LOG; +} + +/* + * Convert dataptr to a byte offset in a block + */ +static inline xfs_dir2_data_aoff_t +xfs_dir2_dataptr_to_off(XFS_INFO *xfs, xfs_dir2_dataptr_t dp) +{ + return xfs_dir2_byte_to_off(xfs, xfs_dir2_dataptr_to_byte(dp)); +} + + + // kyu +typedef enum { + XFS_BTNUM_BNOi, XFS_BTNUM_CNTi, XFS_BTNUM_BMAPi, XFS_BTNUM_INOi, + XFS_BTNUM_MAX +} xfs_btnum_t; + // kyu +#define XFS_BTNUM_AGF ((int)XFS_BTNUM_CNTi + 1) +/* + AG Free Block Info +*/ +typedef struct xfs_agf { + /* + * Common allocation group header information + */ + uint8_t agf_magicnum[4]; /* magic number == XFS_AGF_MAGIC */ + uint8_t agf_versionnum[4]; /* header version == XFS_AGF_VERSION */ + uint8_t agf_seqno[4]; /* sequence # starting from 0 */ + uint8_t agf_length[4]; /* size in blocks of a.g. */ + /* + * Freespace and rmap information + */ + uint8_t agf_roots[XFS_BTNUM_AGF * 4]; /* root blocks */ + uint8_t agf_levels[XFS_BTNUM_AGF * 4]; /* btree levels */ + + uint8_t agf_flfirst[4]; /* first freelist block's index */ + uint8_t agf_fllast[4]; /* last freelist block's index */ + uint8_t agf_flcount[4]; /* count of blocks in freelist */ + uint8_t agf_freeblks[4]; /* total free blocks */ + + uint8_t agf_longest[4]; /* longest free space */ + uint8_t agf_btreeblks[4]; /* # of blocks held in AGF btrees */ + uint8_t agf_uuid[16]; /* uuid of filesystem */ + + uint8_t agf_rmap_blocks[4]; /* rmapbt blocks used */ + uint8_t agf_refcount_blocks[4]; /* refcountbt blocks used */ + + uint8_t agf_refcount_root[4]; /* refcount tree root block */ + uint8_t agf_refcount_level[4]; /* refcount btree levels */ + + /* + * reserve some contiguous space for future logged fields before we add + * the unlogged fields. This makes the range logging via flags and + * structure offsets much simpler. + */ + uint8_t agf_spare64[14*8]; + + /* unlogged fields, written during buffer writeback. */ + uint8_t agf_lsn[8]; /* last write sequence */ + uint8_t agf_crc[4]; /* crc of agf sector */ + uint8_t agf_spare2[4]; + + /* structure must be padded to 64 bit alignment */ +} xfs_agf_t; + +#define XFS_AGI_UNLINKED_BUCKETS 64 // kyu + +/* + AG Inode B+ Tree Info +*/ +typedef struct xfs_agi { + /* + * Common allocation group header information + */ + uint8_t agi_magicnum[4]; /* magic number == XFS_AGI_MAGIC */ + uint8_t agi_versionnum[4]; /* header version == XFS_AGI_VERSION */ + uint8_t agi_seqno[4]; /* sequence # starting from 0 */ + uint8_t agi_length[4]; /* size in blocks of a.g. */ + /* + * Inode information + * Inodes are mapped by interpreting the inode number, so no + * mapping data is needed here. + */ + uint8_t agi_count[4]; /* count of allocated inodes */ + uint8_t agi_root[4]; /* root of inode btree */ + uint8_t agi_level[4]; /* levels in inode btree */ + uint8_t agi_freecount[4]; /* number of free inodes */ + + uint8_t agi_newino[4]; /* new inode just allocated */ + uint8_t agi_dirino[4]; /* last directory inode chunk */ + /* + * Hash table of inodes which have been unlinked but are + * still being referenced. + */ + uint8_t agi_unlinked[XFS_AGI_UNLINKED_BUCKETS * 4]; + /* + * This marks the end of logging region 1 and start of logging region 2. + */ + uint8_t agi_uuid[16]; /* uuid of filesystem */ + uint8_t agi_crc[4]; /* crc of agi sector */ + uint8_t agi_pad32[4]; + uint8_t agi_lsn[8]; /* last write sequence */ + + uint8_t agi_free_root[4]; /* root of the free inode btree */ + uint8_t agi_free_level[4];/* levels in free inode btree */ + + /* structure must be padded to 64 bit alignment */ +} xfs_agi_t; + +typedef uint64_t xfs_ino_t; + +/* + AG Free space B+ Tree Info +*/ + +//typedef struct xfs_agfl { +// uint8_t agfl_magicnum[4]; +// uint8_t agfl_seqno[4]; + // uint8_t agfl_uuid[16]; +// uint8_t agfl_lsn[8]; +// uint8_t agfl_crc[4]; +// uint8_t agfl_bno[*4]; /* actually XFS_AGFL_SIZE(mp) ->should be defined before compile<- */ +//} __attribute__((packed)) xfs_agfl_t; + +typedef struct xfs_timestamp { + uint32_t t_sec; /* timestamp seconds */ + uint32_t t_nsec; /* timestamp nanoseconds */ +} xfs_timestamp_t; + +/* + Inode +*/ +typedef struct xfs_dinode { + uint8_t di_magic[2]; /* inode magic # = XFS_DINODE_MAGIC */ + uint8_t di_mode[2]; /* mode and type of file */ + uint8_t di_version; /* inode version */ + uint8_t di_format; /* format of di_c data */ + uint8_t di_onlink[2]; /* old number of links to file */ + uint8_t di_uid[4]; /* owner's user id */ + uint8_t di_gid[4]; /* owner's group id */ + uint8_t di_nlink[4]; /* number of links to file */ + uint8_t di_projid_lo[2]; /* lower part of owner's project id */ + uint8_t di_projid_hi[2]; /* higher part owner's project id */ + uint8_t di_pad[6]; /* unused, zeroed space */ + uint8_t di_flushiter[2]; /* incremented on flush */ + xfs_timestamp_t di_atime; /* time last accessed */ + xfs_timestamp_t di_mtime; /* time last modified */ + xfs_timestamp_t di_ctime; /* time created/inode modified */ + uint8_t di_size[8]; /* number of bytes in file */ + uint8_t di_nblocks[8]; /* # of direct & btree blocks used */ + uint8_t di_extsize[4]; /* basic/minimum extent size for file */ + uint8_t di_nextents[4]; /* number of extents in data fork */ + uint8_t di_anextents[2]; /* number of extents in attribute fork*/ + uint8_t di_forkoff; /* attr fork offs, <<3 for 64b align */ + int8_t di_aformat; /* format of attr fork's data */ + uint8_t di_dmevmask[4]; /* DMIG event mask */ + uint8_t di_dmstate[2]; /* DMIG state info */ + uint8_t di_flags[2]; /* random flags, XFS_DIFLAG_... */ + uint8_t di_gen[4]; /* generation number */ + + /* di_next_unlinked is the only non-core field in the old dinode */ + uint8_t di_next_unlinked[4];/* agi unlinked list ptr */ + + /* start of the extended dinode, writable fields */ + uint8_t di_crc[4]; /* CRC of the inode -->little endian<-*/ + uint8_t di_changecount[8]; /* number of attribute changes */ + uint8_t di_lsn[8]; /* flush sequence */ + uint8_t di_flags2[8]; /* more random flags */ + uint8_t di_cowextsize[4]; /* basic cow extent size for file */ + uint8_t di_pad2[12]; /* more padding for future expansion */ + + /* fields only written to during inode creation */ + xfs_timestamp_t di_crtime; /* time created */ + uint8_t di_ino[8]; /* inode number */ + uint8_t di_uuid[16]; /* UUID of the filesystem */ + + /* structure must be padded to 64 bit alignment */ +} xfs_dinode; + +/* + Internal Inode - Quota Inode +*/ +typedef struct xfs_disk_dquot { + uint8_t d_magic[2]; /* dquot magic = XFS_DQUOT_MAGIC */ + uint8_t d_version; /* dquot version */ + uint8_t d_flags; /* XFS_DQ_USER/PROJ/GROUP */ + uint8_t d_id[4]; /* user,project,group id */ + uint8_t d_blk_hardlimit[8];/* absolute limit on disk blks */ + uint8_t d_blk_softlimit[8];/* preferred limit on disk blks */ + uint8_t d_ino_hardlimit[8];/* maximum # allocated inodes */ + uint8_t d_ino_softlimit[8];/* preferred inode limit */ + uint8_t d_bcount[8]; /* disk blocks owned by the user */ + uint8_t d_icount[8]; /* inodes owned by the user */ + uint8_t d_itimer[4]; /* zero if within inode limits if not, + this is when we refuse service */ + uint8_t d_btimer[4]; /* similar to above; for disk blocks */ + uint8_t d_iwarns[2]; /* warnings issued wrt num inodes */ + uint8_t d_bwarns[2]; /* warnings issued wrt disk blocks */ + uint8_t d_pad0[4]; /* 64 bit align */ + uint8_t d_rtb_hardlimit[8];/* absolute limit on realtime blks */ + uint8_t d_rtb_softlimit[8];/* preferred limit on RT disk blks */ + uint8_t d_rtbcount[4]; /* realtime blocks owned */ + uint8_t d_rtbtimer[4]; /* similar to above; for RT disk blocks */ + uint8_t d_rtbwarns[2]; /* warnings issued wrt RT disk blocks */ + uint8_t d_pad[2]; +} xfs_disk_dquot_t; + +/* + Internal Inode - Quota block +*/ +typedef struct xfs_dqblk { + xfs_disk_dquot_t dd_diskdq; /* portion that lives incore as well */ + char dd_fill[4]; /* filling for posterity */ + + /* + * These two are only present on filesystems with the CRC bits set. + */ + uint8_t dd_crc[4]; /* checksum ->BIG ENDIAN<-*/ + uint8_t dd_lsn[8]; /* last modification in log */ + uint8_t dd_uuid[16]; /* location information */ +} xfs_dqblk_t; + +/* + Inode record +*/ +typedef struct xfs_inobt_rec { + uint8_t ir_startino[4]; /* starting inode number */ + union { + struct { + uint8_t ir_freecount[4]; /* count of free inodes */ + } f; + struct { + uint8_t ir_holemask[2];/* hole mask for sparse chunks */ + uint8_t ir_count; /* total inode count */ + uint8_t ir_freecount; /* count of free inodes */ + } sp; // sparse inode + } ir_u; + uint8_t ir_free[8]; /* free inode mask */ +} xfs_inobt_rec_t; + +/* + Bmap root header +*/ +typedef struct xfs_bmdr_block { + uint8_t bb_level[2]; /* 0 is a leaf */ + uint8_t bb_numrecs[2]; /* current # of data records */ +} xfs_bmdr_block_t; + +typedef uint64_t xfs_bmbt_rec_base_t; /* use this for casts */ +//typedef xfs_bmbt_rec_t xfs_bmdr_rec_t; + +/* + Key structure -> Non-leaf level Tree +*/ +typedef struct xfs_bmbt_key { + uint8_t br_startoff[8]; /* starting file offset */ +} xfs_bmbt_key_t, xfs_bmdr_key_t; + +/* + Directory:: 1. Shortform directory - header +*/ + +typedef struct xfs_dir2_sf_hdr { + uint8_t count; /* count of entries */ + uint8_t i8count; /* count of 8-byte inode #s */ + uint8_t parent[8]; /* parent dir inode number */ +} xfs_dir2_sf_hdr_t; + +/* + Directory:: 1. Shortform directory - entry +*/ +typedef struct xfs_dir2_sf_entry { + uint8_t namelen; /* actual name length */ + uint8_t offset[2]; /* saved offset */ + uint8_t name[]; /* name, variable size */ + /* + * A single byte containing the file type field follows the inode + * number for version 3 directory entries. + * + * A 64-bit or 32-bit inode number follows here, at a variable offset + * after the name. + */ +} xfs_dir2_sf_entry_t; + +typedef struct xfs_dir2_sf { + xfs_dir2_sf_hdr_t *hdr; + xfs_dir2_sf_entry_t *entry; +} xfs_dir2_sf_t; + +static inline uint32_t get_unaligned_be32(const uint8_t *p) +{ + return p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3]; +} + +static inline uint64_t get_unaligned_be64(const uint8_t *p) +{ + return (uint64_t)get_unaligned_be32(p) << 32 | + get_unaligned_be32(p + 4); +} + + +/* + * Inode numbers in short-form directories can come in two versions, + * either 4 bytes or 8 bytes wide. These helpers deal with the + * two forms transparently by looking at the headers i8count field. + * + * For 64-bit inode number the most significant byte must be zero. + */ +static xfs_ino_t +xfs_dir2_sf_get_ino( + struct xfs_dir2_sf_hdr *hdr, + uint8_t *from) +{ + if (hdr->i8count) + return get_unaligned_be64(from) & 0x00ffffffffffffffULL; + else + return get_unaligned_be32(from); +} + +static xfs_ino_t +xfs_dir2_sf_get_parent_ino( + struct xfs_dir2_sf_hdr *hdr) +{ + return xfs_dir2_sf_get_ino(hdr, hdr->parent); +} + +/* + * Inode numbers in short-form directories can come in two versions, + * either 4 bytes or 8 bytes wide. These helpers deal with the + * two forms transparently by looking at the headers i8count field. + * + * For 64-bit inode number the most significant byte must be zero. + */ +/* + * In short-form directory entries the inode numbers are stored at variable + * offset behind the entry name. If the entry stores a filetype value, then it + * sits between the name and the inode number. Hence the inode numbers may only + * be accessed through the helpers below. + */ +static xfs_ino_t +xfs_dir2_sfe_get_ino( + struct xfs_dir2_sf_hdr *hdr, + struct xfs_dir2_sf_entry *sfep) +{ + return xfs_dir2_sf_get_ino(hdr, &sfep->name[sfep->namelen]); +} + +static xfs_ino_t +xfs_dir3_sfe_get_ino( + struct xfs_dir2_sf_hdr *hdr, + struct xfs_dir2_sf_entry *sfep) +{ + return xfs_dir2_sf_get_ino(hdr, &sfep->name[sfep->namelen + 1]); +} + +/* + Data block structure:: Free area in data block +*/ +typedef struct xfs_dir2_data_free { + uint16_t offset; /* start of freespace */ + uint16_t length; /* length of freespace */ +} xfs_dir2_data_free_t; + +/* + Data block structure:: Header for the data block +*/ + +#define XFS_DIR3_DATA_CRC_OFF offsetof(struct xfs_dir3_data_hdr, hdr.crc) +#define XFS_DIR2_DATA_FD_COUNT 3 + +/* + * define a structure for all the verification fields we are adding to the + * directory block structures. This will be used in several structures. + * The magic number must be the first entry to align with all the dir2 + * structures so we determine how to decode them just by the magic number. + */ +struct xfs_dir3_blk_hdr { + uint32_t magic; /* magic number */ + uint32_t crc; /* CRC of block */ + uint64_t blkno; /* first block of the buffer */ + uint64_t lsn; /* sequence number of last write */ + uuid_t uuid; /* filesystem we belong to */ + uint64_t owner; /* inode that owns the block */ +}; + +struct xfs_dir3_data_hdr { + struct xfs_dir3_blk_hdr hdr; + xfs_dir2_data_free_t best_free[XFS_DIR2_DATA_FD_COUNT]; + uint32_t pad; /* 64 bit alignment */ +}; + +typedef struct xfs_dir2_data_hdr { + uint32_t magic; /* XFS_DIR2_DATA_MAGIC or */ + /* XFS_DIR2_BLOCK_MAGIC */ + xfs_dir2_data_free_t bestfree[XFS_DIR2_DATA_FD_COUNT]; +} xfs_dir2_data_hdr_t; + +/* + Data block structure:: Active entry +*/ +typedef struct xfs_dir2_data_entry { + uint8_t inumber[8]; /* inode number */ + uint8_t namelen; /* name length */ + uint8_t name[]; /* name bytes, no null */ + /* uint8_t filetype; */ /* type of inode we point to */ + /* uint16_t tag; */ /* starting offset of us */ +} xfs_dir2_data_entry_t; + +/* + Data block structure:: empty entry +*/ +typedef struct xfs_dir2_data_unused { + uint16_t freetag; /* XFS_DIR2_DATA_FREE_TAG */ + uint16_t length; /* total free length */ + /* variable offset */ + uint16_t tag; /* starting offset of us */ +} xfs_dir2_data_unused_t; + +/* + * Leaf block structures. + * + * +---------------------------+ + * | xfs_dir2_leaf_hdr_t | + * +---------------------------+ + * | xfs_dir2_leaf_entry_t | + * | xfs_dir2_leaf_entry_t | + * | xfs_dir2_leaf_entry_t | + * | xfs_dir2_leaf_entry_t | + * | ... | + * +---------------------------+ + * | xfs_dir2_data_off_t | + * | xfs_dir2_data_off_t | + * | xfs_dir2_data_off_t | + * | ... | + * +---------------------------+ + * | xfs_dir2_leaf_tail_t | + * +---------------------------+ +*/ +typedef struct xfs_da_blkinfo { + uint32_t forw; + uint32_t back; + uint32_t magic; + uint16_t pad; +} xfs_da_blkinfo_t; +/* + Leaf block structure: header +*/ +typedef struct xfs_dir2_leaf_hdr { + xfs_da_blkinfo_t info; /* header for da routines */ + uint16_t count; /* count of entries */ + uint16_t stale; /* count of stale entries */ +} xfs_dir2_leaf_hdr_t; + +/* + Leaf block structure: entry +*/ +typedef struct xfs_dir2_leaf_entry { + uint32_t hashval; /* hash value of name */ + uint32_t address; /* address of data entry */ +} xfs_dir2_leaf_entry_t; + +/* + Leaf block structure: tail +*/ +typedef struct xfs_dir2_leaf_tail { + uint32_t bestcount; +} xfs_dir2_leaf_tail_t; + +/* + Freeindex block:: header +*/ +typedef struct xfs_dir2_free_hdr { + uint32_t magic; /* XFS_DIR2_FREE_MAGIC */ + uint32_t firstdb; /* db of first entry */ + uint32_t nvalid; /* count of valid entries */ + uint32_t nused; /* count of used entries */ +} xfs_dir2_free_hdr_t; + +/* + Freeindex block:: entry +*/ +typedef struct xfs_dir2_free { + xfs_dir2_free_hdr_t hdr; /* block header */ + uint16_t bests[]; /* best free counts */ + /* unused entries are -1 */ +} xfs_dir2_free_t; + +/* + * Single block format. + * + * The single block format looks like the following drawing on disk: + * + * +-------------------------------------------------+ + * | xfs_dir2_data_hdr_t | + * +-------------------------------------------------+ + * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t | + * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t | + * | xfs_dir2_data_entry_t OR xfs_dir2_data_unused_t : + * | ... | + * +-------------------------------------------------+ + * | unused space | + * +-------------------------------------------------+ + * | ... | + * | xfs_dir2_leaf_entry_t | + * | xfs_dir2_leaf_entry_t | + * +-------------------------------------------------+ + * | xfs_dir2_block_tail_t | + * +-------------------------------------------------+ + * + * As all the entries are variable size structures the accessors below should + * be used to iterate over them. + */ + +/* + Single block format:: tail +*/ +typedef struct xfs_dir2_block_tail { + uint32_t count; /* count of leaf entries */ + uint32_t stale; /* count of stale lf entries */ +} xfs_dir2_block_tail_t; + +/* + Shortform directory: attributes +*/ +typedef struct xfs_attr_shortform { + struct xfs_attr_sf_hdr { /* constant-structure header block */ + uint16_t totsize; /* total bytes in shortform list */ + uint8_t count; /* count of active entries */ + uint8_t padding; + } hdr; + struct xfs_attr_sf_entry { + uint8_t namelen; /* actual length of name (no NULL) */ + uint8_t valuelen; /* actual length of value (no NULL) */ + uint8_t flags; /* flags bits (see xfs_attr_leaf.h) */ + uint8_t nameval[1]; /* name & value bytes concatenated */ + } list[1]; /* variable sized array */ +} xfs_attr_shortform_t; + + +typedef union { + uint8_t i8[8]; + uint8_t i4[4]; +} xfs_dir2_inou_t; + +// Btree block format +struct xfs_btree_block_shdr { + uint32_t bb_leftsib; + uint32_t bb_rightsib; + + uint64_t bb_blkno; + uint64_t bb_lsn; + uuid_t bb_uuid; + uint32_t bb_owner; + uint32_t bb_crc; + //__le32 bb_crc; +}; + +/* long form block header */ +struct xfs_btree_block_lhdr { + uint64_t bb_leftsib; + uint64_t bb_rightsib; + + uint64_t bb_blkno; + uint64_t bb_lsn; + uuid_t bb_uuid; + uint64_t bb_owner; + uint32_t bb_crc; + //__le32 bb_crc; + uint32_t bb_pad; /* padding for alignment */ +}; + +struct xfs_btree_block { + uint32_t bb_magic; /* magic number for block type */ + uint16_t bb_level; /* 0 is a leaf */ + uint16_t bb_numrecs; /* current # of data records */ + union { + struct xfs_btree_block_shdr s; + struct xfs_btree_block_lhdr l; + } bb_u; /* rest */ +}; + +/* MODE */ +#define XFS_IN_FMT 0170000 +#define XFS_IN_SOCK 0140000 +#define XFS_IN_LNK 0120000 +#define XFS_IN_REG 0100000 +#define XFS_IN_BLK 0060000 +#define XFS_IN_DIR 0040000 +#define XFS_IN_CHR 0020000 +#define XFS_IN_FIFO 0010000 + +#define XFS_IN_ISUID 0004000 +#define XFS_IN_ISGID 0002000 +#define XFS_IN_ISVTX 0001000 +#define XFS_IN_IRUSR 0000400 +#define XFS_IN_IWUSR 0000200 +#define XFS_IN_IXUSR 0000100 +#define XFS_IN_IRGRP 0000040 +#define XFS_IN_IWGRP 0000020 +#define XFS_IN_IXGRP 0000010 +#define XFS_IN_IROTH 0000004 +#define XFS_IN_IWOTH 0000002 +#define XFS_IN_IXOTH 0000001 + + +#define XFS_IN_SECDEL 0x00000001 /* Secure deletion */ +#define XFS_IN_UNRM 0x00000002 /* Undelete */ +#define XFS_IN_COMP 0x00000004 /* Compress file */ +#define XFS_IN_SYNC 0x00000008 /* Synchronous updates */ +#define XFS_IN_IMM 0x00000010 /* Immutable file */ +#define XFS_IN_APPEND 0x00000020 /* writes to file may only append */ +#define XFS_IN_NODUMP 0x00000040 /* do not dump file */ +#define XFS_IN_NOA 0x00000080 /* do not update atime */ +#define XFS_IN_DIRTY 0x00000100 +#define XFS_IN_COMPRBLK 0x00000200 /* One or more compressed clusters */ +#define XFS_IN_NOCOMPR 0x00000400 /* Don't compress */ +#define XFS_IN_ECOMPR 0x00000800 /* Compression error */ +#define XFS_IN_INDEX 0x00001000 /* hash-indexed directory */ +#define XFS_IN_IMAGIC 0x00002000 /* AFS directory */ +#define XFS_IN_JOURNAL_DATA 0x00004000 /* file data should be journaled */ +#define XFS_IN_NOTAIL 0x00008000 /* file tail should not be merged */ +#define XFS_IN_DIRSYNC 0x00010000 /* dirsync behaviour (directories only) */ +#define XFS_IN_TOPDIR 0x00020000 /* Top of directory hierarchies */ +#define XFS_IN_HUGE_FILE 0x00040000 /* Set to each huge file */ +#define XFS_IN_EXTENTS 0x00080000 /* Inode uses extents */ +#define XFS_IN_EA_INODE 0x00200000 /* Inode used for large EA */ +#define XFS_IN_EOFBLOCKS 0x00400000 /* Blocks allocated beyond EOF */ +#define XFS_IN_RESERVED 0x80000000 /* reserved for XFS lib */ +#define XFS_IN_USER_VISIBLE 0x004BDFFF /* User visible flags */ +#define XFS_IN_USER_MODIFIABLE 0x004B80FF /* User modifiable flags */ + +/* XFS directory file types */ +#define XFS_DE_UNKNOWN 0 +#define XFS_DE_REG 1 +#define XFS_DE_DIR 2 +#define XFS_DE_CHR 3 +#define XFS_DE_BLK 4 +#define XFS_DE_FIFO 5 +#define XFS_DE_SOCK 6 +#define XFS_DE_LNK 7 +#define XFS_DE_MAX 8 + +/* + * Values for di_format + */ +typedef enum xfs_dinode_fmt { + XFS_DINODE_FMT_DEV, /* xfs_dev_t */ + XFS_DINODE_FMT_LOCAL, /* bulk data */ + XFS_DINODE_FMT_EXTENTS, /* struct xfs_bmbt_rec */ + XFS_DINODE_FMT_BTREE, /* struct xfs_bmdr_block */ + XFS_DINODE_FMT_UUID /* added long ago, but never used */ +} xfs_dinode_fmt_t; + +/************** JOURNAL ******************/ + +/* These values are always in big endian */ + +#define XFS_JMAGIC 0xC03b3998 + +/*JBD2 Feature Flags */ +#define JBD2_FEATURE_COMPAT_CHECKSUM 0x00000001 + +#define JBD2_FEATURE_INCOMPAT_REVOKE 0x00000001 +#define JBD2_FEATURE_INCOMPAT_64BIT 0x00000002 +#define JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT 0x00000004 + +#define XFS_J_ETYPE_DESC 1 /* descriptor block */ +#define XFS_J_ETYPE_COM 2 /* commit */ +#define XFS_J_ETYPE_SB1 3 /* super block v1 */ +#define XFS_J_ETYPE_SB2 4 /* sb v2 */ +#define XFS_J_ETYPE_REV 5 /* revoke */ + +/* JBD2 Checksum types */ +#define JBD2_CRC32_CHKSUM 1 +#define JBD2_MD5_CHKSUM 2 +#define JBD2_SHA1_CHKSUM 3 + +#define JBD2_CRC32_CHKSUM_SIZE 4 +#define JBD2_CHECKSUM_BYTES (32/ sizeof(unsigned int)) + +#define NSEC_PER_SEC 1000000000L + +/* dentry flags */ +#define XFS_J_DENTRY_ESC 1 /* The orig block starts with magic */ +#define XFS_J_DENTRY_SAMEID 2 /* Entry is for same id, so do not skip 16 ahead */ +#define XFS_J_DENTRY_DEL 4 /* not currently used in src */ +#define XFS_J_DENTRY_LAST 8 /* Last tag */ + +extern TSK_RETVAL_ENUM + xfs_dir_open_meta(TSK_FS_INFO * a_fs, TSK_FS_DIR ** a_fs_dir, + TSK_INUM_T a_addr); +extern uint8_t xfs_jentry_walk(TSK_FS_INFO *, int, + TSK_FS_JENTRY_WALK_CB, void *); +extern uint8_t xfs_jblk_walk(TSK_FS_INFO *, TSK_DADDR_T, + TSK_DADDR_T, int, TSK_FS_JBLK_WALK_CB, void *); +extern uint8_t xfs_jopen(TSK_FS_INFO *, TSK_INUM_T); + + +static inline bool xfs_sb_good_version(TSK_FS_INFO* fs, struct xfs_sb *sbp) +{ + if (tsk_fs_guessu16(fs, sbp->sb_versionnum, XFS_SB_VERSION_5)) + return true; + if (tsk_fs_guessu16(fs, sbp->sb_versionnum, XFS_SB_VERSION_4)) + { + tsk_fprintf(stderr, "Found superblock version 4, continuing with version 5 analyzer"); + return true; + } + return false; +} + +static inline bool +xfs_sb_has_compat_feature( + TSK_FS_INFO * fs, + xfs_sb * sb, + uint32_t feature) +{ + + return (tsk_getu32(fs->endian, sb->sb_features_compat) & feature) != 0; +} + +#define XFS_HAS_COMPAT_FEATURE(fs, sb, mask)\ + ((tsk_fs_guessu32(&(fs->endian), sb->sb_features_compat) & mask) != 0) + +// checking if sb has ro compat feature +#define XFS_HAS_RO_COMPAT_FEATURE(fs, sb, mask)\ + ((tsk_fs_guessu32(fs->endian, sb->sb_features_ro_compat) & mask) != 0) + +static inline bool xfs_sb_has_ro_compat_feature( + TSK_FS_INFO * fs, + xfs_sb *sbp, + uint32_t feature) +{ + uint32_t oper = tsk_getu32(fs->endian, sbp->sb_features_ro_compat) & feature; + if (oper == 0) + return 1; + else + return 0; +} + +static inline bool xfs_sb_has_incompat_feature( + TSK_FS_INFO * fs, + xfs_sb *sbp, + uint32_t feature) +{ + uint32_t oper = tsk_getu32(fs->endian, sbp->sb_features_incompat) & feature; + if (oper == 0) + return 1; + else + return 0; +} + + +/* + * Directory tail pointer accessor functions. Based on block geometry. + */ +static inline struct xfs_dir2_block_tail * +xfs_dir2_block_tail_p(XFS_INFO *xfs, struct xfs_dir2_data_hdr *hdr) +{ + TSK_FS_INFO * fs = (TSK_FS_INFO *) &xfs->fs_info; + return ((struct xfs_dir2_block_tail *) + ((char *)hdr + tsk_getu32(fs->endian, xfs->fs->sb_blocksize))) - 1; +} + +/* + * Pointer to the leaf entries embedded in a data block (1-block format) + */ +static inline struct xfs_dir2_leaf_entry * +xfs_dir2_block_leaf_p(XFS_INFO *xfs, struct xfs_dir2_block_tail *btp) +{ + TSK_FS_INFO * fs = (TSK_FS_INFO *) &xfs->fs_info; + uint32_t count = btp->count; + return ((struct xfs_dir2_leaf_entry *)btp) - count; +} + +static uint8_t +xfs_dir3_sfe_get_ftype( + struct xfs_dir2_sf_entry *sfep) +{ + uint8_t ftype; + ftype = sfep->name[sfep->namelen]; + if (ftype >= XFS_DIR3_FT_MAX) + return XFS_DIR3_FT_UNKNOWN; + return ftype; +} + +static uint8_t +xfs_dir3_blockentry_get_ftype( + struct xfs_dir2_data_entry *daen) // inumber namelen name ftype tag +{ + uint8_t ftype; + ftype = daen->name[daen->namelen]; + if (ftype >= XFS_DIR3_FT_MAX) + return XFS_DIR3_FT_UNKNOWN; + return ftype; +} + +static uint16_t +xfs_dir3_blockentry_get_tag( + struct xfs_dir2_data_entry *sfep) +{ + uint16_t ftype; + ftype = sfep->name[sfep->namelen + 1]; + if (ftype >= XFS_DIR3_FT_MAX) + return XFS_DIR3_FT_UNKNOWN; + return ftype; +} + +static inline +TSK_OFF_T xfs_inode_get_offset(XFS_INFO * xfs, TSK_INUM_T a_addr){ + TSK_FS_INFO *fs = (TSK_FS_INFO *) & xfs->fs_info; + TSK_OFF_T offset_block; + TSK_OFF_T offset; + uint8_t sb_agblklog = xfs->fs->sb_agblklog; + uint8_t sb_inopblog = xfs->fs->sb_inopblog; + + /* lock access to grp_buf */ + tsk_take_lock(&xfs->lock); + + uint32_t ag_num = a_addr >> (sb_agblklog + sb_inopblog); + uint32_t blk_num = (a_addr - (ag_num << (sb_agblklog + sb_inopblog))) >> sb_inopblog; + uint32_t sec_num = (a_addr - (ag_num << (sb_agblklog + sb_inopblog)) - (blk_num << sb_inopblog)); + + tsk_release_lock(&xfs->lock); + + TSK_OFF_T ag_offset = ag_num * (tsk_getu32(fs->endian, xfs->fs->sb_agblocks) * tsk_getu32(fs->endian, xfs->fs->sb_blocksize)); + TSK_OFF_T blk_offset = blk_num * tsk_getu32(fs->endian, xfs->fs->sb_blocksize); + TSK_OFF_T sec_offset = sec_num * tsk_getu16(fs->endian, xfs->fs->sb_sectsize); + + offset = ag_offset + blk_offset + sec_offset; + + return offset; +} + +typedef enum { + XFS_EXT_NORM, XFS_EXT_UNWRITTEN, +} xfs_exntst_t; + +typedef struct xfs_bmbt_irec { + uint64_t br_startoff; + uint32_t br_startblock; + uint64_t br_blockcount; + xfs_exntst_t br_state; +} xfs_bmbt_irec_t; + +typedef struct xfs_bmbt_rec +{ + uint8_t l0[8], l1[8]; +} xfs_bmbt_rec_t; + +typedef xfs_off_t xfs_dir2_off_t; +typedef uint32_t xfs_dir2_db_t; +typedef uint xfs_dir2_data_aoff_t; /* argument form */ + +static inline uint16_t get_unaligned_be16(const uint8_t *p) +{ + return p[0] << 8 | p[1]; +} + +static inline xfs_dir2_data_aoff_t +xfs_dir2_sf_get_offset(xfs_dir2_sf_entry_t *sfep) +{ + return get_unaligned_be16(sfep->offset); +} + +/* + * Convert block and offset to byte in space + */ +static inline xfs_dir2_off_t +xfs_dir2_db_off_to_byte(XFS_INFO *xfs, xfs_dir2_db_t db, + xfs_dir2_data_aoff_t o) +{ + return ((xfs_dir2_off_t)db << xfs->fs->sb_blocklog) + o; +} + +/* + * Convert byte in file space to dataptr. It had better be aligned. + */ +static inline xfs_dir2_dataptr_t +xfs_dir2_byte_to_dataptr(xfs_dir2_off_t by) +{ + return (xfs_dir2_dataptr_t)(by >> XFS_DIR2_DATA_ALIGN_LOG); +} + + +#define XFS_INO32_SIZE 4 +#define XFS_INO64_SIZE 8 + +/* + * Shortform directory ops + */ +static int +xfs_dir2_sf_entsize( + struct xfs_dir2_sf_hdr *hdr, + int len) +{ + int count = sizeof(struct xfs_dir2_sf_entry); /* namelen + offset */ + + count += len; /* name */ + count += hdr->i8count ? XFS_INO64_SIZE : XFS_INO32_SIZE; /* ino # */ + return count; +} + +static int +xfs_dir3_sf_entsize( + struct xfs_dir2_sf_hdr *hdr, + int len) +{ + return xfs_dir2_sf_entsize(hdr, len) + sizeof(uint8_t); +} + +static struct xfs_dir2_sf_entry * +xfs_dir2_sf_nextentry( + struct xfs_dir2_sf_hdr *hdr, + struct xfs_dir2_sf_entry *sfep) +{ + return (struct xfs_dir2_sf_entry *) + ((char *)sfep + xfs_dir2_sf_entsize(hdr, sfep->namelen)); +} + +static struct xfs_dir2_sf_entry * +xfs_dir3_sf_nextentry( + struct xfs_dir2_sf_hdr *hdr, + struct xfs_dir2_sf_entry *sfep) +{ + return (struct xfs_dir2_sf_entry *) + ((char *)sfep + xfs_dir3_sf_entsize(hdr, sfep->namelen)); +} + +static struct xfs_dir2_data_entry * +xfs_dir2_data_nextentry( + struct xfs_dir2_data_entry *daen) +{ + return (struct xfs_dir2_data_entry *) + ((char*)daen + XFS_DIR3_DATA_ENTSIZE(daen->namelen)); +} + +/* + * Convert block and offset to dataptr + */ +static inline xfs_dir2_dataptr_t +xfs_dir2_db_off_to_dataptr(XFS_INFO *xfs, xfs_dir2_db_t db, + xfs_dir2_data_aoff_t o) +{ + return xfs_dir2_byte_to_dataptr(xfs_dir2_db_off_to_byte(xfs, db, o)); +} + +#endif \ No newline at end of file diff --git a/tsk/fs/xfs.c b/tsk/fs/xfs.c new file mode 100644 index 0000000000..268fda8c2c --- /dev/null +++ b/tsk/fs/xfs.c @@ -0,0 +1,891 @@ + +/** + * \internal + * Open part of a disk image as a XFS file system. + * + * @param img_info Disk image to analyze + * @param offset Byte offset where file system starts + * @param ftype Specific type of file system + * @param test NOT USED + * @returns NULL on error or if data is not an XFS file system + */ +#include "tsk_fs_i.h" +#include "tsk_xfs.h" + +static int +xfs_mount_validate_sb( + TSK_FS_INFO* fs, xfs_sb *sbp) +{ + if (tsk_fs_guessu64(fs, sbp->sb_magicnum, XFS_FS_MAGIC)) { + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_FS_MAGIC); + tsk_error_set_errstr("xfs: Invalid magic number"); + return 0; + } + + if (!xfs_sb_good_version(fs, sbp)) { + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_FS_UNSUPTYPE); + tsk_error_set_errstr("xfs: unsupported superblock version or corrupted superblock"); + return 0; + } + + /* + * Version 5 superblock feature mask validation. Reject combinations the + * kernel cannot support up front before checking anything else. For + * write validation, we don't need to check feature masks. + */ + if (tsk_fs_guessu64(fs, sbp->sb_versionnum, XFS_SB_VERSION_5)) { + + if (xfs_sb_has_compat_feature(fs, sbp, XFS_SB_FEAT_COMPAT_UNKNOWN)) { + tsk_fprintf(stderr, + "Superblock has unknown compatible features (0x%x) enabled.", + (tsk_getu32(fs->endian, sbp->sb_features_compat) & XFS_SB_FEAT_COMPAT_UNKNOWN)); + tsk_fprintf(stderr, "Using a more recent kernel is recommended."); + } + + if (xfs_sb_has_ro_compat_feature(fs, sbp, XFS_SB_FEAT_RO_COMPAT_UNKNOWN)) { + tsk_fprintf(stderr, + "Superblock has unknown read-only compatible features (0x%x) enabled.", + (tsk_getu32(fs->endian, sbp->sb_features_ro_compat) & XFS_SB_FEAT_RO_COMPAT_UNKNOWN)); + } + + if (xfs_sb_has_incompat_feature(fs, sbp, XFS_SB_FEAT_INCOMPAT_UNKNOWN)) { + tsk_fprintf(stderr, + "Superblock has unknown incompatible features (0x%x) enabled.", + (tsk_getu32(fs->endian, sbp->sb_features_incompat) & XFS_SB_FEAT_INCOMPAT_UNKNOWN)); + tsk_fprintf(stderr, + "Filesystem can not be safely mounted by tsk."); + } + } + + /* + * More sanity checking. Most of these were stolen directly from + * xfs_repair. + */ + if ((tsk_getu32(fs->endian, sbp->sb_agcount) <= 0 || + tsk_getu16(fs->endian, sbp->sb_sectsize) < XFS_MIN_SECTORSIZE || + tsk_getu16(fs->endian, sbp->sb_sectsize) > XFS_MAX_SECTORSIZE || + tsk_getu8(fs->endian, sbp->sb_sectlog) < XFS_MIN_SECTORSIZE_LOG || + tsk_getu8(fs->endian, sbp->sb_sectlog) > XFS_MAX_SECTORSIZE_LOG || + tsk_getu16(fs->endian, sbp->sb_sectsize) != (1 << tsk_getu8(fs->endian, sbp->sb_sectlog)) || + tsk_getu32(fs->endian, sbp->sb_blocksize) < XFS_MIN_BLOCKSIZE || + tsk_getu32(fs->endian, sbp->sb_blocksize) > XFS_MAX_BLOCKSIZE || + tsk_getu8(fs->endian, sbp->sb_blocklog) < XFS_MIN_BLOCKSIZE_LOG || + tsk_getu8(fs->endian, sbp->sb_blocklog) > XFS_MAX_BLOCKSIZE_LOG || + tsk_getu32(fs->endian, sbp->sb_blocksize) != ((uint32_t)1 << tsk_getu8(fs->endian, sbp->sb_blocklog)) || + tsk_getu8(fs->endian, sbp->sb_dirblklog) + tsk_getu8(fs->endian, sbp->sb_blocklog) > XFS_MAX_BLOCKSIZE_LOG || + tsk_getu16(fs->endian, sbp->sb_inodesize) < XFS_DINODE_MIN_SIZE || + tsk_getu16(fs->endian, sbp->sb_inodesize) > XFS_DINODE_MAX_SIZE || + tsk_getu8(fs->endian, sbp->sb_inodelog) < XFS_DINODE_MIN_LOG || + tsk_getu8(fs->endian, sbp->sb_inodelog) > XFS_DINODE_MAX_LOG || + tsk_getu16(fs->endian, sbp->sb_inodesize) != (1 << tsk_getu8(fs->endian, sbp->sb_inodelog)) || + tsk_getu32(fs->endian, sbp->sb_logsunit) > XLOG_MAX_RECORD_BSIZE || + tsk_getu16(fs->endian, sbp->sb_inopblock) != howmany(tsk_getu16(fs->endian, sbp->sb_blocksize), tsk_getu16(fs->endian, sbp->sb_inodesize)) || + (tsk_getu8(fs->endian, sbp->sb_blocklog) - tsk_getu8(fs->endian, sbp->sb_inodelog) != tsk_getu8(fs->endian, sbp->sb_inopblog)) || + (tsk_getu32(fs->endian, sbp->sb_rextsize) * tsk_getu32(fs->endian, sbp->sb_blocksize) > XFS_MAX_RTEXTSIZE) || + (tsk_getu32(fs->endian, sbp->sb_rextsize) * tsk_getu32(fs->endian, sbp->sb_blocksize) < XFS_MIN_RTEXTSIZE) || + (tsk_getu8(fs->endian, sbp->sb_imax_pct) > 100 /* zero sb_imax_pct is valid */) || + tsk_getu64(fs->endian, sbp->sb_dblocks) == 0 || + tsk_getu64(fs->endian, sbp->sb_dblocks) > XFS_MAX_DBLOCKS(fs, sbp) || + tsk_getu64(fs->endian, sbp->sb_dblocks) < XFS_MIN_DBLOCKS(fs, sbp) || + tsk_getu8(fs->endian, sbp->sb_shared_vn) != 0)) { + tsk_fprintf(stderr, "Superblock sanity check failed"); + return NULL; + } + + if (tsk_fs_guessu16(fs, sbp->sb_versionnum, XFS_SB_VERSION_5) && + tsk_getu32(fs->endian, sbp->sb_blocksize) < XFS_MIN_CRC_BLOCKSIZE) { + tsk_fprintf(stderr, "v5 Superblock sanity check failed"); + return NULL; + } + + /* + * Currently only very few inode sizes are supported. + */ + switch (tsk_getu16(fs->endian, sbp->sb_inodesize)) { + case 256: + case 512: + case 1024: + case 2048: + break; + default: + tsk_fprintf(stderr, "inode size of %d bytes not supported", + tsk_getu16(fs->endian, sbp->sb_inodesize)); + return -ENOSYS; + } + + return 0; +} + +void +xfs_bmbt_disk_get_all( + XFS_INFO* xfs, + struct xfs_bmbt_rec *rec, + struct xfs_bmbt_irec *irec) +{ + uint64_t l0 = tsk_getu64(xfs->fs_info.endian, rec->l0); + uint64_t l1 = tsk_getu64(xfs->fs_info.endian, rec->l1); + + irec->br_startoff = (l0 & xfs_mask64lo(64 - BMBT_EXNTFLAG_BITLEN)) >> 9; + irec->br_startblock = ((l0 & xfs_mask64lo(9)) << 43) | (l1 >> 21); + irec->br_blockcount = l1 & xfs_mask64lo(21); + + if (l0 >> (64 - BMBT_EXNTFLAG_BITLEN)) + irec->br_state = XFS_EXT_UNWRITTEN; + else + irec->br_state = XFS_EXT_NORM; +} + +/** \internal + * Add a single extent -- that is, a single data ran -- to the file data attribute. + * @return 0 on success, 1 on error. + */ +static TSK_OFF_T +xfs_make_data_run_extent(TSK_FS_INFO * fs_info, TSK_FS_ATTR * fs_attr, + xfs_bmbt_rec_t* extent) +{ + TSK_FS_ATTR_RUN *data_run; + XFS_INFO * xfs = (XFS_INFO *)fs_info; + + if ((data_run = tsk_fs_attr_run_alloc()) == NULL) + return 1; + + xfs_bmbt_irec_t *irec = (xfs_bmbt_irec_t*)tsk_malloc(sizeof(xfs_bmbt_irec_t)); + xfs_bmbt_disk_get_all(xfs, extent, irec); + + uint32_t agno = XFS_FSB_TO_AGNO(xfs, irec->br_startblock); + uint32_t blkno = XFS_FSB_TO_AGBNO(xfs, irec->br_startblock); + + data_run->offset = 0; + data_run->addr = agno * tsk_getu32(fs_info->endian, xfs->fs->sb_agblocks) + blkno; + data_run->len = irec->br_blockcount; + + if (tsk_fs_attr_add_run(fs_info, fs_attr, data_run)) { + return 1; + } + + return 0; +} + + +/** \internal + * Given a block that contains an extent node (which starts with extent_header), + * walk it, and add everything encountered to the appropriate attributes. + * @return 0 on success, 1 on error. + */ +static TSK_OFF_T +xfs_make_data_run_extent_index(TSK_FS_INFO * fs_info, + TSK_FS_ATTR * fs_attr, TSK_FS_ATTR * fs_attr_extent, + TSK_DADDR_T idx_block) +{ + TSK_OFF_T length = 0; + + fprintf(stderr, "[i] xfs_make_data_run_extent_index: xfs.c: %d - not implemented\n", __LINE__); + + return 1; +} + +/** + * \internal + * Loads attribute for XFS Extents-based storage method. + * @param fs_file File system to analyze + * @returns 0 on success, 1 otherwise + */ +static uint8_t +xfs_load_attrs_block(TSK_FS_FILE *fs_file) +{ + TSK_FS_META *fs_meta = fs_file->meta; + TSK_FS_INFO *fs_info = fs_file->fs_info; + XFS_INFO * xfs = (XFS_INFO*)fs_info; + TSK_OFF_T length = 0; + TSK_FS_ATTR * fs_attr; + int i; + xfs_bmbt_rec_t *rec; + + rec = (xfs_bmbt_rec_t*)fs_meta->content_ptr; + + if ((fs_meta->attr != NULL) + && (fs_meta->attr_state == TSK_FS_META_ATTR_STUDIED)) { + fprintf(stderr, "[i] xfs_load_attr_block: xfs.c: %d - already studied, exiting load_attr_blk\n", __LINE__); + return 0; + }else if (fs_meta->attr_state == TSK_FS_META_ATTR_ERROR) { + fprintf(stderr, "[i] xfs_load_attr_block: xfs.c: %d - error on attr, exiting load_attr_blk\n", __LINE__); + return 1; + } + + if (fs_meta->attr != NULL) { + tsk_fs_attrlist_markunused(fs_meta->attr); + } + else { + fs_meta->attr = tsk_fs_attrlist_alloc(); + } + + if (TSK_FS_TYPE_ISXFS(fs_info->ftype) == 0) { + tsk_error_set_errno(TSK_ERR_FS_INODE_COR); + tsk_error_set_errstr + ("xfs_load_attr: Called with non-xfs file system: %x", + fs_info->ftype); + return 1; + } + + length = roundup(fs_meta->size, fs_info->block_size); + + if ((fs_attr = + tsk_fs_attrlist_getnew(fs_meta->attr, + TSK_FS_ATTR_NONRES)) == NULL) { + return 1; + } + + if (tsk_fs_attr_set_run(fs_file, fs_attr, NULL, NULL, + TSK_FS_ATTR_TYPE_DEFAULT, TSK_FS_ATTR_ID_DEFAULT, + fs_meta->size, fs_meta->size, length, 0, 0)) { + return 1; + } + + while (true) + { + if (tsk_getu64(fs_info->endian, rec->l0) == 0 && tsk_getu64(fs_info->endian, rec->l1) == 0) + break; + + if (xfs_make_data_run_extent(fs_info, fs_attr, rec)) { + fprintf(stderr, "[i] xfs_load_attr_block: xfs.c: %d - xfs_make_data_run_extent failed.\n", + __LINE__); + return 1; + } + + rec = xfs_dir2_data_nextentry(rec); + } + + fs_meta->attr_state = TSK_FS_META_ATTR_STUDIED; + + return 0; +} + +/** \internal + * Add the data runs and extents to the file attributes. + * + * @param fs_file File system to analyze + * @returns 0 on success, 1 otherwise + */ +static uint8_t +xfs_load_attrs(TSK_FS_FILE * fs_file) +{ + TSK_FS_META *fs_meta = fs_file->meta; + TSK_FS_INFO * fs = (TSK_FS_INFO*)fs_file->fs_info; + XFS_INFO *xfs = (XFS_INFO*)fs_file->fs_info; + + // not needed to implement about shortform data fork. shortform does not have location of real file. + if (fs_file->meta->content_type == TSK_FS_META_CONTENT_TYPE_XFS_DATA_FORK_EXTENTS) { + xfs_load_attrs_block(fs_file); + } + else if (fs_file->meta->content_type == TSK_FS_META_CONTENT_TYPE_XFS_DATA_FORK_BTREE) { + return 1; + } + else { + fprintf(stderr, "contenttype = unknown content type\n"); + return 1; + } + + return 0; +} + + +static uint8_t +xfs_dinode_load(XFS_INFO * xfs, TSK_INUM_T dino_inum, + xfs_dinode * dino_buf) +{ + TSK_OFF_T addr; + ssize_t cnt; + TSK_INUM_T rel_inum; + TSK_FS_INFO *fs = (TSK_FS_INFO *) & xfs->fs_info; + + /* + * Sanity check. + * Use last_num-1 to account for virtual Orphan directory in last_inum. + */ + if ((dino_inum < fs->first_inum) || (dino_inum > fs->last_inum - 1)) { + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_FS_INODE_NUM); + tsk_error_set_errstr("xfs_dinode_load: address: %" PRIuINUM, + dino_inum); + return 1; + } + + if (dino_buf == NULL) { + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_FS_ARG); + tsk_error_set_errstr("xfs_dinode_load: dino_buf is NULL"); + return 1; + } + + addr = xfs_inode_get_offset(xfs, dino_inum); + cnt = tsk_fs_read(fs, addr, (char *)dino_buf, xfs->inode_size); + + if (cnt != xfs->inode_size) { + if (cnt >= 0) { + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_FS_READ); + } + + tsk_error_set_errstr2("xfs_dinode_load: Inode %" PRIuINUM + " from %" PRIuOFF, dino_inum, addr); + + return 1; + } + + return 0; +} + +static uint8_t +xfs_dinode_copy(XFS_INFO * xfs, TSK_FS_META * fs_meta, + TSK_INUM_T inum, const xfs_dinode * dino_buf) +{ + int i; + TSK_FS_INFO *fs = (TSK_FS_INFO *) & xfs->fs_info; + xfs_sb *sb = xfs->fs; + TSK_INUM_T ibase = 0; + + if (dino_buf == NULL) { + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_FS_ARG); + tsk_error_set_errstr("xfs_dinode_copy: dino_buf is NULL"); + return 1; + } + + fs_meta->attr_state = TSK_FS_META_ATTR_EMPTY; + if (fs_meta->attr) { + tsk_fs_attrlist_markunused(fs_meta->attr); + } + + // set the type + switch (tsk_getu16(fs->endian, dino_buf->di_mode) & XFS_IN_FMT) { + case XFS_IN_REG: + fs_meta->type = TSK_FS_META_TYPE_REG; + break; + case XFS_IN_DIR: + fs_meta->type = TSK_FS_META_TYPE_DIR; + break; + case XFS_IN_SOCK: + fs_meta->type = TSK_FS_META_TYPE_SOCK; + break; + case XFS_IN_LNK: + fs_meta->type = TSK_FS_META_TYPE_LNK; + break; + case XFS_IN_BLK: + fs_meta->type = TSK_FS_META_TYPE_BLK; + break; + case XFS_IN_CHR: + fs_meta->type = TSK_FS_META_TYPE_CHR; + break; + case XFS_IN_FIFO: + fs_meta->type = TSK_FS_META_TYPE_FIFO; + break; + default: + fs_meta->type = TSK_FS_META_TYPE_UNDEF; + break; + } + + // set the mode + fs_meta->mode = 0; + if (tsk_getu16(fs->endian, dino_buf->di_mode) & XFS_IN_ISUID) + fs_meta->mode |= TSK_FS_META_MODE_ISUID; + if (tsk_getu16(fs->endian, dino_buf->di_mode) & XFS_IN_ISGID) + fs_meta->mode |= TSK_FS_META_MODE_ISGID; + if (tsk_getu16(fs->endian, dino_buf->di_mode) & XFS_IN_ISVTX) + fs_meta->mode |= TSK_FS_META_MODE_ISVTX; + + if (tsk_getu16(fs->endian, dino_buf->di_mode) & XFS_IN_IRUSR) + fs_meta->mode |= TSK_FS_META_MODE_IRUSR; + if (tsk_getu16(fs->endian, dino_buf->di_mode) & XFS_IN_IWUSR) + fs_meta->mode |= TSK_FS_META_MODE_IWUSR; + if (tsk_getu16(fs->endian, dino_buf->di_mode) & XFS_IN_IXUSR) + fs_meta->mode |= TSK_FS_META_MODE_IXUSR; + + if (tsk_getu16(fs->endian, dino_buf->di_mode) & XFS_IN_IRGRP) + fs_meta->mode |= TSK_FS_META_MODE_IRGRP; + if (tsk_getu16(fs->endian, dino_buf->di_mode) & XFS_IN_IWGRP) + fs_meta->mode |= TSK_FS_META_MODE_IWGRP; + if (tsk_getu16(fs->endian, dino_buf->di_mode) & XFS_IN_IXGRP) + fs_meta->mode |= TSK_FS_META_MODE_IXGRP; + + if (tsk_getu16(fs->endian, dino_buf->di_mode) & XFS_IN_IROTH) + fs_meta->mode |= TSK_FS_META_MODE_IROTH; + if (tsk_getu16(fs->endian, dino_buf->di_mode) & XFS_IN_IWOTH) + fs_meta->mode |= TSK_FS_META_MODE_IWOTH; + if (tsk_getu16(fs->endian, dino_buf->di_mode) & XFS_IN_IXOTH) + fs_meta->mode |= TSK_FS_META_MODE_IXOTH; + + fs_meta->nlink = tsk_getu32(fs->endian, dino_buf->di_nlink); + fs_meta->size = tsk_getu64(fs->endian, dino_buf->di_size); + fs_meta->addr = inum; + + /* the general size value in the inode is only 32-bits, + * but the i_dir_acl value is used for regular files to + * hold the upper 32-bits + * + * The RO_COMPAT_LARGE_FILE flag in the super block will identify + * if there are any large files in the file system + */ + fs_meta->uid = tsk_getu32(fs->endian, dino_buf->di_uid); + fs_meta->gid = tsk_getu32(fs->endian, dino_buf->di_gid); + + fs_meta->mtime = dino_buf->di_mtime.t_sec; + fs_meta->atime = dino_buf->di_atime.t_sec; + fs_meta->ctime = dino_buf->di_ctime.t_sec; + + fs_meta->mtime_nano = dino_buf->di_mtime.t_nsec; + fs_meta->atime_nano = dino_buf->di_atime.t_nsec; + fs_meta->ctime_nano = dino_buf->di_ctime.t_nsec; + fs_meta->seq = 0; + + if (fs_meta->link) { + free(fs_meta->link); + fs_meta->link = NULL; + } + + if (fs_meta->content_len != XFS_CONTENT_LEN_V5(xfs)) { + fprintf(stderr, "xfs.c:514 content_len is not XFS_CONTENT_LEN_V5 : %d\n", fs_meta->content_len); + if ((fs_meta = + tsk_fs_meta_realloc(fs_meta, + XFS_CONTENT_LEN_V5(xfs))) == NULL) { + return 1; + } + } + + // Allocating datafork area in content_ptr + // Contents after inode core must be copied to content ptr + TSK_OFF_T dfork_offset = xfs_inode_get_offset(xfs, inum) + sizeof(xfs_dinode); + + char* content_buf = (char*)tsk_malloc(XFS_CONTENT_LEN_V5(xfs)); + ssize_t cnt = tsk_fs_read(fs, dfork_offset, content_buf, XFS_CONTENT_LEN_V5(xfs)); + + if (cnt != XFS_CONTENT_LEN_V5(xfs)){ + fprintf(stderr, "invalid datafork read size : cnt : %d con_len : %d\n", cnt, XFS_CONTENT_LEN_V5(xfs)); + return -1; + } + + fs_meta->content_ptr = (void*) content_buf; + + if (dino_buf->di_format == XFS_DINODE_FMT_LOCAL){ + fs_meta->content_type = TSK_FS_META_CONTENT_TYPE_XFS_DATA_FORK_SHORTFORM; + } + else if (dino_buf->di_format == XFS_DINODE_FMT_EXTENTS){ + fs_meta->content_type = TSK_FS_META_CONTENT_TYPE_XFS_DATA_FORK_EXTENTS; + } + else if (dino_buf->di_format == XFS_DINODE_FMT_BTREE){ + fs_meta->content_type = TSK_FS_META_CONTENT_TYPE_XFS_DATA_FORK_BTREE; + } + else{ + fprintf(stderr, "xfs : inode core format not supported : inode format %d\n", dino_buf->di_format); + } + + return 0; +} + +uint8_t xfs_inode_walk(TSK_FS_INFO * fs, TSK_INUM_T start_inum, TSK_INUM_T end_inum, + TSK_FS_META_FLAG_ENUM flags, TSK_FS_META_WALK_CB a_action, void *a_ptr) +{ + char *myname = "xfs_inode_walk"; + XFS_INFO * xfs = (XFS_INFO *) fs; + TSK_INUM_T inum; + TSK_INUM_T end_inum_tmp; + TSK_FS_FILE * fs_file; + unsigned int myflags; + + tsk_error_reset(); + + if(start_inum < fs->first_inum || start_inum > fs->last_inum){ + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_FS_WALK_RNG); + tsk_error_set_errstr("%s: start inode: %s" PRIuINUM "", myname, start_inum); + return 1; + } + if(end_inum < fs->first_inum || end_inum > fs->last_inum || end_inum < start_inum){ + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_FS_WALK_RNG); + tsk_error_set_errstr("%s: end inode: %s" PRIuINUM "", myname, end_inum); + return 1; + } + if (flags & TSK_FS_META_FLAG_ORPHAN) { + flags |= TSK_FS_META_FLAG_UNALLOC; + flags &= ~TSK_FS_META_FLAG_ALLOC; + flags |= TSK_FS_META_FLAG_USED; + flags &= ~TSK_FS_META_FLAG_UNUSED; + } + else { + if (((flags & TSK_FS_META_FLAG_ALLOC) == 0) && + ((flags & TSK_FS_META_FLAG_UNALLOC) == 0)) { + flags |= (TSK_FS_META_FLAG_ALLOC | TSK_FS_META_FLAG_UNALLOC); + } + + /* If neither of the USED or UNUSED flags are set, then set them + * both + */ + if (((flags & TSK_FS_META_FLAG_USED) == 0) && + ((flags & TSK_FS_META_FLAG_UNUSED) == 0)) { + flags |= (TSK_FS_META_FLAG_USED | TSK_FS_META_FLAG_UNUSED); + } + } + /* If we are looking for orphan files and have not yet filled + * in the list of unalloc inodes that are pointed to, then fill + * in the list + */ + if ((flags & TSK_FS_META_FLAG_ORPHAN)) { + if (tsk_fs_dir_load_inum_named(fs) != TSK_OK) { + tsk_error_errstr2_concat + ("- ext2fs_inode_walk: identifying inodes allocated by file names"); + return 1; + } + } + + if ((fs_file = tsk_fs_file_alloc(fs)) == NULL) + return 1; + + return -1; +} + +//block walk +uint8_t xfs_block_walk(TSK_FS_INFO * fs, TSK_DADDR_T start, TSK_DADDR_T end, + TSK_FS_BLOCK_WALK_FLAG_ENUM flags, TSK_FS_BLOCK_WALK_CB cb, void *ptr) +{ + return -1; +} + +//block_getflags +TSK_FS_BLOCK_FLAG_ENUM xfs_block_getflags(TSK_FS_INFO * a_fs, TSK_DADDR_T a_addr) +{ + int flags = 0; + + return flags; +} + +static uint8_t +xfs_inode_lookup(TSK_FS_INFO * fs, TSK_FS_FILE * a_fs_file, // = file_add_meta + TSK_INUM_T inum) +{ + XFS_INFO * xfs = (XFS_INFO *) fs; + xfs_dinode * dino_buf = NULL; + unsigned int size = 0; + + if (a_fs_file == NULL) { + tsk_error_set_errno(TSK_ERR_FS_ARG); + tsk_error_set_errstr("ext2fs_inode_lookup: fs_file is NULL"); + return 1; + } + + if (a_fs_file->meta == NULL) { + if ((a_fs_file->meta = + tsk_fs_meta_alloc(XFS_CONTENT_LEN_V5(xfs))) == NULL) // #define XFS_CONTENT_LEN + return 1; + } + else { + tsk_fs_meta_reset(a_fs_file->meta); + } + + // see if they are looking for the special "orphans" directory + if (inum == TSK_FS_ORPHANDIR_INUM(fs)) { + if (tsk_fs_dir_make_orphan_dir_meta(fs, a_fs_file->meta)) + return 1; + else + return 0; + } + + size = + xfs->inode_size > + sizeof(xfs_dinode) ? xfs->inode_size : sizeof(xfs_dinode); + + if((dino_buf = (xfs_dinode *)tsk_malloc(size)) == NULL){ + return 1; + } + + if (xfs_dinode_load(xfs, inum, dino_buf)){ + free(dino_buf); + return 1; + } + + if (xfs_dinode_copy(xfs, a_fs_file->meta, inum, dino_buf)){ + free(dino_buf); + return 1; + } + + free(dino_buf); + return 0; +} + +//fsstat +uint8_t xfs_fsstat(TSK_FS_INFO * fs, FILE * hFile) +{ + uint i; + XFS_INFO * xfs = (XFS_INFO *) fs; + xfs_sb *sb = xfs->fs; + + int ibpg; + time_t imptime; + char timeBuf[128]; + const char *tmptypename; + + tsk_error_reset(); + tsk_fprintf(hFile, "FILE SYSTEM INFORMATION\n"); + tsk_fprintf(hFile, "--------------------------------------------\n"); + + if (tsk_getu32(fs->endian, sb->sb_magicnum) == XFS_FS_MAGIC) + tmptypename = "XFS"; + + tsk_fprintf(hFile, "File System Type : %s\n", tmptypename); + tsk_fprintf(hFile, "Volume Name : %s\n", sb->sb_fname); + tsk_fprintf(hFile, "\n"); + + + if(tsk_getu32(fs->endian, sb->sb_features_incompat)) { + tsk_fprintf(hFile, "InCompat Features: "); + + if (tsk_getu32(fs->endian, sb->sb_features_incompat) & + XFS_SB_FEAT_INCOMPAT_FTYPE) + tsk_fprintf(hFile, "Directory file type, "); + if (tsk_getu32(fs->endian, sb->sb_features_incompat) & + XFS_SB_FEAT_INCOMPAT_SPINODES) + tsk_fprintf(hFile, "Sparse inodes, "); + if (tsk_getu32(fs->endian, sb->sb_features_incompat) & + XFS_SB_FEAT_INCOMPAT_META_UUID) + tsk_fprintf(hFile, "Metadata UUID"); + + tsk_fprintf(hFile, "\n"); + } + + if(tsk_getu32(fs->endian, sb->sb_features_ro_compat)) { + tsk_fprintf(hFile, "Read Only Compat Features : " ); + + if (tsk_getu32(fs->endian, sb->sb_features_ro_compat) & + XFS_SB_FEAT_RO_COMPAT_FINOBT) + tsk_fprintf(hFile, "Free inode B+tree, "); + if (tsk_getu32(fs->endian, sb->sb_features_ro_compat) & + XFS_SB_FEAT_RO_COMPAT_RMAPBT) + tsk_fprintf(hFile, "Reverse mapping B+tree, "); + if (tsk_getu32(fs->endian, sb->sb_features_ro_compat) & + XFS_SB_FEAT_RO_COMPAT_REFLINK) + tsk_fprintf(hFile, "Reference count B+tree"); + + tsk_fprintf(hFile, "\n"); + } + + tsk_fprintf(hFile, "\nMETADATA INFORMATION\n"); + tsk_fprintf(hFile, "--------------------------------------------\n"); + tsk_fprintf(hFile, "Root Inode : %" PRIu64 "\n", tsk_getu64(fs->endian, sb->sb_rootino)); + tsk_fprintf(hFile, "Inode Count : %" PRIu64 "\n", tsk_getu64(fs->endian, sb->sb_icount)); + tsk_fprintf(hFile, "Free Inode Count : %" PRIu64 "\n", tsk_getu64(fs->endian, sb->sb_ifree)); + tsk_fprintf(hFile, "Inode Size : %" PRIu16 "\n", tsk_getu16(fs->endian, sb->sb_inodesize)); + tsk_fprintf(hFile, "Inode per Block : %" PRIu8 "\n", sb->sb_inopblog); + + tsk_fprintf(hFile, "\nCONTENT INFORMATION\n"); + tsk_fprintf(hFile, "--------------------------------------------\n"); + tsk_fprintf(hFile, "Block Range : %" PRIuINUM " - %" PRIuINUM "\n", fs->first_block, fs->last_block); + tsk_fprintf(hFile, "Block Size : %" PRIu32 "\n", tsk_getu32(fs->endian, sb->sb_blocksize)); + tsk_fprintf(hFile, "Block Count : %" PRIu64 "\n", tsk_getu64(fs->endian, sb->sb_dblocks)); + tsk_fprintf(hFile, "Free Block Count : %" PRIu64 "\n", tsk_getu64(fs->endian, sb->sb_fdblocks)); + tsk_fprintf(hFile, "Allocation Group Block Size : % " PRIu32 "\n", tsk_getu32(fs->endian, sb->sb_agblocks)); + tsk_fprintf(hFile, "Allocation Group Count : %" PRIu32 "\n", tsk_getu32(fs->endian, sb->sb_agcount)); + tsk_fprintf(hFile, "Sector Size : %" PRIu16 "\n", tsk_getu16(fs->endian, sb->sb_sectsize)); + + tsk_fprintf(hFile, "\nLOG INFORMATION\n"); + tsk_fprintf(hFile, "——————————————————————\n"); + tsk_fprintf(hFile, "Log2 of Block Size : %" PRIu8 "\n", sb->sb_blocklog); + tsk_fprintf(hFile, "Log2 of Sector Size : %" PRIu8 "\n", sb->sb_sectlog); + tsk_fprintf(hFile, "Log2 of Inode Size : %" PRIu8 "\n", sb->sb_inodelog); + tsk_fprintf(hFile, "Log2 of Inode per Block : %" PRIu8 "\n", sb->sb_inopblog); + tsk_fprintf(hFile, "Log2 of Allocation Block Size : %" PRIu8 "\n", sb->sb_agblklog); + tsk_fprintf(hFile, "Log2 of Extent Count : %" PRIu8 "\n", sb->sb_rextslog); + tsk_fprintf(hFile, "Log2 of Extent Count : %" PRIu8 "\n", sb->sb_inprogress); + tsk_fprintf(hFile, "Inode max persentage : %" PRIu8 "\n", sb->sb_imax_pct); + + return -1; +} + +uint8_t xfs_fscheck(TSK_FS_INFO * fs, FILE * HFile) +{ + return -1; +} + +uint8_t xfs_istat(TSK_FS_INFO * fs, TSK_FS_ISTAT_FLAG_ENUM flags, FILE * hFile, TSK_INUM_T inum, + TSK_DADDR_T numblock, int32_t sec_skew) +{ + return -1; +} + +void xfs_close(TSK_FS_INFO * fs) +{ + XFS_INFO * xfs = (XFS_INFO *) fs; + + fs->tag = 0; + free(xfs->fs); + free(xfs->bmap_buf); + free(xfs->imap_buf); + + tsk_deinit_lock(&xfs->lock); + tsk_fs_free(fs); + return; +} + +TSK_FS_INFO * +xfs_open(TSK_IMG_INFO * img_info, TSK_OFF_T offset, + TSK_FS_TYPE_ENUM ftype, uint8_t test) +{ + XFS_INFO *xfs; + unsigned int len; + TSK_FS_INFO *fs; + ssize_t cnt; + + tsk_error_reset(); + + if(TSK_FS_TYPE_ISXFS(ftype) == 0){ + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_FS_ARG); + tsk_error_set_errstr("Invalid FS Type in xfs_open"); + return NULL; + } + + if (img_info->sector_size == 0) { + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_FS_ARG); + tsk_error_set_errstr("xfs_open: sector size is 0"); + return NULL; + } + + if ((xfs = (XFS_INFO *) tsk_fs_malloc(sizeof(*xfs))) == NULL) + return NULL; + fs = &(xfs->fs_info); + fs->ftype = ftype; + fs->flags = 0; + fs->img_info = img_info; + fs->offset = offset; + fs->tag = TSK_FS_INFO_TAG; + + len = sizeof(xfs_sb); + + if ((xfs->fs = (xfs_sb *) tsk_malloc(len)) == NULL) { + fs->tag = 0; + tsk_fs_free((TSK_FS_INFO *)xfs); + return NULL; + } + + cnt = tsk_fs_read(fs, XFS_SBOFF, (char *) xfs->fs, len); + + if (cnt != len){ + if (cnt >= 0) { + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_FS_READ); + } + tsk_error_set_errstr("xfs_open: superblock"); + fs->tag = 0; + free(xfs->fs); + tsk_fs_free((TSK_FS_INFO *)xfs); + return NULL; + } + + if(tsk_fs_guessu32(fs, xfs->fs->sb_magicnum, XFS_FS_MAGIC)){ + if (tsk_verbose){ + fprintf(stderr, "xfs_open : superblock magic failed\n"); + fprintf(stderr, "xfs_open : superblock read : %x%x%x%x\n", + xfs->fs->sb_magicnum[0], xfs->fs->sb_magicnum[1], xfs->fs->sb_magicnum[2], xfs->fs->sb_magicnum[3]); + } + + fs->tag = 0; + free(xfs->fs); + tsk_fs_free((TSK_FS_INFO *)xfs); + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_FS_MAGIC); + tsk_error_set_errstr("not an xfs file system (magic)"); + + if (tsk_verbose) + fprintf(stderr, "xfs_open : invalid magic\n"); + return NULL; + } + + fs->inum_count = tsk_getu64(fs->endian, xfs->fs->sb_icount); + fs->last_inum = 0xFFFFFFFFFFFFFFFF; + fs->first_inum = XFS_FIRSTINO; + fs->root_inum = tsk_getu64(fs->endian, xfs->fs->sb_rootino); + + if (tsk_getu64(fs->endian, xfs->fs->sb_icount) < 10) { + fs->tag = 0; + free(xfs->fs); + tsk_fs_free((TSK_FS_INFO *)xfs); + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_FS_MAGIC); + tsk_error_set_errstr("Not an XFS file system (inum count)"); + if (tsk_verbose) + fprintf(stderr, "xfs_open: two few inodes\n"); + return NULL; + } + /* Set the size of the inode, but default to our data structure + * size if it is larger */ + xfs->inode_size = tsk_getu16(fs->endian, xfs->fs->sb_inodesize); + if (xfs->inode_size < sizeof(xfs_dinode)) { + if (tsk_verbose) + tsk_fprintf(stderr, "SB inode size is small"); + } + + /* + * Calculate the block info + */ + fs->dev_bsize = img_info->sector_size; + fs->first_block = 0; + fs->block_count = (TSK_DADDR_T)tsk_getu64(fs->endian, xfs->fs->sb_dblocks); + fs->last_block_act = fs->last_block = fs->block_count - 1; + fs->block_size = tsk_getu32(fs->endian, xfs->fs->sb_blocksize); + + if((fs->block_size == 0) || (fs->block_size % 512)){ + fs->tag = 0; + free(xfs->fs); + tsk_fs_free((TSK_FS_INFO *)xfs); + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_FS_MAGIC); + tsk_error_set_errstr("Not an XFS file system (block size)"); + if(tsk_verbose) + fprintf(stderr, "xfs_open : invalid block size\n"); + return NULL; + } + + if ((TSK_DADDR_T) ((img_info->size - offset) / fs->block_size) < + fs->block_count) + fs->last_block_act = + (img_info->size - offset) / fs->block_size - 1; + + /* Volume ID */ + for(fs->fs_id_used = 0 ; fs->fs_id_used < 16; fs->fs_id_used++){ + fs->fs_id[fs->fs_id_used] = xfs->fs->sb_uuid[fs->fs_id_used]; + } + + /* Set the generic function pointers */ + fs->inode_walk = xfs_inode_walk; + fs->block_walk = xfs_block_walk; + fs->block_getflags = xfs_block_getflags; + + fs->get_default_attr_type = tsk_fs_unix_get_default_attr_type; + fs->load_attrs = xfs_load_attrs; + + fs->file_add_meta = xfs_inode_lookup; + fs->dir_open_meta = xfs_dir_open_meta; + fs->fsstat = xfs_fsstat; + fs->fscheck = xfs_fscheck; + fs->istat = xfs_istat; + fs->name_cmp = tsk_fs_unix_name_cmp; + fs->close = xfs_close; + + /* + * Print some stats. + */ + if (tsk_verbose) + tsk_fprintf(stderr, + "inodes %" PRIu32 " root ino %" PRIuINUM " blocks %" PRIu32 + " inodes/block %" PRIu32 "\n", tsk_getu64(fs->endian, + xfs->fs->sb_icount), + fs->root_inum, tsk_getu64(fs->endian, + xfs->fs->sb_dblocks), tsk_getu16(fs->endian, + xfs->fs->sb_inopblock)); + + tsk_init_lock(&xfs->lock); + + return (fs); +} + diff --git a/tsk/fs/xfs_dent.c b/tsk/fs/xfs_dent.c new file mode 100644 index 0000000000..4484c8e3d3 --- /dev/null +++ b/tsk/fs/xfs_dent.c @@ -0,0 +1,424 @@ +#include "tsk_fs_i.h" +#include "tsk_xfs.h" + +static int files_found = 0; +static int folders_found = 0; + +static int +xfs_dir2_data_entsize( + int n) +{ + return XFS_DIR2_DATA_ENTSIZE(n); +} + +static int +xfs_dir3_data_entsize( + int n) +{ + return XFS_DIR3_DATA_ENTSIZE(n); +} + +static uint8_t +xfs_dir2_data_get_ftype( + struct xfs_dir2_data_entry *dep) +{ + return XFS_DIR3_FT_UNKNOWN; +} + +static uint8_t +xfs_dir3_data_get_ftype( + struct xfs_dir2_data_entry *dep) +{ + uint8_t ftype = dep->name[dep->namelen]; + + if (ftype >= XFS_DIR3_FT_MAX) + return XFS_DIR3_FT_UNKNOWN; + return ftype; +} + +static uint8_t +xfs_dent_copy(XFS_INFO * xfs, + char *xfs_dent, TSK_FS_NAME *fs_name, TSK_FS_FILE *fs_file) +{ + TSK_FS_INFO *fs = &(xfs->fs_info); + + if (fs_file->meta->content_type == + TSK_FS_META_CONTENT_TYPE_XFS_DATA_FORK_SHORTFORM) + { + xfs_dir2_sf_t *dir2_sf = (xfs_dir2_sf_t*)xfs_dent; + xfs_dir2_sf_hdr_t *hdr = (xfs_dir2_sf_hdr_t*)dir2_sf->hdr; + xfs_dir2_sf_entry_t *ent = (xfs_dir2_sf_entry_t*)dir2_sf->entry; + + strncpy(fs_name->name, ent->name, ent->namelen); + fs_name->name[ent->namelen] = '\0'; + fs_name->type = TSK_FS_NAME_TYPE_UNDEF; + fs_name->meta_addr = (TSK_INUM_T)xfs_dir3_sfe_get_ino(hdr, ent); + + if (ent->namelen >= fs_name->name_size){ + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_FS_ARG); + tsk_error_set_errstr + ("xfs_dent_copy: Name Space too Small %d %" PRIuSIZE "", + ent->namelen, fs_name->name_size); + return 1; + } + + switch (xfs_dir3_sfe_get_ftype(ent)) { + case XFS_DE_REG: + fs_name->type = TSK_FS_NAME_TYPE_REG; + break; + case XFS_DE_DIR: + fs_name->type = TSK_FS_NAME_TYPE_DIR; + break; + case XFS_DE_CHR: + fs_name->type = TSK_FS_NAME_TYPE_CHR; + break; + case XFS_DE_BLK: + fs_name->type = TSK_FS_NAME_TYPE_BLK; + break; + case XFS_DE_FIFO: + fs_name->type = TSK_FS_NAME_TYPE_FIFO; + break; + case XFS_DE_SOCK: + fs_name->type = TSK_FS_NAME_TYPE_SOCK; + break; + case XFS_DE_LNK: + fs_name->type = TSK_FS_NAME_TYPE_LNK; + break; + case XFS_DE_UNKNOWN: + default: + fs_name->type = TSK_FS_NAME_TYPE_UNDEF; + break; + } + } + else if (fs_file->meta->content_type == + TSK_FS_META_CONTENT_TYPE_XFS_DATA_FORK_EXTENTS) + { + xfs_dir2_data_entry_t *ent = (xfs_dir2_data_entry_t*)xfs_dent; + + strncpy(fs_name->name, ent->name, ent->namelen); + fs_name->name[ent->namelen] = '\0'; + fs_name->meta_addr = tsk_getu64(xfs->fs_info.endian, ent->inumber); + fs_name->type = TSK_FS_NAME_TYPE_UNDEF; + + if (ent->namelen >= fs_name->name_size){ + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_FS_ARG); + tsk_error_set_errstr + ("xfs_dent_copy: Name Space too Small %d %" PRIuSIZE "", + ent->namelen, fs_name->name_size); + return 1; + } + + switch (xfs_dir3_blockentry_get_ftype(ent)) { + case XFS_DE_REG: + fs_name->type = TSK_FS_NAME_TYPE_REG; + break; + case XFS_DE_DIR: + fs_name->type = TSK_FS_NAME_TYPE_DIR; + break; + case XFS_DE_CHR: + fs_name->type = TSK_FS_NAME_TYPE_CHR; + break; + case XFS_DE_BLK: + fs_name->type = TSK_FS_NAME_TYPE_BLK; + break; + case XFS_DE_FIFO: + fs_name->type = TSK_FS_NAME_TYPE_FIFO; + break; + case XFS_DE_SOCK: + fs_name->type = TSK_FS_NAME_TYPE_SOCK; + break; + case XFS_DE_LNK: + fs_name->type = TSK_FS_NAME_TYPE_LNK; + break; + case XFS_DE_UNKNOWN: + default: + fs_name->type = TSK_FS_NAME_TYPE_UNDEF; + break; + } + } + else fprintf(stderr, "[i] xfs_dent_copy: xfs.c: %d - unsupported metadata type detected\n", __LINE__); + + fs_name->flags = 0; + + return 0; +} + +static TSK_RETVAL_ENUM +xfs_dent_parse_shortform(XFS_INFO * xfs, TSK_FS_DIR * a_fs_dir, + uint8_t a_is_del, TSK_LIST ** list_seen, char *buf, TSK_OFF_T offset) +{ + TSK_FS_INFO *fs = &(xfs->fs_info); + + TSK_FS_NAME *fs_name; + TSK_FS_FILE *fs_file = a_fs_dir->fs_file; + xfs_dir2_sf_hdr_t *hdr; + xfs_dir2_sf_entry_t *ent; + + xfs_dir2_sf_t * dir2_sf = (xfs_dir2_sf_t *)tsk_malloc(sizeof(xfs_dir2_sf_t)); + hdr = (xfs_dir2_sf_hdr_t*)buf; + dir2_sf->hdr = hdr; + + uint8_t ftype; + uint8_t namelen; + uint64_t inode; + + if ((fs_name = tsk_fs_name_alloc(XFS_MAXNAMELEN + 1, 0)) == NULL) + return TSK_ERR; + + ent = (char*)(hdr + 1) - (hdr->i8count == 0) * 4; // code of miracle + + uint16_t num_entries = (hdr->i8count > 0) ? hdr->i8count : hdr->count; + + for (int i = 0; i < num_entries; i++) + { + dir2_sf->entry = ent; + namelen = ent->namelen; + inode = xfs_dir2_sf_get_ino(hdr, ent); + + char* name; + name = (char*)tsk_malloc(sizeof(char) * (namelen + 1)); + name[namelen] = '\0'; + + memcpy(name, ent->name, namelen); + + if (inode > fs->last_inum || namelen > XFS_MAXNAMELEN || namelen == 0) { + fprintf(stderr, "[i] xfs_dent_parse_shortform: xfs_dent.c: %d - sanity check error\n", __LINE__); + return TSK_ERR; + } + + if (xfs_dent_copy(xfs, dir2_sf, fs_name, fs_file)) { + tsk_fs_name_free(fs_name); + return TSK_ERR; + } + + fs_name->flags = TSK_FS_NAME_FLAG_ALLOC; + + if (tsk_fs_dir_add(a_fs_dir, fs_name)) { + tsk_fs_name_free(fs_name); + return TSK_ERR; + } + + ent = xfs_dir3_sf_nextentry(hdr, ent); + } + tsk_fs_name_free(fs_name); + return TSK_OK; +} + +static TSK_RETVAL_ENUM +xfs_dent_parse_btree(XFS_INFO * xfs, TSK_FS_DIR * a_fs_dir, + uint8_t a_is_del, TSK_LIST ** list_seen, char *buf, TSK_OFF_T offset) +{ + // while nextents, nblocks + // di_bmxì—서 n = offset, block, blockcount / 2n = leafoffset, block, blockcount + // while true + // if block[n.offset].magic == dir2_data_magic + // data_free_t*nê°œ 지나기 (data_unused_tì˜ length, offset++) + // continue + // offset => dir22_data_entry_t + // break + // while nextents, nblocks + // dir2_data_entry_t 파싱 -> inumber, namelen, name, tag + // ~~ì´ëŸ°ì‹ + offset += 0; // 여기서 취해줄 수 있는게 ì—†ìŒ +} + +/* + * @param a_is_del Set to 1 if block is from a deleted directory + * a_fs_dir = 채워야 í•  것, 나머지는 채워져 있는 것 + * parse_block = 최종목표: a_fs_dir 채우기 + * inode format = local -> shortform + * = block -> block + * or leaf + */ +static TSK_RETVAL_ENUM +xfs_dent_parse_block(XFS_INFO * xfs, TSK_FS_DIR * a_fs_dir, + uint8_t a_is_del, TSK_LIST ** list_seen, char *buf, TSK_OFF_T offset) +{ + TSK_FS_INFO *fs_info = &(xfs->fs_info); + TSK_FS_NAME *fs_name; + + if ((fs_name = tsk_fs_name_alloc(XFS_MAXNAMELEN + 1, 0)) == NULL) + return TSK_ERR; + + xfs_bmbt_rec_t *rec; + xfs_bmbt_irec_t *irec; + + rec = (xfs_bmbt_rec_t*)buf; + irec = (xfs_bmbt_irec_t*)tsk_malloc(sizeof(xfs_bmbt_irec_t)); + + xfs_bmbt_disk_get_all(xfs, rec, irec); + + uint32_t agno = XFS_FSB_TO_AGNO(xfs, irec->br_startblock); + uint32_t agblkno = XFS_FSB_TO_AGBNO(xfs, irec->br_startblock); + + TSK_OFF_T soff = (agno * tsk_getu32(xfs->fs_info.endian, xfs->fs->sb_agblocks) + agblkno) + * tsk_getu32(xfs->fs_info.endian, xfs->fs->sb_blocksize); // real offset + + ssize_t len = irec->br_blockcount * tsk_getu32(xfs->fs_info.endian, xfs->fs->sb_blocksize); + + char *fbuf = (char*)tsk_malloc(sizeof(char) * len); + ssize_t cnt = tsk_fs_read(fs_info, soff, fbuf, len); + + struct xfs_dir3_data_hdr *hdr = (struct xfs_dir3_data_hdr_t*)fbuf; + + // sanity check + if (hdr->hdr.magic != 0x33424458) { // XDB3 + fprintf(stderr, "[i] xfs_dent_parse_block: xfs.c: %d - not a dir2_data_hdr: %8x\n", + __LINE__, hdr->hdr.magic); + return TSK_ERR; + } + + xfs_dir2_data_entry_t *ent = (xfs_dir2_data_entry_t*)((char*)(hdr + 1) + 32); // magically should be happened + + while (true) + { + if (ent->namelen == 0) + break; + + if (xfs_dent_copy(xfs, ent, fs_name, a_fs_dir->fs_file)) { + tsk_fs_name_free(fs_name); + return TSK_ERR; + } + + fs_name->flags = TSK_FS_NAME_FLAG_ALLOC; + + if (tsk_fs_dir_add(a_fs_dir, fs_name)) { + tsk_fs_name_free(fs_name); + return TSK_ERR; + } + + ent = xfs_dir2_data_nextentry(ent); + } + + return TSK_OK; +} + +static TSK_RETVAL_ENUM +xfs_dent_parse(XFS_INFO * xfs, TSK_FS_DIR * a_fs_dir, + uint8_t a_is_del, TSK_LIST ** list_seen, char *buf, TSK_OFF_T offset) +{ + TSK_FS_INFO* fs_info = (TSK_FS_INFO*) xfs; + + switch(a_fs_dir->fs_file->meta->content_type){ + case TSK_FS_META_CONTENT_TYPE_XFS_DATA_FORK_SHORTFORM: + xfs_dent_parse_shortform(xfs, a_fs_dir, a_is_del, list_seen, buf, offset); + break; + + case TSK_FS_META_CONTENT_TYPE_XFS_DATA_FORK_EXTENTS: + xfs_dent_parse_block(xfs, a_fs_dir, a_is_del, list_seen, buf, offset); + break; + } + + return TSK_OK; +} + +/** \internal +* Process a directory and load up FS_DIR with the entries. If a pointer to +* an already allocated FS_DIR structure is given, it will be cleared. If no existing +* FS_DIR structure is passed (i.e. NULL), then a new one will be created. If the return +* value is error or corruption, then the FS_DIR structure could +* have entries (depending on when the error occurred). +* +* @param a_fs File system to analyze +* @param a_fs_dir Pointer to FS_DIR pointer. Can contain an already allocated +* structure or a new structure. +* @param a_addr Address of directory to process. +* @returns error, corruption, ok etc. +*/ +TSK_RETVAL_ENUM +xfs_dir_open_meta(TSK_FS_INFO * a_fs, TSK_FS_DIR ** a_fs_dir, + TSK_INUM_T a_addr) +{ + XFS_INFO * xfs = (XFS_INFO *) a_fs; + TSK_FS_DIR * fs_dir; + TSK_LIST *list_seen = NULL; + TSK_OFF_T size; + + char *dirbuf; + + TSK_RETVAL_ENUM retval_tmp; + TSK_RETVAL_ENUM retval_final = TSK_OK; + + if (a_addr < a_fs->first_inum || a_addr > a_fs->last_inum) { + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_FS_WALK_RNG); + tsk_error_set_errstr("xfs_dir_open_meta: inode value: %" PRIuINUM + "\n", a_addr); + return TSK_ERR; + } + else if (a_fs_dir == NULL) { + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_FS_ARG); + tsk_error_set_errstr + ("xfs_dir_open_meta: NULL fs_attr argument given"); + return TSK_ERR; + } + + if (tsk_verbose) { + tsk_fprintf(stderr, + "xfs_dir_open_meta: Processing directory %" PRIuINUM + "\n", a_addr); + } + + fs_dir = *a_fs_dir; + + if (fs_dir) { + tsk_fs_dir_reset(fs_dir); + fs_dir->addr = a_addr; + } + else { + if((*a_fs_dir = fs_dir = + tsk_fs_dir_alloc(a_fs, a_addr, 128)) == NULL) { + return TSK_ERR; + } + } + + if ((fs_dir->fs_file = + tsk_fs_file_open_meta(a_fs, NULL, a_addr)) == NULL) { // inode_lookup -> content_ptr 채움 + fprintf(stderr, "xfs_fs_dir_open_meta: failed to obtain fs_file meta info\n"); + tsk_error_errstr2_concat("- xfs_dir_open_meta"); + return TSK_COR; + } + + // We only read in and process a single block at a time + if ((dirbuf = tsk_malloc((size_t)a_fs->block_size)) == NULL) { + fprintf(stderr, "[i] xfs_load_attr_block: xfs.c: %d - failed to malloc\n", __LINE__); + return TSK_ERR; + } + + memcpy(dirbuf, fs_dir->fs_file->meta->content_ptr, XFS_CONTENT_LEN_V5(xfs)); + + retval_tmp = + xfs_dent_parse(xfs, fs_dir, + (fs_dir->fs_file->meta-> + flags & TSK_FS_META_FLAG_UNALLOC) ? 1 : 0, &list_seen, + dirbuf, XFS_CONTENT_LEN_V5(xfs)); + + if (retval_tmp == TSK_ERR) + retval_final = TSK_ERR; + else if (retval_tmp == TSK_COR) + retval_final = TSK_COR; + + free(dirbuf); + + return TSK_OK; +} + +uint8_t xfs_jentry_walk(TSK_FS_INFO *info, int a, + TSK_FS_JENTRY_WALK_CB c, void *b) +{ + return -1; +} + +uint8_t xfs_jblk_walk(TSK_FS_INFO *a, TSK_DADDR_T b, + TSK_DADDR_T c, int d, TSK_FS_JBLK_WALK_CB e, void *f) +{ + return -1; +} + +uint8_t xfs_jopen(TSK_FS_INFO *a, TSK_INUM_T b) +{ + return -1; +} \ No newline at end of file From 5a13799c371205f5dcda0e851acfc3e1afddec60 Mon Sep 17 00:00:00 2001 From: Dong Kyun Yoo Date: Thu, 14 Mar 2019 18:34:42 +0900 Subject: [PATCH 0008/1548] [Fix] several problems and passing integration tests commit 69f7c172ed296eb16b781aaff4af743253e82f3a Author: Dong Kyun Yoo Date: Thu Mar 14 17:54:02 2019 +0900 [Fix] passing codacy PR Quality test commit dcfa04c52a1a1c3c9b7d5420392541da29d44c56 Author: Dong Kyun Yoo Date: Thu Mar 14 17:21:48 2019 +0900 [Fix] Travis CI build timeout problem commit 45f9d912fd6f810f72c5ea2053f4c61a69ba22bc Author: Dong Kyun Yoo Date: Tue Mar 12 22:12:36 2019 +0900 [Fix] wget error occured when building on OSX in travis commit 9c5854b684d8c5981165fde03de61eddc9880e23 Author: Dong Kyun Yoo Date: Tue Mar 12 21:52:35 2019 +0900 [Modify] code appropriate for C standard commit 5bd203bb736a888d5c29d1bd51e6c9c020f2b2ef Author: Dong Kyun Yoo Date: Tue Mar 12 21:39:46 2019 +0900 [Modify] travis_build.sh Update libvhdi, libvmdk versions to resolve missing github official releases commit f04994c5e6ba75f8684a1190bc3483ce2ecca209 Author: Dong Kyun Yoo Date: Tue Mar 12 21:34:21 2019 +0900 [Cleanup] comments commit d4c6f4fa1425f8d75c0ead4d37f1967f182fdd59 Author: Dong Kyun Yoo Date: Tue Mar 12 21:21:02 2019 +0900 [Fix] remove UUID library dependency commit 4bb3bcba9c40df73f09c50472ea69a6b25e70339 Author: sokdak Date: Thu Feb 28 17:36:41 2019 +0900 XFS Implementation --- travis_build.sh | 6 +++--- tsk/fs/tsk_xfs.h | 20 +++++++++++++++----- tsk/fs/xfs.c | 35 ++++++++++++++++++----------------- tsk/fs/xfs_dent.c | 27 ++++++++++++++++++++------- 4 files changed, 56 insertions(+), 32 deletions(-) diff --git a/travis_build.sh b/travis_build.sh index cdaec62daf..a7689d7744 100755 --- a/travis_build.sh +++ b/travis_build.sh @@ -18,9 +18,9 @@ if test ${TRAVIS_OS_NAME} = "linux"; then sudo apt-get -y install libafflib-dev libewf-dev libpq-dev autopoint libsqlite3-dev ant libcppunit-dev wget elif test ${TRAVIS_OS_NAME} = "osx"; then export PATH=${PATH}:/usr/local/opt/gettext/bin - brew install ant libewf gettext cppunit wget afflib + brew install ant libewf gettext cppunit afflib fi -installLib libvhdi 20160424 -installLib libvmdk 20160119 +installLib libvhdi 20181227 +installLib libvmdk 20181227 ./bootstrap && ./configure --prefix=/usr && make > /dev/null cd bindings/java/ && ant -q dist-PostgreSQL diff --git a/tsk/fs/tsk_xfs.h b/tsk/fs/tsk_xfs.h index 5727b7929e..d1c451e1c8 100644 --- a/tsk/fs/tsk_xfs.h +++ b/tsk/fs/tsk_xfs.h @@ -1,9 +1,20 @@ +/* +** The Sleuth Kit +** +** Brian Carrier [carrier sleuthkit [dot] org] +** Copyright (c) 2003-2011 Brian Carrier. All rights reserved +** +** ICS Laboratory [515lab.ics gmail [dot] com] +** Copyright (c) 2019 ICS Laboratory. All rights reserved. +** +** This software is distributed under the Common Public License 1.0 +*/ + #ifndef _TSK_XFS_H #define _TSK_XFS_H #include #include -#include #ifdef __cplusplus extern "C" { @@ -795,7 +806,7 @@ struct xfs_dir3_blk_hdr { uint32_t crc; /* CRC of block */ uint64_t blkno; /* first block of the buffer */ uint64_t lsn; /* sequence number of last write */ - uuid_t uuid; /* filesystem we belong to */ + uint64_t uuid[2]; uint64_t owner; /* inode that owns the block */ }; @@ -965,7 +976,7 @@ struct xfs_btree_block_shdr { uint64_t bb_blkno; uint64_t bb_lsn; - uuid_t bb_uuid; + uint64_t bb_uuid[2]; uint32_t bb_owner; uint32_t bb_crc; //__le32 bb_crc; @@ -978,7 +989,7 @@ struct xfs_btree_block_lhdr { uint64_t bb_blkno; uint64_t bb_lsn; - uuid_t bb_uuid; + uint64_t bb_uuid[2]; uint64_t bb_owner; uint32_t bb_crc; //__le32 bb_crc; @@ -1183,7 +1194,6 @@ xfs_dir2_block_tail_p(XFS_INFO *xfs, struct xfs_dir2_data_hdr *hdr) static inline struct xfs_dir2_leaf_entry * xfs_dir2_block_leaf_p(XFS_INFO *xfs, struct xfs_dir2_block_tail *btp) { - TSK_FS_INFO * fs = (TSK_FS_INFO *) &xfs->fs_info; uint32_t count = btp->count; return ((struct xfs_dir2_leaf_entry *)btp) - count; } diff --git a/tsk/fs/xfs.c b/tsk/fs/xfs.c index 268fda8c2c..2fff98b2dd 100644 --- a/tsk/fs/xfs.c +++ b/tsk/fs/xfs.c @@ -1,14 +1,15 @@ +/* +** The Sleuth Kit +** +** Brian Carrier [carrier sleuthkit [dot] org] +** Copyright (c) 2003-2011 Brian Carrier. All rights reserved +** +** ICS Laboratory [515lab.ics gmail [dot] com] +** Copyright (c) 2019 ICS Laboratory. All rights reserved. +** +** This software is distributed under the Common Public License 1.0 +*/ -/** - * \internal - * Open part of a disk image as a XFS file system. - * - * @param img_info Disk image to analyze - * @param offset Byte offset where file system starts - * @param ftype Specific type of file system - * @param test NOT USED - * @returns NULL on error or if data is not an XFS file system - */ #include "tsk_fs_i.h" #include "tsk_xfs.h" @@ -179,8 +180,6 @@ xfs_make_data_run_extent_index(TSK_FS_INFO * fs_info, TSK_FS_ATTR * fs_attr, TSK_FS_ATTR * fs_attr_extent, TSK_DADDR_T idx_block) { - TSK_OFF_T length = 0; - fprintf(stderr, "[i] xfs_make_data_run_extent_index: xfs.c: %d - not implemented\n", __LINE__); return 1; @@ -271,9 +270,7 @@ xfs_load_attrs_block(TSK_FS_FILE *fs_file) static uint8_t xfs_load_attrs(TSK_FS_FILE * fs_file) { - TSK_FS_META *fs_meta = fs_file->meta; TSK_FS_INFO * fs = (TSK_FS_INFO*)fs_file->fs_info; - XFS_INFO *xfs = (XFS_INFO*)fs_file->fs_info; // not needed to implement about shortform data fork. shortform does not have location of real file. if (fs_file->meta->content_type == TSK_FS_META_CONTENT_TYPE_XFS_DATA_FORK_EXTENTS) { @@ -445,7 +442,10 @@ xfs_dinode_copy(XFS_INFO * xfs, TSK_FS_META * fs_meta, } if (fs_meta->content_len != XFS_CONTENT_LEN_V5(xfs)) { - fprintf(stderr, "xfs.c:514 content_len is not XFS_CONTENT_LEN_V5 : %d\n", fs_meta->content_len); + if (tsk_verbose) { + fprintf(stderr, "xfs.c: content_len is not XFS_CONTENT_LEN_V5\n"); + } + if ((fs_meta = tsk_fs_meta_realloc(fs_meta, XFS_CONTENT_LEN_V5(xfs))) == NULL) { @@ -461,7 +461,9 @@ xfs_dinode_copy(XFS_INFO * xfs, TSK_FS_META * fs_meta, ssize_t cnt = tsk_fs_read(fs, dfork_offset, content_buf, XFS_CONTENT_LEN_V5(xfs)); if (cnt != XFS_CONTENT_LEN_V5(xfs)){ - fprintf(stderr, "invalid datafork read size : cnt : %d con_len : %d\n", cnt, XFS_CONTENT_LEN_V5(xfs)); + if (tsk_verbose) { + fprintf(stderr, "invalid datafork read size, cnt: %d\n", cnt); + } return -1; } @@ -487,7 +489,6 @@ uint8_t xfs_inode_walk(TSK_FS_INFO * fs, TSK_INUM_T start_inum, TSK_INUM_T end_i TSK_FS_META_FLAG_ENUM flags, TSK_FS_META_WALK_CB a_action, void *a_ptr) { char *myname = "xfs_inode_walk"; - XFS_INFO * xfs = (XFS_INFO *) fs; TSK_INUM_T inum; TSK_INUM_T end_inum_tmp; TSK_FS_FILE * fs_file; diff --git a/tsk/fs/xfs_dent.c b/tsk/fs/xfs_dent.c index 4484c8e3d3..28fdae17ec 100644 --- a/tsk/fs/xfs_dent.c +++ b/tsk/fs/xfs_dent.c @@ -1,3 +1,15 @@ +/* +** The Sleuth Kit +** +** Brian Carrier [carrier sleuthkit [dot] org] +** Copyright (c) 2003-2011 Brian Carrier. All rights reserved +** +** ICS Laboratory [515lab.ics gmail [dot] com] +** Copyright (c) 2019 ICS Laboratory. All rights reserved. +** +** This software is distributed under the Common Public License 1.0 +*/ + #include "tsk_fs_i.h" #include "tsk_xfs.h" @@ -160,9 +172,8 @@ xfs_dent_parse_shortform(XFS_INFO * xfs, TSK_FS_DIR * a_fs_dir, hdr = (xfs_dir2_sf_hdr_t*)buf; dir2_sf->hdr = hdr; - uint8_t ftype; - uint8_t namelen; - uint64_t inode; + //uint8_t ftype; + uint64_t i; if ((fs_name = tsk_fs_name_alloc(XFS_MAXNAMELEN + 1, 0)) == NULL) return TSK_ERR; @@ -171,13 +182,15 @@ xfs_dent_parse_shortform(XFS_INFO * xfs, TSK_FS_DIR * a_fs_dir, uint16_t num_entries = (hdr->i8count > 0) ? hdr->i8count : hdr->count; - for (int i = 0; i < num_entries; i++) + for (i = 0; i < num_entries; i++) { + uint8_t namelen; + uint64_t inode; + char* name; + dir2_sf->entry = ent; namelen = ent->namelen; inode = xfs_dir2_sf_get_ino(hdr, ent); - - char* name; name = (char*)tsk_malloc(sizeof(char) * (namelen + 1)); name[namelen] = '\0'; @@ -403,7 +416,7 @@ xfs_dir_open_meta(TSK_FS_INFO * a_fs, TSK_FS_DIR ** a_fs_dir, free(dirbuf); - return TSK_OK; + return retval_final; } uint8_t xfs_jentry_walk(TSK_FS_INFO *info, int a, From 705727acce839a80f70eed12ab69ad1ca29b6ff0 Mon Sep 17 00:00:00 2001 From: Brian Carrier Date: Thu, 14 Mar 2019 11:45:31 -0400 Subject: [PATCH 0009/1548] Do not consider it an error if there is no idx_root --- tsk/fs/ntfs_dent.cpp | 140 ++++++++++++++++++++++++------------------- 1 file changed, 79 insertions(+), 61 deletions(-) diff --git a/tsk/fs/ntfs_dent.cpp b/tsk/fs/ntfs_dent.cpp index af5d09a4f6..1ba6b7d432 100644 --- a/tsk/fs/ntfs_dent.cpp +++ b/tsk/fs/ntfs_dent.cpp @@ -823,35 +823,33 @@ ntfs_dir_open_meta(TSK_FS_INFO * a_fs, TSK_FS_DIR ** a_fs_dir, fs_attr_root = tsk_fs_attrlist_get(fs_dir->fs_file->meta->attr, TSK_FS_ATTR_TYPE_NTFS_IDXROOT); - if (!fs_attr_root) { - tsk_error_errstr2_concat(" - dent_walk: $IDX_ROOT not found"); - return TSK_COR; - } - - if (fs_attr_root->flags & TSK_FS_ATTR_NONRES) { - tsk_error_reset(); - tsk_error_set_errno(TSK_ERR_FS_INODE_COR); - tsk_error_set_errstr + // NOTE: We had one error reported on a system that did not have IDX_ROOT, but did have IDX_ALLOC + if (fs_attr_root) { + if (fs_attr_root->flags & TSK_FS_ATTR_NONRES) { + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_FS_INODE_COR); + tsk_error_set_errstr ("dent_walk: $IDX_ROOT is not resident - it should be"); - return TSK_COR; - } - idxroot = (ntfs_idxroot *) fs_attr_root->rd.buf; + return TSK_COR; + } + idxroot = (ntfs_idxroot *)fs_attr_root->rd.buf; - /* Verify that the attribute type is $FILE_NAME */ - if (tsk_getu32(a_fs->endian, idxroot->type) == 0) { - tsk_error_reset(); - tsk_error_set_errno(TSK_ERR_FS_INODE_COR); - tsk_error_set_errstr + /* Verify that the attribute type is $FILE_NAME */ + if (tsk_getu32(a_fs->endian, idxroot->type) == 0) { + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_FS_INODE_COR); + tsk_error_set_errstr ("dent_walk: Attribute type in index root is 0"); - return TSK_COR; - } - else if (tsk_getu32(a_fs->endian, idxroot->type) != NTFS_ATYPE_FNAME) { - tsk_error_reset(); - tsk_error_set_errno(TSK_ERR_FS_INODE_COR); - tsk_error_set_errstr("ERROR: Directory index is sorted by type: %" - PRIu32 ".\nOnly $FNAME is currently supported", - tsk_getu32(a_fs->endian, idxroot->type)); - return TSK_COR; + return TSK_COR; + } + else if (tsk_getu32(a_fs->endian, idxroot->type) != NTFS_ATYPE_FNAME) { + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_FS_INODE_COR); + tsk_error_set_errstr("ERROR: Directory index is sorted by type: %" + PRIu32 ".\nOnly $FNAME is currently supported", + tsk_getu32(a_fs->endian, idxroot->type)); + return TSK_COR; + } } @@ -924,49 +922,52 @@ ntfs_dir_open_meta(TSK_FS_INFO * a_fs, TSK_FS_DIR ** a_fs_dir, /* Now we return to processing the Index Root Attribute */ - if (tsk_verbose) - tsk_fprintf(stderr, - "ntfs_dir_open_meta: Processing $IDX_ROOT of inum %" PRIuINUM - "\n", a_addr); + if (fs_attr_root) { + + if (tsk_verbose) + tsk_fprintf(stderr, + "ntfs_dir_open_meta: Processing $IDX_ROOT of inum %" PRIuINUM + "\n", a_addr); - /* Get the header of the index entry list */ - idxelist = &idxroot->list; + /* Get the header of the index entry list */ + idxelist = &idxroot->list; - /* Verify the offset pointers */ - if ((tsk_getu32(a_fs->endian, idxelist->seqend_off) < + /* Verify the offset pointers */ + if ((tsk_getu32(a_fs->endian, idxelist->seqend_off) < tsk_getu32(a_fs->endian, idxelist->begin_off)) || - (tsk_getu32(a_fs->endian, idxelist->bufend_off) < - tsk_getu32(a_fs->endian, idxelist->seqend_off)) || - (((uintptr_t) idxelist + tsk_getu32(a_fs->endian, + (tsk_getu32(a_fs->endian, idxelist->bufend_off) < + tsk_getu32(a_fs->endian, idxelist->seqend_off)) || + (((uintptr_t)idxelist + tsk_getu32(a_fs->endian, idxelist->bufend_off)) > - ((uintptr_t) fs_attr_root->rd.buf + - fs_attr_root->rd.buf_size))) { - tsk_error_reset(); - tsk_error_set_errno(TSK_ERR_FS_INODE_COR); - tsk_error_set_errstr + ((uintptr_t)fs_attr_root->rd.buf + + fs_attr_root->rd.buf_size))) { + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_FS_INODE_COR); + tsk_error_set_errstr ("Error: Index list offsets are invalid on entry: %" PRIuINUM, - fs_dir->fs_file->meta->addr); - return TSK_COR; - } + fs_dir->fs_file->meta->addr); + return TSK_COR; + } - /* Get the offset to the start of the index entry list */ - idxe = (ntfs_idxentry *) ((uintptr_t) idxelist + - tsk_getu32(a_fs->endian, idxelist->begin_off)); + /* Get the offset to the start of the index entry list */ + idxe = (ntfs_idxentry *)((uintptr_t)idxelist + + tsk_getu32(a_fs->endian, idxelist->begin_off)); - retval_tmp = ntfs_proc_idxentry(ntfs, fs_dir, - (fs_dir->fs_file->meta->flags & TSK_FS_META_FLAG_UNALLOC) ? 1 : 0, - idxe, - tsk_getu32(a_fs->endian, idxelist->bufend_off) - - tsk_getu32(a_fs->endian, idxelist->begin_off), - tsk_getu32(a_fs->endian, idxelist->seqend_off) - - tsk_getu32(a_fs->endian, idxelist->begin_off)); + retval_tmp = ntfs_proc_idxentry(ntfs, fs_dir, + (fs_dir->fs_file->meta->flags & TSK_FS_META_FLAG_UNALLOC) ? 1 : 0, + idxe, + tsk_getu32(a_fs->endian, idxelist->bufend_off) - + tsk_getu32(a_fs->endian, idxelist->begin_off), + tsk_getu32(a_fs->endian, idxelist->seqend_off) - + tsk_getu32(a_fs->endian, idxelist->begin_off)); - // stop if we get an error, continue if we got corruption - if (retval_tmp == TSK_ERR) { - return TSK_ERR; - } - else if (retval_tmp == TSK_COR) { - retval_final = TSK_COR; + // stop if we get an error, continue if we got corruption + if (retval_tmp == TSK_ERR) { + return TSK_ERR; + } + else if (retval_tmp == TSK_COR) { + retval_final = TSK_COR; + } } /* @@ -1002,6 +1003,23 @@ ntfs_dir_open_meta(TSK_FS_INFO * a_fs, TSK_FS_DIR ** a_fs_dir, return TSK_COR; } + /* Verify that the attribute type is $FILE_NAME */ + if (tsk_getu32(a_fs->endian, fs_attr_idx->type) == 0) { + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_FS_INODE_COR); + tsk_error_set_errstr + ("dent_walk: Attribute type in index alloc is 0"); + return TSK_COR; + } + else if (tsk_getu32(a_fs->endian, fs_attr_idx->type) != NTFS_ATYPE_FNAME) { + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_FS_INODE_COR); + tsk_error_set_errstr("ERROR: Directory index is sorted by type: %" + PRIu32 ".\nOnly $FNAME is currently supported", + tsk_getu32(a_fs->endian, fs_attr_idx->type)); + return TSK_COR; + } + /* * Copy the index allocation run into a big buffer */ From eb6e431885d71e31cad2e4e3074a6cc266472c0b Mon Sep 17 00:00:00 2001 From: Brian Carrier Date: Fri, 15 Mar 2019 11:20:34 -0400 Subject: [PATCH 0010/1548] fix null pointer issues --- tsk/fs/ntfs_dent.cpp | 26 ++++++-------------------- 1 file changed, 6 insertions(+), 20 deletions(-) diff --git a/tsk/fs/ntfs_dent.cpp b/tsk/fs/ntfs_dent.cpp index 1ba6b7d432..982032bf08 100644 --- a/tsk/fs/ntfs_dent.cpp +++ b/tsk/fs/ntfs_dent.cpp @@ -747,7 +747,7 @@ ntfs_dir_open_meta(TSK_FS_INFO * a_fs, TSK_FS_DIR ** a_fs_dir, char *idxalloc; ntfs_idxentry *idxe; ntfs_idxroot *idxroot; - ntfs_idxelist *idxelist; + ntfs_idxelist *idxelist = NULL; ntfs_idxrec *idxrec_p, *idxrec; TSK_OFF_T idxalloc_len; TSK_FS_LOAD_FILE load_file; @@ -851,7 +851,6 @@ ntfs_dir_open_meta(TSK_FS_INFO * a_fs, TSK_FS_DIR ** a_fs_dir, return TSK_COR; } } - /* @@ -983,8 +982,8 @@ ntfs_dir_open_meta(TSK_FS_INFO * a_fs, TSK_FS_DIR ** a_fs_dir, * all of the entries */ if (!fs_attr_idx) { - if (tsk_getu32(a_fs->endian, - idxelist->flags) & NTFS_IDXELIST_CHILD) { + if ((idxelist) && (tsk_getu32(a_fs->endian, + idxelist->flags) & NTFS_IDXELIST_CHILD)) { tsk_error_reset(); tsk_error_set_errno(TSK_ERR_FS_INODE_COR); tsk_error_set_errstr @@ -1003,22 +1002,9 @@ ntfs_dir_open_meta(TSK_FS_INFO * a_fs, TSK_FS_DIR ** a_fs_dir, return TSK_COR; } - /* Verify that the attribute type is $FILE_NAME */ - if (tsk_getu32(a_fs->endian, fs_attr_idx->type) == 0) { - tsk_error_reset(); - tsk_error_set_errno(TSK_ERR_FS_INODE_COR); - tsk_error_set_errstr - ("dent_walk: Attribute type in index alloc is 0"); - return TSK_COR; - } - else if (tsk_getu32(a_fs->endian, fs_attr_idx->type) != NTFS_ATYPE_FNAME) { - tsk_error_reset(); - tsk_error_set_errno(TSK_ERR_FS_INODE_COR); - tsk_error_set_errstr("ERROR: Directory index is sorted by type: %" - PRIu32 ".\nOnly $FNAME is currently supported", - tsk_getu32(a_fs->endian, fs_attr_idx->type)); - return TSK_COR; - } + // NOTE: If there was no IDX_ROOT, then we have not done any validation at this point + // that this index structure is actually about FNAME objects. Sanity checking + // could be added here /* * Copy the index allocation run into a big buffer From 5ffb090b8250a91c7ea625659da998c4ba2bdbce Mon Sep 17 00:00:00 2001 From: root Date: Tue, 28 May 2019 00:19:10 -0700 Subject: [PATCH 0011/1548] hee hee --- tools/autotools/tsk_recover.cpp | 7 +++--- tsk/auto/auto.cpp | 1 - tsk/fs/fs_dir.c | 2 -- tsk/fs/fs_open.c | 2 -- tsk/fs/xfs.c | 43 ++++++++++++++++++++++++--------- tsk/fs/xfs_dent.c | 37 ++++++++++++++++++++++------ tsk/img/img_open.c | 1 - tsk/img/mult_files.c | 1 - 8 files changed, 64 insertions(+), 30 deletions(-) diff --git a/tools/autotools/tsk_recover.cpp b/tools/autotools/tsk_recover.cpp index 1db6222148..66cb6a069f 100644 --- a/tools/autotools/tsk_recover.cpp +++ b/tools/autotools/tsk_recover.cpp @@ -362,11 +362,12 @@ uint8_t TskRecover::findFiles(TSK_OFF_T a_soffset, TSK_FS_TYPE_ENUM a_ftype, TSK_INUM_T a_dirInum) { uint8_t retval; - if (a_dirInum) + if (a_dirInum){ retval = findFilesInFs(a_soffset * m_img_info->sector_size, a_ftype, a_dirInum); - else + } + else{ retval = findFilesInFs(a_soffset * m_img_info->sector_size, a_ftype); - + } printf("Files Recovered: %d\n", m_fileCount); return retval; } diff --git a/tsk/auto/auto.cpp b/tsk/auto/auto.cpp index 9d71b4dfff..d5879baf5c 100644 --- a/tsk/auto/auto.cpp +++ b/tsk/auto/auto.cpp @@ -523,7 +523,6 @@ TSK_WALK_RET_ENUM // we have no way to register an error... return TSK_WALK_STOP; } - TSK_RETVAL_ENUM retval = tsk->processFile(a_fs_file, a_path); if ((retval == TSK_STOP) || (tsk->getStopProcessing())) return TSK_WALK_STOP; diff --git a/tsk/fs/fs_dir.c b/tsk/fs/fs_dir.c index 5abd9b8c14..e43fb6ffe6 100644 --- a/tsk/fs/fs_dir.c +++ b/tsk/fs/fs_dir.c @@ -576,7 +576,6 @@ tsk_fs_dir_walk_lcl(TSK_FS_INFO * a_fs, DENT_DINFO * a_dinfo, * Must have non-zero inode addr or have allocated name (if inode is 0) */ if (((fs_file->name->meta_addr) || (fs_file->name->flags & TSK_FS_NAME_FLAG_ALLOC))) { - /* Note that the NTFS code behind here has a slight hack to use the * correct sequence number based on the data in fs_file->name */ if (a_fs->file_add_meta(a_fs, fs_file, @@ -589,7 +588,6 @@ tsk_fs_dir_walk_lcl(TSK_FS_INFO * a_fs, DENT_DINFO * a_dinfo, // call the action if we have the right flags. if ((fs_file->name->flags & a_flags) == fs_file->name->flags) { - retval = a_action(fs_file, a_dinfo->dirs, a_ptr); if (retval == TSK_WALK_STOP) { tsk_fs_dir_close(fs_dir); diff --git a/tsk/fs/fs_open.c b/tsk/fs/fs_open.c index b52e7b883a..633d4063b1 100644 --- a/tsk/fs/fs_open.c +++ b/tsk/fs/fs_open.c @@ -84,7 +84,6 @@ tsk_fs_open_img(TSK_IMG_INFO * a_img_info, TSK_OFF_T a_offset, TSK_FS_TYPE_ENUM a_ftype) { TSK_FS_INFO *fs_info; - const struct { char* name; TSK_FS_INFO* (*open)(TSK_IMG_INFO*, TSK_OFF_T, @@ -154,7 +153,6 @@ tsk_fs_open_img(TSK_IMG_INFO * a_img_info, TSK_OFF_T a_offset, tsk_error_reset(); tsk_error_set_errno(TSK_ERR_FS_UNKTYPE); } - return fs_first; } else if (TSK_FS_TYPE_ISNTFS(a_ftype)) { diff --git a/tsk/fs/xfs.c b/tsk/fs/xfs.c index 2fff98b2dd..a72ceb4103 100644 --- a/tsk/fs/xfs.c +++ b/tsk/fs/xfs.c @@ -271,7 +271,6 @@ static uint8_t xfs_load_attrs(TSK_FS_FILE * fs_file) { TSK_FS_INFO * fs = (TSK_FS_INFO*)fs_file->fs_info; - // not needed to implement about shortform data fork. shortform does not have location of real file. if (fs_file->meta->content_type == TSK_FS_META_CONTENT_TYPE_XFS_DATA_FORK_EXTENTS) { xfs_load_attrs_block(fs_file); @@ -417,6 +416,7 @@ xfs_dinode_copy(XFS_INFO * xfs, TSK_FS_META * fs_meta, fs_meta->size = tsk_getu64(fs->endian, dino_buf->di_size); fs_meta->addr = inum; + /* the general size value in the inode is only 32-bits, * but the i_dir_acl value is used for regular files to * hold the upper 32-bits @@ -508,15 +508,20 @@ uint8_t xfs_inode_walk(TSK_FS_INFO * fs, TSK_INUM_T start_inum, TSK_INUM_T end_i tsk_error_set_errstr("%s: end inode: %s" PRIuINUM "", myname, end_inum); return 1; } + + printf("xfs.c(520): 1\n"); if (flags & TSK_FS_META_FLAG_ORPHAN) { + printf("xfs.c(522): 1\n"); flags |= TSK_FS_META_FLAG_UNALLOC; flags &= ~TSK_FS_META_FLAG_ALLOC; flags |= TSK_FS_META_FLAG_USED; flags &= ~TSK_FS_META_FLAG_UNUSED; } else { + printf("xfs.c(529): 2\n"); if (((flags & TSK_FS_META_FLAG_ALLOC) == 0) && ((flags & TSK_FS_META_FLAG_UNALLOC) == 0)) { + printf("xfs.c(532): 3\n"); flags |= (TSK_FS_META_FLAG_ALLOC | TSK_FS_META_FLAG_UNALLOC); } @@ -525,6 +530,7 @@ uint8_t xfs_inode_walk(TSK_FS_INFO * fs, TSK_INUM_T start_inum, TSK_INUM_T end_i */ if (((flags & TSK_FS_META_FLAG_USED) == 0) && ((flags & TSK_FS_META_FLAG_UNUSED) == 0)) { + printf("xfs.c(541): 4\n"); flags |= (TSK_FS_META_FLAG_USED | TSK_FS_META_FLAG_UNUSED); } } @@ -532,14 +538,16 @@ uint8_t xfs_inode_walk(TSK_FS_INFO * fs, TSK_INUM_T start_inum, TSK_INUM_T end_i * in the list of unalloc inodes that are pointed to, then fill * in the list */ + printf("xfs.c(549): 5\n"); if ((flags & TSK_FS_META_FLAG_ORPHAN)) { + printf("xfs.c(551): 6\n"); if (tsk_fs_dir_load_inum_named(fs) != TSK_OK) { tsk_error_errstr2_concat ("- ext2fs_inode_walk: identifying inodes allocated by file names"); return 1; } } - + printf("xfs.c(558): 7\n"); if ((fs_file = tsk_fs_file_alloc(fs)) == NULL) return 1; @@ -569,6 +577,7 @@ xfs_inode_lookup(TSK_FS_INFO * fs, TSK_FS_FILE * a_fs_file, // = file_add_meta xfs_dinode * dino_buf = NULL; unsigned int size = 0; + if (a_fs_file == NULL) { tsk_error_set_errno(TSK_ERR_FS_ARG); tsk_error_set_errstr("ext2fs_inode_lookup: fs_file is NULL"); @@ -583,15 +592,18 @@ xfs_inode_lookup(TSK_FS_INFO * fs, TSK_FS_FILE * a_fs_file, // = file_add_meta else { tsk_fs_meta_reset(a_fs_file->meta); } - + // see if they are looking for the special "orphans" directory - if (inum == TSK_FS_ORPHANDIR_INUM(fs)) { - if (tsk_fs_dir_make_orphan_dir_meta(fs, a_fs_file->meta)) - return 1; - else - return 0; + /* if (a_fs_file->fs_info->root_inum != inum) { + if ((a_fs_file->name->flags & TSK_FS_NAME_FLAG_UNALLOC) == TSK_FS_NAME_FLAG_UNALLOC) { + printf("xfs.c(591): I'm orphan\n"); + if (tsk_fs_dir_make_orphan_dir_meta(fs, a_fs_file->meta)) + return 1; + else + return 0; + } } - +*/ size = xfs->inode_size > sizeof(xfs_dinode) ? xfs->inode_size : sizeof(xfs_dinode); @@ -599,7 +611,7 @@ xfs_inode_lookup(TSK_FS_INFO * fs, TSK_FS_FILE * a_fs_file, // = file_add_meta if((dino_buf = (xfs_dinode *)tsk_malloc(size)) == NULL){ return 1; } - + if (xfs_dinode_load(xfs, inum, dino_buf)){ free(dino_buf); return 1; @@ -609,7 +621,14 @@ xfs_inode_lookup(TSK_FS_INFO * fs, TSK_FS_FILE * a_fs_file, // = file_add_meta free(dino_buf); return 1; } - + if (a_fs_file->fs_info->root_inum != inum) { + if ((a_fs_file->name->flags & TSK_FS_NAME_FLAG_UNALLOC) == TSK_FS_NAME_FLAG_UNALLOC) { + + xfs_bmbt_irec_t *irec = (xfs_bmbt_irec_t*)tsk_malloc(sizeof(xfs_bmbt_irec_t)); + xfs_bmbt_disk_get_all(xfs, a_fs_file->meta->content_ptr, irec); + a_fs_file->meta->size = irec->br_blockcount * fs->block_size; + } + } free(dino_buf); return 0; } @@ -768,7 +787,6 @@ xfs_open(TSK_IMG_INFO * img_info, TSK_OFF_T offset, tsk_fs_free((TSK_FS_INFO *)xfs); return NULL; } - cnt = tsk_fs_read(fs, XFS_SBOFF, (char *) xfs->fs, len); if (cnt != len){ @@ -783,6 +801,7 @@ xfs_open(TSK_IMG_INFO * img_info, TSK_OFF_T offset, return NULL; } + if(tsk_fs_guessu32(fs, xfs->fs->sb_magicnum, XFS_FS_MAGIC)){ if (tsk_verbose){ fprintf(stderr, "xfs_open : superblock magic failed\n"); diff --git a/tsk/fs/xfs_dent.c b/tsk/fs/xfs_dent.c index 28fdae17ec..918e188713 100644 --- a/tsk/fs/xfs_dent.c +++ b/tsk/fs/xfs_dent.c @@ -181,13 +181,14 @@ xfs_dent_parse_shortform(XFS_INFO * xfs, TSK_FS_DIR * a_fs_dir, ent = (char*)(hdr + 1) - (hdr->i8count == 0) * 4; // code of miracle uint16_t num_entries = (hdr->i8count > 0) ? hdr->i8count : hdr->count; + uint16_t num_entries_chk = 0; - for (i = 0; i < num_entries; i++) + while (1) { uint8_t namelen; uint64_t inode; char* name; - + dir2_sf->entry = ent; namelen = ent->namelen; inode = xfs_dir2_sf_get_ino(hdr, ent); @@ -195,19 +196,24 @@ xfs_dent_parse_shortform(XFS_INFO * xfs, TSK_FS_DIR * a_fs_dir, name[namelen] = '\0'; memcpy(name, ent->name, namelen); - + if (inode > fs->last_inum || namelen > XFS_MAXNAMELEN || namelen == 0) { - fprintf(stderr, "[i] xfs_dent_parse_shortform: xfs_dent.c: %d - sanity check error\n", __LINE__); - return TSK_ERR; + break; } if (xfs_dent_copy(xfs, dir2_sf, fs_name, fs_file)) { tsk_fs_name_free(fs_name); return TSK_ERR; } + num_entries_chk++; - fs_name->flags = TSK_FS_NAME_FLAG_ALLOC; - + if (num_entries < num_entries_chk) { + fs_name->flags = TSK_FS_NAME_FLAG_UNALLOC; + + } + else { + fs_name->flags = TSK_FS_NAME_FLAG_ALLOC; + } if (tsk_fs_dir_add(a_fs_dir, fs_name)) { tsk_fs_name_free(fs_name); return TSK_ERR; @@ -215,6 +221,21 @@ xfs_dent_parse_shortform(XFS_INFO * xfs, TSK_FS_DIR * a_fs_dir, ent = xfs_dir3_sf_nextentry(hdr, ent); } + + // print number of the dir entries + if (num_entries == 0) { + printf("deleted num_entries : %d\n", num_entries_chk); + } + else if (num_entries != 0 && num_entries_chk == 0){ + printf("there is no deleted file, num_entries : %d\n", num_entries); + } + else if (num_entries != 0 && num_entries_chk != 0 && num_entries_chk != num_entries_chk) { + printf("there is deleted file, alloc file num is %d, unalloc file num is %d\n", num_entries, num_entries_chk); + } + else { + printf("there is no deleted file, num_entries : %d\n", num_entries); + } + tsk_fs_name_free(fs_name); return TSK_OK; } @@ -323,7 +344,6 @@ xfs_dent_parse(XFS_INFO * xfs, TSK_FS_DIR * a_fs_dir, xfs_dent_parse_block(xfs, a_fs_dir, a_is_del, list_seen, buf, offset); break; } - return TSK_OK; } @@ -349,6 +369,7 @@ xfs_dir_open_meta(TSK_FS_INFO * a_fs, TSK_FS_DIR ** a_fs_dir, TSK_LIST *list_seen = NULL; TSK_OFF_T size; + char *dirbuf; TSK_RETVAL_ENUM retval_tmp; diff --git a/tsk/img/img_open.c b/tsk/img/img_open.c index e49a0d3ac6..6325a3f870 100644 --- a/tsk/img/img_open.c +++ b/tsk/img/img_open.c @@ -211,7 +211,6 @@ tsk_img_open(int num_img, tsk_error_reset(); } #endif - // if any of the non-raw formats were detected, then use it. if (img_set != NULL) { img_info = img_set; diff --git a/tsk/img/mult_files.c b/tsk/img/mult_files.c index 1cd41a562f..9383d84227 100644 --- a/tsk/img/mult_files.c +++ b/tsk/img/mult_files.c @@ -184,7 +184,6 @@ tsk_img_findFiles(const TSK_TCHAR * a_startingName, int *a_numFound) if (tsk_verbose) tsk_fprintf(stderr, "tsk_img_findFiles: %" PRIttocTSK " found\n", nextName); - // add to list fileCount++; if (fileCount == 1) From 1def1dac0a24c50a72c2d82b2114c3344b4011cc Mon Sep 17 00:00:00 2001 From: root Date: Wed, 29 May 2019 00:19:20 -0700 Subject: [PATCH 0012/1548] Fix the minor bugs of recovery routine --- tools/autotools/tsk_recover.cpp | 2 +- tsk/auto/auto.cpp | 3 ++ tsk/fs/fs_dir.c | 10 +++--- tsk/fs/xfs.c | 64 ++++++++++++++++++++------------- tsk/fs/xfs_dent.c | 51 +++++++++----------------- 5 files changed, 66 insertions(+), 64 deletions(-) diff --git a/tools/autotools/tsk_recover.cpp b/tools/autotools/tsk_recover.cpp index 66cb6a069f..3fbd25ad8a 100644 --- a/tools/autotools/tsk_recover.cpp +++ b/tools/autotools/tsk_recover.cpp @@ -368,6 +368,7 @@ TskRecover::findFiles(TSK_OFF_T a_soffset, TSK_FS_TYPE_ENUM a_ftype, TSK_INUM_T else{ retval = findFilesInFs(a_soffset * m_img_info->sector_size, a_ftype); } + printf("Files Recovered: %d\n", m_fileCount); return retval; } @@ -496,7 +497,6 @@ main(int argc, char **argv1) tsk_error_print(stderr); exit(1); } - if (tskRecover.findFiles(soffset, fstype, dirInum)) { // errors were already logged exit(1); diff --git a/tsk/auto/auto.cpp b/tsk/auto/auto.cpp index d5879baf5c..8e1ac21e48 100644 --- a/tsk/auto/auto.cpp +++ b/tsk/auto/auto.cpp @@ -377,6 +377,7 @@ TSK_RETVAL_ENUM TSK_RETVAL_ENUM retval = findFilesInFsInt(fs_info, fs_info->root_inum); tsk_fs_close(fs_info); + if (m_errors.empty() == false) return TSK_ERR; else @@ -462,6 +463,7 @@ uint8_t } findFilesInFsInt(fs_info, a_inum); + tsk_fs_close(fs_info); return m_errors.empty() ? 0 : 1; } @@ -518,6 +520,7 @@ TSK_WALK_RET_ENUM TskAuto::dirWalkCb(TSK_FS_FILE * a_fs_file, const char *a_path, void *a_ptr) { + TskAuto *tsk = (TskAuto *) a_ptr; if (tsk->m_tag != TSK_AUTO_TAG) { // we have no way to register an error... diff --git a/tsk/fs/fs_dir.c b/tsk/fs/fs_dir.c index e43fb6ffe6..2ab1e12365 100644 --- a/tsk/fs/fs_dir.c +++ b/tsk/fs/fs_dir.c @@ -564,14 +564,12 @@ tsk_fs_dir_walk_lcl(TSK_FS_INFO * a_fs, DENT_DINFO * a_dinfo, tsk_fs_dir_close(fs_dir); return TSK_WALK_ERROR; } - for (i = 0; i < fs_dir->names_used; i++) { TSK_WALK_RET_ENUM retval; /* Point name to the buffer of names. We need to be * careful about resetting this before we free fs_file */ fs_file->name = (TSK_FS_NAME *) & fs_dir->names[i]; - /* load the fs_meta structure if possible. * Must have non-zero inode addr or have allocated name (if inode is 0) */ if (((fs_file->name->meta_addr) @@ -585,7 +583,6 @@ tsk_fs_dir_walk_lcl(TSK_FS_INFO * a_fs, DENT_DINFO * a_dinfo, tsk_error_reset(); } } - // call the action if we have the right flags. if ((fs_file->name->flags & a_flags) == fs_file->name->flags) { retval = a_action(fs_file, a_dinfo->dirs, a_ptr); @@ -626,7 +623,6 @@ tsk_fs_dir_walk_lcl(TSK_FS_INFO * a_fs, DENT_DINFO * a_dinfo, } } - /* Optimization. If we are about to recurse into the * orphan directory and we are the last item in the * directory and the flag has been set to save inum_named, @@ -707,6 +703,7 @@ tsk_fs_dir_walk_lcl(TSK_FS_INFO * a_fs, DENT_DINFO * a_dinfo, save_bak = a_dinfo->save_inum_named; a_dinfo->save_inum_named = 0; } + retval = tsk_fs_dir_walk_lcl(a_fs, a_dinfo, fs_file->name->meta_addr, a_flags, a_action, a_ptr); @@ -729,9 +726,11 @@ tsk_fs_dir_walk_lcl(TSK_FS_INFO * a_fs, DENT_DINFO * a_dinfo, return TSK_WALK_STOP; } + // reset the save status if (fs_file->name->meta_addr == TSK_FS_ORPHANDIR_INUM(a_fs)) { + a_dinfo->save_inum_named = save_bak; } @@ -741,6 +740,7 @@ tsk_fs_dir_walk_lcl(TSK_FS_INFO * a_fs, DENT_DINFO * a_dinfo, *a_dinfo->didx[a_dinfo->depth] = '\0'; } else { + if (tsk_verbose) fprintf(stderr, "tsk_fs_dir_walk_lcl: Loop detected with address %" @@ -818,10 +818,12 @@ tsk_fs_dir_walk(TSK_FS_INFO * a_fs, TSK_INUM_T a_addr, // if we were saving the list of named files in the temp list, // then now save them to FS_INFO if (dinfo.save_inum_named == 1) { + if (retval != TSK_WALK_CONT) { /* There was an error and we stopped early, so we should get * rid of the partial list we were making. */ + tsk_list_free(dinfo.list_inum_named); dinfo.list_inum_named = NULL; } diff --git a/tsk/fs/xfs.c b/tsk/fs/xfs.c index a72ceb4103..097c4a831c 100644 --- a/tsk/fs/xfs.c +++ b/tsk/fs/xfs.c @@ -271,11 +271,17 @@ static uint8_t xfs_load_attrs(TSK_FS_FILE * fs_file) { TSK_FS_INFO * fs = (TSK_FS_INFO*)fs_file->fs_info; + // not needed to implement about shortform data fork. shortform does not have location of real file. if (fs_file->meta->content_type == TSK_FS_META_CONTENT_TYPE_XFS_DATA_FORK_EXTENTS) { xfs_load_attrs_block(fs_file); } else if (fs_file->meta->content_type == TSK_FS_META_CONTENT_TYPE_XFS_DATA_FORK_BTREE) { + printf("We are devleoping this\n"); + return 1; + } + else if (fs_file->meta->content_type == TSK_FS_META_CONTENT_TYPE_XFS_DATA_FORK_SHORTFORM) { + printf("We are devleoping this\n"); return 1; } else { @@ -468,7 +474,7 @@ xfs_dinode_copy(XFS_INFO * xfs, TSK_FS_META * fs_meta, } fs_meta->content_ptr = (void*) content_buf; - + if (dino_buf->di_format == XFS_DINODE_FMT_LOCAL){ fs_meta->content_type = TSK_FS_META_CONTENT_TYPE_XFS_DATA_FORK_SHORTFORM; } @@ -481,7 +487,6 @@ xfs_dinode_copy(XFS_INFO * xfs, TSK_FS_META * fs_meta, else{ fprintf(stderr, "xfs : inode core format not supported : inode format %d\n", dino_buf->di_format); } - return 0; } @@ -509,19 +514,15 @@ uint8_t xfs_inode_walk(TSK_FS_INFO * fs, TSK_INUM_T start_inum, TSK_INUM_T end_i return 1; } - printf("xfs.c(520): 1\n"); if (flags & TSK_FS_META_FLAG_ORPHAN) { - printf("xfs.c(522): 1\n"); flags |= TSK_FS_META_FLAG_UNALLOC; flags &= ~TSK_FS_META_FLAG_ALLOC; flags |= TSK_FS_META_FLAG_USED; flags &= ~TSK_FS_META_FLAG_UNUSED; } else { - printf("xfs.c(529): 2\n"); if (((flags & TSK_FS_META_FLAG_ALLOC) == 0) && ((flags & TSK_FS_META_FLAG_UNALLOC) == 0)) { - printf("xfs.c(532): 3\n"); flags |= (TSK_FS_META_FLAG_ALLOC | TSK_FS_META_FLAG_UNALLOC); } @@ -530,7 +531,6 @@ uint8_t xfs_inode_walk(TSK_FS_INFO * fs, TSK_INUM_T start_inum, TSK_INUM_T end_i */ if (((flags & TSK_FS_META_FLAG_USED) == 0) && ((flags & TSK_FS_META_FLAG_UNUSED) == 0)) { - printf("xfs.c(541): 4\n"); flags |= (TSK_FS_META_FLAG_USED | TSK_FS_META_FLAG_UNUSED); } } @@ -538,16 +538,13 @@ uint8_t xfs_inode_walk(TSK_FS_INFO * fs, TSK_INUM_T start_inum, TSK_INUM_T end_i * in the list of unalloc inodes that are pointed to, then fill * in the list */ - printf("xfs.c(549): 5\n"); if ((flags & TSK_FS_META_FLAG_ORPHAN)) { - printf("xfs.c(551): 6\n"); if (tsk_fs_dir_load_inum_named(fs) != TSK_OK) { tsk_error_errstr2_concat ("- ext2fs_inode_walk: identifying inodes allocated by file names"); return 1; } } - printf("xfs.c(558): 7\n"); if ((fs_file = tsk_fs_file_alloc(fs)) == NULL) return 1; @@ -577,7 +574,6 @@ xfs_inode_lookup(TSK_FS_INFO * fs, TSK_FS_FILE * a_fs_file, // = file_add_meta xfs_dinode * dino_buf = NULL; unsigned int size = 0; - if (a_fs_file == NULL) { tsk_error_set_errno(TSK_ERR_FS_ARG); tsk_error_set_errstr("ext2fs_inode_lookup: fs_file is NULL"); @@ -594,16 +590,13 @@ xfs_inode_lookup(TSK_FS_INFO * fs, TSK_FS_FILE * a_fs_file, // = file_add_meta } // see if they are looking for the special "orphans" directory - /* if (a_fs_file->fs_info->root_inum != inum) { - if ((a_fs_file->name->flags & TSK_FS_NAME_FLAG_UNALLOC) == TSK_FS_NAME_FLAG_UNALLOC) { - printf("xfs.c(591): I'm orphan\n"); - if (tsk_fs_dir_make_orphan_dir_meta(fs, a_fs_file->meta)) - return 1; - else - return 0; - } + if (inum == TSK_FS_ORPHANDIR_INUM(fs)) { + if (tsk_fs_dir_make_orphan_dir_meta(fs, a_fs_file->meta)) + return 1; + else + return 0; } -*/ + size = xfs->inode_size > sizeof(xfs_dinode) ? xfs->inode_size : sizeof(xfs_dinode); @@ -616,19 +609,42 @@ xfs_inode_lookup(TSK_FS_INFO * fs, TSK_FS_FILE * a_fs_file, // = file_add_meta free(dino_buf); return 1; } - if (xfs_dinode_copy(xfs, a_fs_file->meta, inum, dino_buf)){ free(dino_buf); return 1; } - if (a_fs_file->fs_info->root_inum != inum) { - if ((a_fs_file->name->flags & TSK_FS_NAME_FLAG_UNALLOC) == TSK_FS_NAME_FLAG_UNALLOC) { - + + // Trick to walk unalloc file and dent + if (a_fs_file->name != NULL){ + if ((TSK_FS_IS_DIR_META(a_fs_file->meta->type) == 0) && (TSK_FS_IS_DIR_NAME(a_fs_file->name->type) == 0) + && ((a_fs_file->name->type == TSK_FS_NAME_TYPE_UNDEF) == 0) && (a_fs_file->meta->size == 0)) + { xfs_bmbt_irec_t *irec = (xfs_bmbt_irec_t*)tsk_malloc(sizeof(xfs_bmbt_irec_t)); xfs_bmbt_disk_get_all(xfs, a_fs_file->meta->content_ptr, irec); a_fs_file->meta->size = irec->br_blockcount * fs->block_size; + + } + else if(a_fs_file->meta->type == TSK_FS_META_TYPE_UNDEF) { + TSK_FS_META * new_meta; + new_meta = tsk_fs_meta_alloc(fs); + if ((new_meta = tsk_fs_meta_alloc(XFS_CONTENT_LEN_V5(xfs))) == NULL) // #define XFS_CONTENT_LEN + return 1; + + dino_buf->di_mode[0] = 0x41; + dino_buf->di_mode[1] = 0xED; + + if(xfs_dinode_copy(xfs, new_meta, inum, dino_buf)){ + free(dino_buf); + return 1; + } + + a_fs_file->meta = new_meta; + a_fs_file->meta->flags = TSK_FS_META_FLAG_UNALLOC; + a_fs_file->name->flags = TSK_FS_NAME_FLAG_UNALLOC; + } } + free(dino_buf); return 0; } diff --git a/tsk/fs/xfs_dent.c b/tsk/fs/xfs_dent.c index 918e188713..7eb4220072 100644 --- a/tsk/fs/xfs_dent.c +++ b/tsk/fs/xfs_dent.c @@ -158,8 +158,7 @@ xfs_dent_copy(XFS_INFO * xfs, } static TSK_RETVAL_ENUM -xfs_dent_parse_shortform(XFS_INFO * xfs, TSK_FS_DIR * a_fs_dir, - uint8_t a_is_del, TSK_LIST ** list_seen, char *buf, TSK_OFF_T offset) +xfs_dent_parse_shortform(XFS_INFO * xfs, TSK_FS_DIR * a_fs_dir, uint8_t a_is_del, TSK_LIST ** list_seen, char *buf, TSK_OFF_T offset) { TSK_FS_INFO *fs = &(xfs->fs_info); @@ -207,13 +206,8 @@ xfs_dent_parse_shortform(XFS_INFO * xfs, TSK_FS_DIR * a_fs_dir, } num_entries_chk++; - if (num_entries < num_entries_chk) { - fs_name->flags = TSK_FS_NAME_FLAG_UNALLOC; - - } - else { - fs_name->flags = TSK_FS_NAME_FLAG_ALLOC; - } + fs_name->flags = TSK_FS_NAME_FLAG_ALLOC; + if (tsk_fs_dir_add(a_fs_dir, fs_name)) { tsk_fs_name_free(fs_name); return TSK_ERR; @@ -222,20 +216,6 @@ xfs_dent_parse_shortform(XFS_INFO * xfs, TSK_FS_DIR * a_fs_dir, ent = xfs_dir3_sf_nextentry(hdr, ent); } - // print number of the dir entries - if (num_entries == 0) { - printf("deleted num_entries : %d\n", num_entries_chk); - } - else if (num_entries != 0 && num_entries_chk == 0){ - printf("there is no deleted file, num_entries : %d\n", num_entries); - } - else if (num_entries != 0 && num_entries_chk != 0 && num_entries_chk != num_entries_chk) { - printf("there is deleted file, alloc file num is %d, unalloc file num is %d\n", num_entries, num_entries_chk); - } - else { - printf("there is no deleted file, num_entries : %d\n", num_entries); - } - tsk_fs_name_free(fs_name); return TSK_OK; } @@ -267,8 +247,7 @@ xfs_dent_parse_btree(XFS_INFO * xfs, TSK_FS_DIR * a_fs_dir, * or leaf */ static TSK_RETVAL_ENUM -xfs_dent_parse_block(XFS_INFO * xfs, TSK_FS_DIR * a_fs_dir, - uint8_t a_is_del, TSK_LIST ** list_seen, char *buf, TSK_OFF_T offset) +xfs_dent_parse_block(XFS_INFO * xfs, TSK_FS_DIR * a_fs_dir, uint8_t a_is_del, TSK_LIST ** list_seen, char *buf, TSK_OFF_T offset) { TSK_FS_INFO *fs_info = &(xfs->fs_info); TSK_FS_NAME *fs_name; @@ -299,9 +278,15 @@ xfs_dent_parse_block(XFS_INFO * xfs, TSK_FS_DIR * a_fs_dir, // sanity check if (hdr->hdr.magic != 0x33424458) { // XDB3 - fprintf(stderr, "[i] xfs_dent_parse_block: xfs.c: %d - not a dir2_data_hdr: %8x\n", - __LINE__, hdr->hdr.magic); - return TSK_ERR; + // Trick to explore unalloc dent + a_fs_dir->fs_file->meta->content_type = TSK_FS_META_CONTENT_TYPE_XFS_DATA_FORK_SHORTFORM; + if (xfs_dent_parse_shortform(xfs, a_fs_dir, a_is_del, list_seen, buf, offset) == TSK_OK){ + return TSK_OK; + }else{ + fprintf(stderr, "[i] xfs_dent_parse_block: xfs_dent.c: %d - not a dir2_data_hdr: %8x\n", + __LINE__, hdr->hdr.magic); + return TSK_ERR; + } } xfs_dir2_data_entry_t *ent = (xfs_dir2_data_entry_t*)((char*)(hdr + 1) + 32); // magically should be happened @@ -330,11 +315,9 @@ xfs_dent_parse_block(XFS_INFO * xfs, TSK_FS_DIR * a_fs_dir, } static TSK_RETVAL_ENUM -xfs_dent_parse(XFS_INFO * xfs, TSK_FS_DIR * a_fs_dir, - uint8_t a_is_del, TSK_LIST ** list_seen, char *buf, TSK_OFF_T offset) +xfs_dent_parse(XFS_INFO * xfs, TSK_FS_DIR * a_fs_dir, uint8_t a_is_del, TSK_LIST ** list_seen, char *buf, TSK_OFF_T offset) { TSK_FS_INFO* fs_info = (TSK_FS_INFO*) xfs; - switch(a_fs_dir->fs_file->meta->content_type){ case TSK_FS_META_CONTENT_TYPE_XFS_DATA_FORK_SHORTFORM: xfs_dent_parse_shortform(xfs, a_fs_dir, a_is_del, list_seen, buf, offset); @@ -369,7 +352,6 @@ xfs_dir_open_meta(TSK_FS_INFO * a_fs, TSK_FS_DIR ** a_fs_dir, TSK_LIST *list_seen = NULL; TSK_OFF_T size; - char *dirbuf; TSK_RETVAL_ENUM retval_tmp; @@ -425,11 +407,10 @@ xfs_dir_open_meta(TSK_FS_INFO * a_fs, TSK_FS_DIR ** a_fs_dir, memcpy(dirbuf, fs_dir->fs_file->meta->content_ptr, XFS_CONTENT_LEN_V5(xfs)); retval_tmp = - xfs_dent_parse(xfs, fs_dir, - (fs_dir->fs_file->meta-> + xfs_dent_parse(xfs, fs_dir, (fs_dir->fs_file->meta-> flags & TSK_FS_META_FLAG_UNALLOC) ? 1 : 0, &list_seen, dirbuf, XFS_CONTENT_LEN_V5(xfs)); - + if (retval_tmp == TSK_ERR) retval_final = TSK_ERR; else if (retval_tmp == TSK_COR) From e57ed2eedeabc1eaf969a2da6f4fda8bdc4c87c5 Mon Sep 17 00:00:00 2001 From: Aapo Rantalainen Date: Wed, 19 Feb 2020 16:21:23 +0200 Subject: [PATCH 0013/1548] Maximum of partitions with GPT is not 128, so slot_num can't be int8_t --- tsk/vs/mm_part.c | 2 +- tsk/vs/tsk_vs.h | 4 ++-- tsk/vs/tsk_vs_i.h | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tsk/vs/mm_part.c b/tsk/vs/mm_part.c index 911fa049a6..8eba694499 100644 --- a/tsk/vs/mm_part.c +++ b/tsk/vs/mm_part.c @@ -28,7 +28,7 @@ */ TSK_VS_PART_INFO * tsk_vs_part_add(TSK_VS_INFO * a_vs, TSK_DADDR_T a_start, TSK_DADDR_T len, - TSK_VS_PART_FLAG_ENUM type, char *desc, int8_t table, int8_t slot) + TSK_VS_PART_FLAG_ENUM type, char *desc, int8_t table, int16_t slot) { TSK_VS_PART_INFO *part; TSK_VS_PART_INFO *cur_part; diff --git a/tsk/vs/tsk_vs.h b/tsk/vs/tsk_vs.h index 5432df34bf..8de820496c 100644 --- a/tsk/vs/tsk_vs.h +++ b/tsk/vs/tsk_vs.h @@ -110,7 +110,7 @@ extern "C" { TSK_DADDR_T len; ///< Number of sectors in partition char *desc; ///< UTF-8 description of partition (volume system type-specific) int8_t table_num; ///< Table address that describes this partition - int8_t slot_num; ///< Entry in the table that describes this partition + int16_t slot_num; ///< Entry in the table that describes this partition TSK_PNUM_T addr; ///< Address of this partition TSK_VS_PART_FLAG_ENUM flags; ///< Flags for partition }; @@ -283,7 +283,7 @@ class TskVsPartInfo { * Return entry in the table that describes this partition * @return entry in the table that describes this partition */ - int8_t getSlotNum() const { + int16_t getSlotNum() const { if (m_vsPartInfo != NULL) return m_vsPartInfo->slot_num; else diff --git a/tsk/vs/tsk_vs_i.h b/tsk/vs/tsk_vs_i.h index 910657692c..f053228867 100644 --- a/tsk/vs/tsk_vs_i.h +++ b/tsk/vs/tsk_vs_i.h @@ -32,7 +32,7 @@ extern TSK_VS_INFO *tsk_vs_gpt_open(TSK_IMG_INFO *, TSK_DADDR_T); extern uint8_t tsk_vs_part_unused(TSK_VS_INFO *); extern TSK_VS_PART_INFO *tsk_vs_part_add(TSK_VS_INFO *, TSK_DADDR_T, - TSK_DADDR_T, TSK_VS_PART_FLAG_ENUM, char *, int8_t, int8_t); + TSK_DADDR_T, TSK_VS_PART_FLAG_ENUM, char *, int8_t, int16_t); extern void tsk_vs_part_free(TSK_VS_INFO *); // Endian macros - actual functions in misc/ From 189acbe4c548abe44b11081627a1fee2b8727c75 Mon Sep 17 00:00:00 2001 From: ihsinme <61293369+ihsinme@users.noreply.github.com> Date: Fri, 30 Oct 2020 17:26:12 +0300 Subject: [PATCH 0014/1548] fix of possible memory overflow. --- tools/autotools/tsk_comparedir.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/autotools/tsk_comparedir.cpp b/tools/autotools/tsk_comparedir.cpp index 918840f507..098def8d0c 100644 --- a/tools/autotools/tsk_comparedir.cpp +++ b/tools/autotools/tsk_comparedir.cpp @@ -161,18 +161,18 @@ uint8_t struct stat status; strncpy(fullPath, m_lclDir, TSK_CD_BUFSIZE); - strncat(fullPath, a_dir, TSK_CD_BUFSIZE-strlen(fullPath)); + strncat(fullPath, a_dir, TSK_CD_BUFSIZE-strlen(fullPath)-1); if ((dp = opendir(fullPath)) == NULL) { fprintf(stderr, "Error opening directory"); return 1; } while ((dirp = readdir(dp)) != NULL) { strncpy(file, a_dir, TSK_CD_BUFSIZE); - strncat(file, "/", TSK_CD_BUFSIZE-strlen(file)); - strncat(file, dirp->d_name, TSK_CD_BUFSIZE-strlen(file)); + strncat(file, "/", TSK_CD_BUFSIZE-strlen(file)-1); + strncat(file, dirp->d_name, TSK_CD_BUFSIZE-strlen(file)-1); strncpy(fullPath, m_lclDir, TSK_CD_BUFSIZE); - strncat(fullPath, file, TSK_CD_BUFSIZE-strlen(fullPath)); + strncat(fullPath, file, TSK_CD_BUFSIZE-strlen(fullPath)-1); stat(fullPath, &status); if (S_ISDIR(status.st_mode)) { From be69180481e9a35ed7df6c86f1f255f2061b42c8 Mon Sep 17 00:00:00 2001 From: Phil Tolland Date: Thu, 3 Jun 2021 10:17:27 +0100 Subject: [PATCH 0015/1548] Assign correct device block size in HFS Use TSK_IMG_INFO::sector_size, as this may differ from block_size. All other filesystems use this value --- tsk/fs/hfs.c | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/tsk/fs/hfs.c b/tsk/fs/hfs.c index e3221152b7..74b130dcc7 100644 --- a/tsk/fs/hfs.c +++ b/tsk/fs/hfs.c @@ -6532,14 +6532,8 @@ hfs_open(TSK_IMG_INFO * img_info, TSK_OFF_T offset, fs->block_count = tsk_getu32(fs->endian, hfs->fs->blk_cnt); fs->first_block = 0; fs->last_block = fs->last_block_act = fs->block_count - 1; - - /* this isn't really accurate; fs->block_size reports only the size - of the allocation block; the size of the device block has to be - found from the device (allocation block size should always be - larger than device block size and an even multiple of the device - block size) */ - fs->dev_bsize = fs->block_size = - tsk_getu32(fs->endian, hfs->fs->blk_sz); + fs->block_size = tsk_getu32(fs->endian, hfs->fs->blk_sz); + fs->dev_bsize = fs->img_info->sector_size; // determine the last block we have in this image if (fs->block_size <= 1) { From c3ab887ceed7fa90d75719eb21374b1cd1f6c40e Mon Sep 17 00:00:00 2001 From: Eran-YT Date: Mon, 9 Aug 2021 12:57:22 +0300 Subject: [PATCH 0016/1548] Refactor and optimize NTFS parent map --- tsk/fs/ntfs_dent.cpp | 59 ++++++++++++++++++++++---------------------- 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/tsk/fs/ntfs_dent.cpp b/tsk/fs/ntfs_dent.cpp index ee3b772b44..a96924485a 100644 --- a/tsk/fs/ntfs_dent.cpp +++ b/tsk/fs/ntfs_dent.cpp @@ -25,7 +25,7 @@ * NTFS file name processing internal functions. */ -#include +#include #include /** @@ -33,26 +33,27 @@ */ class NTFS_META_ADDR { private: - uint64_t addr; ///< MFT entry - uint32_t seq; ///< Sequence - uint32_t hash; ///< Hash of the path + const uint64_t addr; ///< MFT entry + const uint32_t seq; ///< Sequence + const uint32_t hash; ///< Hash of the path public: - NTFS_META_ADDR(uint64_t a_addr, uint32_t a_seq, uint32_t a_hash) { - addr = a_addr; - seq = a_seq; - hash = a_hash; + NTFS_META_ADDR(uint64_t a_addr, uint32_t a_seq, uint32_t a_hash) : + addr(a_addr), + seq(a_seq), + hash(a_hash) + { } - uint64_t getAddr() { + uint64_t getAddr() const { return addr; } - uint32_t getSeq() { + uint32_t getSeq() const { return seq; } - uint32_t getHash(){ + uint32_t getHash() const { return hash; } }; @@ -68,7 +69,7 @@ class NTFS_META_ADDR { class NTFS_PAR_MAP { private: // maps sequence number to list of inums for the folder at that seq. - std::map > seq2addrs; + std::unordered_map > seq2addrs; public: /** * Add a child to this parent. @@ -77,8 +78,7 @@ class NTFS_PAR_MAP { * @param seq Sequence of child in the folder */ void add (uint32_t parSeq, TSK_INUM_T inum, uint32_t seq, uint32_t hash) { - NTFS_META_ADDR addr(inum, seq, hash); - seq2addrs[parSeq].push_back(addr); + seq2addrs[parSeq].emplace_back(inum, seq, hash); } /** @@ -98,8 +98,8 @@ class NTFS_PAR_MAP { * @param seq Sequence number to retrieve children for. * @returns list of INUMS for children. */ - std::vector &get (uint32_t seq) { - return seq2addrs[seq]; + const std::vector &get (uint32_t seq) const { + return seq2addrs.at(seq); } }; @@ -111,12 +111,13 @@ class NTFS_PAR_MAP { * * Assumes that you already have the lock */ -static std::map * getParentMap(NTFS_INFO *ntfs) { +static std::unordered_map * getParentMap(NTFS_INFO *ntfs) { // allocate it if it hasn't already been if (ntfs->orphan_map == NULL) { - ntfs->orphan_map = new std::map; + auto inum_hash = [](const TSK_INUM_T& x) { return x; }; + ntfs->orphan_map = new std::unordered_map(0, inum_hash); } - return (std::map *)ntfs->orphan_map; + return (std::unordered_map *)ntfs->orphan_map; } @@ -134,7 +135,7 @@ static std::map * getParentMap(NTFS_INFO *ntfs) { static uint8_t ntfs_parent_map_add(NTFS_INFO * ntfs, TSK_FS_META_NAME_LIST *name_list, TSK_FS_META *child_meta) { - std::map *tmpParentMap = getParentMap(ntfs); + std::unordered_map *tmpParentMap = getParentMap(ntfs); NTFS_PAR_MAP &tmpParMap = (*tmpParentMap)[name_list->par_inode]; tmpParMap.add(name_list->par_seq, child_meta->addr, child_meta->seq, tsk_fs_dir_hash(name_list->name)); return 0; @@ -153,7 +154,7 @@ ntfs_parent_map_add(NTFS_INFO * ntfs, TSK_FS_META_NAME_LIST *name_list, TSK_FS_M static bool ntfs_parent_map_exists(NTFS_INFO *ntfs, TSK_INUM_T par, uint32_t seq) { - std::map *tmpParentMap = getParentMap(ntfs); + std::unordered_map *tmpParentMap = getParentMap(ntfs); if (tmpParentMap->count(par) > 0) { NTFS_PAR_MAP &tmpParMap = (*tmpParentMap)[par]; if (tmpParMap.exists(seq)) @@ -173,10 +174,10 @@ ntfs_parent_map_exists(NTFS_INFO *ntfs, TSK_INUM_T par, uint32_t seq) * @param seq Sequence of parent inode * @returns address of children files in the parent directory */ -static std::vector & +static const std::vector & ntfs_parent_map_get(NTFS_INFO * ntfs, TSK_INUM_T par, uint32_t seq) { - std::map *tmpParentMap = getParentMap(ntfs); + std::unordered_map *tmpParentMap = getParentMap(ntfs); NTFS_PAR_MAP &tmpParMap = (*tmpParentMap)[par]; return tmpParMap.get(seq); } @@ -200,7 +201,7 @@ ntfs_orphan_map_free(NTFS_INFO * a_ntfs) tsk_release_lock(&a_ntfs->orphan_map_lock); return; } - std::map *tmpParentMap = getParentMap(a_ntfs); + std::unordered_map *tmpParentMap = getParentMap(a_ntfs); delete tmpParentMap; a_ntfs->orphan_map = NULL; @@ -1276,7 +1277,7 @@ ntfs_dir_open_meta(TSK_FS_INFO * a_fs, TSK_FS_DIR ** a_fs_dir, if (ntfs_parent_map_exists(ntfs, a_addr, seqToSrch)) { TSK_FS_NAME *fs_name; - std::vector &childFiles = ntfs_parent_map_get(ntfs, a_addr, seqToSrch); + const std::vector &childFiles = ntfs_parent_map_get(ntfs, a_addr, seqToSrch); if ((fs_name = tsk_fs_name_alloc(256, 0)) == NULL) return TSK_ERR; @@ -1285,7 +1286,7 @@ ntfs_dir_open_meta(TSK_FS_INFO * a_fs, TSK_FS_DIR ** a_fs_dir, fs_name->par_addr = a_addr; fs_name->par_seq = fs_dir->fs_file->meta->seq; - for (size_t a = 0; a < childFiles.size(); a++) { + for(const NTFS_META_ADDR& childFile: childFiles) { TSK_FS_FILE *fs_file_orp = NULL; /* Check if fs_dir already has an allocated entry for this @@ -1294,14 +1295,14 @@ ntfs_dir_open_meta(TSK_FS_INFO * a_fs, TSK_FS_DIR ** a_fs_dir, * We have only unalloc for this same entry (from idx entries), * then try to add it. If we got an allocated entry from * the idx entries, then assume we have everything. */ - if (tsk_fs_dir_contains(fs_dir, childFiles[a].getAddr(), childFiles[a].getHash()) == TSK_FS_NAME_FLAG_ALLOC) { + if (tsk_fs_dir_contains(fs_dir, childFile.getAddr(), childFile.getHash()) == TSK_FS_NAME_FLAG_ALLOC) { continue; } /* Fill in the basics of the fs_name entry * so we can print in the fls formats */ - fs_name->meta_addr = childFiles[a].getAddr(); - fs_name->meta_seq = childFiles[a].getSeq(); + fs_name->meta_addr = childFile.getAddr(); + fs_name->meta_seq = childFile.getSeq(); // lookup the file to get more info (we did not cache that) fs_file_orp = From 0fa56eb70cb311dd5fe8f280f25dce5323edd179 Mon Sep 17 00:00:00 2001 From: Sheldon Douglas Date: Fri, 29 Jul 2022 16:00:44 -0400 Subject: [PATCH 0017/1548] Upgrade fiwalk to redesignate byte_runs facet for data Currently, Fiwalk generates byte_runs to describe where file contents reside on the disk. ... There are reasons to make byte_runs to represent other parts of a file. To support when other byte_runs are made, we are going to support the current byte_runs to include a new attribute. This is an additive, backwards compatible change. ... References: * In the Python DFXML objects.py bindings, see the properties FileObject.data_brs and ByteRuns.facet. * This supports implementation of an API described in Appendix A of: https://doi.org/10.1016/j.diin.2019.06.004 Licensing: Portions of this patch contributed by NIST are governed by the NIST Software Licensing Statement: NIST-developed software is provided by NIST as a public service. You may use, copy, and distribute copies of the software in any medium, provided that you keep intact this entire notice. You may improve, modify, and create derivative works of the software or any portion of the software, and you may copy and distribute such modifications or works. Modified works should carry a notice stating that you changed the software and should note the date and nature of any such change. Please explicitly acknowledge the National Institute of Standards and Technology as the source of the software. NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, RELIABILITY, OR USEFULNESS OF THE SOFTWARE. You are solely responsible for determining the appropriateness of using and distributing the software and you assume all risks associated with its use, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and the unavailability or interruption of operation. This software is not intended to be used in any situation where a failure could cause risk of injury or damage to property. The software developed by NIST employees is not subject to copyright protection within the United States. Co-authored-by: Alex Nelson Cc: Sheldon Douglas Signed-off-by: Sheldon Douglas --- tools/fiwalk/src/content.cpp | 2 +- tools/fiwalk/src/fiwalk.cpp | 10 ++++++++++ tools/fiwalk/src/fiwalk.h | 1 + 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/tools/fiwalk/src/content.cpp b/tools/fiwalk/src/content.cpp index be7d89499b..b01c13ea1a 100644 --- a/tools/fiwalk/src/content.cpp +++ b/tools/fiwalk/src/content.cpp @@ -286,7 +286,7 @@ void content::write_record() runs += "/>\n"; } } - file_info_xml("byte_runs",runs); + file_info_xml2("byte_runs","facet='data'", runs); if(!invalid){ if(opt_md5 && h_md5.hashed_bytes>0) file_info(h_md5.final()); if(opt_sha1 && h_sha1.hashed_bytes>0) file_info(h_sha1.final()); diff --git a/tools/fiwalk/src/fiwalk.cpp b/tools/fiwalk/src/fiwalk.cpp index 8f3062cc00..ec38bf4922 100644 --- a/tools/fiwalk/src/fiwalk.cpp +++ b/tools/fiwalk/src/fiwalk.cpp @@ -271,6 +271,16 @@ void file_info_xml(const string &name,const string &value) } } +void file_info_xml2(const string &name,const string &attrib,const string &value) +{ + if(x){ + x->push(name,attrib); + x->puts(value); + x->pop(); + } +} + + /* Process a string value */ void file_info(const string &name,const string &value) { diff --git a/tools/fiwalk/src/fiwalk.h b/tools/fiwalk/src/fiwalk.h index 488ca84897..1064939dd2 100644 --- a/tools/fiwalk/src/fiwalk.h +++ b/tools/fiwalk/src/fiwalk.h @@ -135,6 +135,7 @@ void file_info(const md5_t &t); void file_info(const sha1_t &t); void file_info(const sha256_t &t); void file_info_xml(const string &name,const string &value); +void file_info_xml2(const string &name,const string &attrib,const string &value); void file_info(const string name, int64_t value); void file_infot(const string name,time_t t0); void file_infot(const string name,time_t t0, TSK_FS_TYPE_ENUM ftype); From be1deb4cbdadfd40ed5c26d52b6da26751d9440c Mon Sep 17 00:00:00 2001 From: Sheldon Douglas Date: Fri, 29 Jul 2022 16:34:10 -0400 Subject: [PATCH 0018/1548] Add start_of_inode field to TSK_FS_META This start_of_inode field supports a new geometric measurement in fiwalk. This is an additive, backwards compatible change. References: * This supports implementation of an API described in Appendix A of: https://doi.org/10.1016/j.diin.2019.06.004 Licensing: Portions of this patch contributed by NIST are governed by the NIST Software Licensing Statement: NIST-developed software is provided by NIST as a public service. You may use, copy, and distribute copies of the software in any medium, provided that you keep intact this entire notice. You may improve, modify, and create derivative works of the software or any portion of the software, and you may copy and distribute such modifications or works. Modified works should carry a notice stating that you changed the software and should note the date and nature of any such change. Please explicitly acknowledge the National Institute of Standards and Technology as the source of the software. NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, RELIABILITY, OR USEFULNESS OF THE SOFTWARE. You are solely responsible for determining the appropriateness of using and distributing the software and you assume all risks associated with its use, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and the unavailability or interruption of operation. This software is not intended to be used in any situation where a failure could cause risk of injury or damage to property. The software developed by NIST employees is not subject to copyright protection within the United States. Co-authored-by: Alex Nelson Cc: Sheldon Douglas Signed-off-by: Sheldon Douglas --- tsk/fs/tsk_fs.h | 1 + 1 file changed, 1 insertion(+) diff --git a/tsk/fs/tsk_fs.h b/tsk/fs/tsk_fs.h index dca96c0b5b..4bd2d054ad 100644 --- a/tsk/fs/tsk_fs.h +++ b/tsk/fs/tsk_fs.h @@ -463,6 +463,7 @@ extern "C" { TSK_FS_META_MODE_ENUM mode; ///< Unix-style permissions int nlink; ///< link count (number of file names pointing to this) TSK_OFF_T size; ///< file size (in bytes) + TSK_OFF_T start_of_inode; ///< address within file system where inode structure begins TSK_UID_T uid; ///< owner id TSK_GID_T gid; ///< group id From be23bb5b810d549d2aa3c7e3089c690106c2cec0 Mon Sep 17 00:00:00 2001 From: Sheldon Douglas Date: Fri, 29 Jul 2022 17:06:00 -0400 Subject: [PATCH 0019/1548] Upgrade fiwalk to generate a new byte_runs facet for inodes This patch establishes a consumer of the start_of_inode field. A follow-on patch will populate the field for NTFS. This is an additive, backwards compatible change. References: * This supports implementation of an API described in Appendix A of: https://doi.org/10.1016/j.diin.2019.06.004 Licensing: Portions of this patch contributed by NIST are governed by the NIST Software Licensing Statement: NIST-developed software is provided by NIST as a public service. You may use, copy, and distribute copies of the software in any medium, provided that you keep intact this entire notice. You may improve, modify, and create derivative works of the software or any portion of the software, and you may copy and distribute such modifications or works. Modified works should carry a notice stating that you changed the software and should note the date and nature of any such change. Please explicitly acknowledge the National Institute of Standards and Technology as the source of the software. NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, RELIABILITY, OR USEFULNESS OF THE SOFTWARE. You are solely responsible for determining the appropriateness of using and distributing the software and you assume all risks associated with its use, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and the unavailability or interruption of operation. This software is not intended to be used in any situation where a failure could cause risk of injury or damage to property. The software developed by NIST employees is not subject to copyright protection within the United States. Co-authored-by: Alex Nelson Cc: Sheldon Douglas Signed-off-by: Sheldon Douglas --- tools/fiwalk/src/fiwalk_tsk.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/tools/fiwalk/src/fiwalk_tsk.cpp b/tools/fiwalk/src/fiwalk_tsk.cpp index 4daa89178c..6253dba4ba 100644 --- a/tools/fiwalk/src/fiwalk_tsk.cpp +++ b/tools/fiwalk/src/fiwalk_tsk.cpp @@ -208,7 +208,17 @@ process_tsk_file(TSK_FS_FILE * fs_file, const char *path) file_info("nlink",fs_file->meta->nlink); file_info("uid",fs_file->meta->uid); file_info("gid",fs_file->meta->gid); - + + char i_buf[1024]; + memset(i_buf, 0, 1024); + string i_runs = ""; + uint64_t current_partition_start = fs_file->fs_info->offset; + if (fs_file->meta->start_of_inode != 0){ + sprintf(i_buf," \n",fs_file->meta->start_of_inode, current_partition_start + fs_file->meta->start_of_inode); + } + i_runs += i_buf; + file_info_xml2("byte_runs","facet='inode'", i_runs); + /* Special processing for FAT */ if(TSK_FS_TYPE_ISFAT(fs_file->fs_info->ftype)) { From 033097aa10a31c6d75e18d74cf6a1681fa9c5bea Mon Sep 17 00:00:00 2001 From: Sheldon Douglas Date: Fri, 29 Jul 2022 17:56:36 -0400 Subject: [PATCH 0020/1548] Enable ntfs_dinode_lookup to report the address of its data source This patch ensures that the function continues to compile. Intentionally, nothing yet exercises the new parameter to ntfs_dinode_lookup. This is an additive, backwards compatible change. References: * This supports implementation of an API described in Appendix A of: https://doi.org/10.1016/j.diin.2019.06.004 Licensing: Portions of this patch contributed by NIST are governed by the NIST Software Licensing Statement: NIST-developed software is provided by NIST as a public service. You may use, copy, and distribute copies of the software in any medium, provided that you keep intact this entire notice. You may improve, modify, and create derivative works of the software or any portion of the software, and you may copy and distribute such modifications or works. Modified works should carry a notice stating that you changed the software and should note the date and nature of any such change. Please explicitly acknowledge the National Institute of Standards and Technology as the source of the software. NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, RELIABILITY, OR USEFULNESS OF THE SOFTWARE. You are solely responsible for determining the appropriateness of using and distributing the software and you assume all risks associated with its use, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and the unavailability or interruption of operation. This software is not intended to be used in any situation where a failure could cause risk of injury or damage to property. The software developed by NIST employees is not subject to copyright protection within the United States. Co-authored-by: Alex Nelson Cc: Sheldon Douglas Signed-off-by: Sheldon Douglas --- tsk/fs/ntfs.c | 18 ++++++++++++------ tsk/fs/ntfs_dent.cpp | 2 +- tsk/fs/tsk_ntfs.h | 2 +- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/tsk/fs/ntfs.c b/tsk/fs/ntfs.c index eb9f0f48b0..e29a04f4a5 100644 --- a/tsk/fs/ntfs.c +++ b/tsk/fs/ntfs.c @@ -125,11 +125,12 @@ nt2nano(uint64_t ntdate) * @param a_ntfs File system to read from * @param a_buf Buffer to save raw data to. Must be of size NTFS_INFO.mft_rsize_b * @param a_mftnum Address of MFT entry to read + * @param mft_start_addr Within-file-system byte address of start of MFT entry * * @returns Error value */ TSK_RETVAL_ENUM -ntfs_dinode_lookup(NTFS_INFO * a_ntfs, char *a_buf, TSK_INUM_T a_mftnum) +ntfs_dinode_lookup(NTFS_INFO * a_ntfs, char *a_buf, TSK_INUM_T a_mftnum, TSK_OFF_T * mft_start_addr) { TSK_OFF_T mftaddr_b, mftaddr2_b, offset; size_t mftaddr_len = 0; @@ -337,6 +338,11 @@ ntfs_dinode_lookup(NTFS_INFO * a_ntfs, char *a_buf, TSK_INUM_T a_mftnum) return TSK_ERR; } } + + /* A nonzero address means that mftaddr_b has been requested for export */ + if (mft_start_addr) { + *mft_start_addr = mftaddr_b; + } /* Sanity Check */ #if 0 @@ -2701,7 +2707,7 @@ ntfs_proc_attrlist(NTFS_INFO * ntfs, if ((retval = ntfs_dinode_lookup(ntfs, (char *) mft, - mftToDo[a])) != TSK_OK) { + mftToDo[a], 0)) != TSK_OK) { // if the entry is corrupt, then continue if (retval == TSK_COR) { if (tsk_verbose) @@ -3023,7 +3029,7 @@ ntfs_inode_lookup(TSK_FS_INFO * fs, TSK_FS_FILE * a_fs_file, } /* Lookup inode and store it in the ntfs structure */ - if (ntfs_dinode_lookup(ntfs, mft, mftnum) != TSK_OK) { + if (ntfs_dinode_lookup(ntfs, mft, mftnum, 0) != TSK_OK) { free(mft); return 1; } @@ -3219,7 +3225,7 @@ ntfs_load_bmap(NTFS_INFO * ntfs) } /* Get data on the bitmap */ - if (ntfs_dinode_lookup(ntfs, (char *) mft, NTFS_MFT_BMAP) != TSK_OK) { + if (ntfs_dinode_lookup(ntfs, (char *) mft, NTFS_MFT_BMAP, 0) != TSK_OK) { goto on_error; } @@ -4204,7 +4210,7 @@ ntfs_inode_walk(TSK_FS_INFO * fs, TSK_INUM_T start_inum, /* read MFT entry in to NTFS_INFO */ if ((retval2 = ntfs_dinode_lookup(ntfs, (char *) mft, - mftnum)) != TSK_OK) { + mftnum, 0)) != TSK_OK) { // if the entry is corrupt, then skip to the next one if (retval2 == TSK_COR) { if (tsk_verbose) @@ -4557,7 +4563,7 @@ ntfs_istat(TSK_FS_INFO * fs, TSK_FS_ISTAT_FLAG_ENUM istat_flags, FILE * hFile, return 1; } - if (ntfs_dinode_lookup(ntfs, (char *) mft, inum)) { + if (ntfs_dinode_lookup(ntfs, (char *) mft, inum, 0)) { free(mft); return 1; } diff --git a/tsk/fs/ntfs_dent.cpp b/tsk/fs/ntfs_dent.cpp index ee3b772b44..f939bbae41 100644 --- a/tsk/fs/ntfs_dent.cpp +++ b/tsk/fs/ntfs_dent.cpp @@ -1567,7 +1567,7 @@ ntfs_find_file(TSK_FS_INFO * fs, TSK_INUM_T inode_toid, uint32_t type_toid, if ((mft = (ntfs_mft *) tsk_malloc(ntfs->mft_rsize_b)) == NULL) { return 1; } - r_enum = ntfs_dinode_lookup(ntfs, (char *) mft, inode_toid); + r_enum = ntfs_dinode_lookup(ntfs, (char *) mft, inode_toid, 0); if (r_enum == TSK_ERR) { free(mft); return 1; diff --git a/tsk/fs/tsk_ntfs.h b/tsk/fs/tsk_ntfs.h index c16696a75c..8624b25ebe 100644 --- a/tsk/fs/tsk_ntfs.h +++ b/tsk/fs/tsk_ntfs.h @@ -748,7 +748,7 @@ extern "C" { extern uint8_t ntfs_attrname_lookup(TSK_FS_INFO *, uint16_t, char *, int); extern TSK_RETVAL_ENUM ntfs_dinode_lookup(NTFS_INFO *, char *, - TSK_INUM_T); + TSK_INUM_T, TSK_OFF_T *); extern TSK_RETVAL_ENUM ntfs_dir_open_meta(TSK_FS_INFO * a_fs, TSK_FS_DIR ** a_fs_dir, TSK_INUM_T a_addr, int recursion_depth); From 846caceea0bcc753bbd5c0cf5880864306172d6f Mon Sep 17 00:00:00 2001 From: Sheldon Douglas Date: Fri, 29 Jul 2022 18:51:49 -0400 Subject: [PATCH 0021/1548] Modify ntfs_dinode_lookup calls to export start_of_inode Two of the six ntfs_dinode_lookup calls were selected from observing access to a TSK_FS_META struct: ntfs_inode_lookup, ntfs_inode_walk. This patch starts the production of the chain that enables fiwalk to generate byte_runs for a file's inode. This is an additive, backwards compatible change. Modifications were tested against three disk images: * DFTT Test 3 * M57 Patents, "Jo", November 12, start * M57 Patents, "Jo", November 20, OldComputer The test method was seeing if the inode byte_run would give an offset that had the ASCII bytes "FILE". The test succeeded DFFT Test 3, which is an image of a file system with no containing partition system. That is, offset 0 in the image is the beginning of the file system. The test does not yet succeed for the "Jo" images, which have partition systems. A follow-on patch will correct the issues. References: * This supports implementation of an API described in Appendix A of: https://doi.org/10.1016/j.diin.2019.06.004 * http://dftt.sourceforge.net/test3/index.html * https://digitalcorpora.org/corpora/scenarios/m57-patents-scenario/ Licensing: Portions of this patch contributed by NIST are governed by the NIST Software Licensing Statement: NIST-developed software is provided by NIST as a public service. You may use, copy, and distribute copies of the software in any medium, provided that you keep intact this entire notice. You may improve, modify, and create derivative works of the software or any portion of the software, and you may copy and distribute such modifications or works. Modified works should carry a notice stating that you changed the software and should note the date and nature of any such change. Please explicitly acknowledge the National Institute of Standards and Technology as the source of the software. NIST-developed software is expressly provided "AS IS." NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED, IN FACT, OR ARISING BY OPERATION OF LAW, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND DATA ACCURACY. NIST NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST DOES NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE OR THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, RELIABILITY, OR USEFULNESS OF THE SOFTWARE. You are solely responsible for determining the appropriateness of using and distributing the software and you assume all risks associated with its use, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and the unavailability or interruption of operation. This software is not intended to be used in any situation where a failure could cause risk of injury or damage to property. The software developed by NIST employees is not subject to copyright protection within the United States. Co-authored-by: Alex Nelson Cc: Sheldon Douglas Signed-off-by: Sheldon Douglas --- tsk/fs/ntfs.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tsk/fs/ntfs.c b/tsk/fs/ntfs.c index e29a04f4a5..fdb0ede877 100644 --- a/tsk/fs/ntfs.c +++ b/tsk/fs/ntfs.c @@ -3029,7 +3029,7 @@ ntfs_inode_lookup(TSK_FS_INFO * fs, TSK_FS_FILE * a_fs_file, } /* Lookup inode and store it in the ntfs structure */ - if (ntfs_dinode_lookup(ntfs, mft, mftnum, 0) != TSK_OK) { + if (ntfs_dinode_lookup(ntfs, mft, mftnum, & (a_fs_file->meta->start_of_inode)) != TSK_OK) { free(mft); return 1; } @@ -4210,7 +4210,7 @@ ntfs_inode_walk(TSK_FS_INFO * fs, TSK_INUM_T start_inum, /* read MFT entry in to NTFS_INFO */ if ((retval2 = ntfs_dinode_lookup(ntfs, (char *) mft, - mftnum, 0)) != TSK_OK) { + mftnum, & (fs_file->meta->start_of_inode))) != TSK_OK) { // if the entry is corrupt, then skip to the next one if (retval2 == TSK_COR) { if (tsk_verbose) From b7ef3044f263cb71a55cebb57244ada3489cb098 Mon Sep 17 00:00:00 2001 From: Ruben Nogueira <40404708+rubnogueira@users.noreply.github.com> Date: Fri, 9 Sep 2022 12:53:42 +0100 Subject: [PATCH 0022/1548] feat: update libvhdi and libvmdk travis dependencies --- travis_install_libs.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/travis_install_libs.sh b/travis_install_libs.sh index 0c659c11bd..00bd60f3a9 100755 --- a/travis_install_libs.sh +++ b/travis_install_libs.sh @@ -13,6 +13,6 @@ installLib() { cd .. } -installLib libvhdi 20201204 -installLib libvmdk 20200926 +installLib libvhdi 20210425 +installLib libvmdk 20210807 From cb8d3754c565ddece980b42a7a57ebc96eba617d Mon Sep 17 00:00:00 2001 From: Joachim Metz Date: Sat, 11 Feb 2023 08:05:15 +0100 Subject: [PATCH 0023/1548] Fixes for use after free in logical_fs.cpp #2758 --- tsk/fs/logical_fs.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tsk/fs/logical_fs.cpp b/tsk/fs/logical_fs.cpp index 897c465645..c6e313b005 100644 --- a/tsk/fs/logical_fs.cpp +++ b/tsk/fs/logical_fs.cpp @@ -764,10 +764,11 @@ load_path_from_inum(LOGICALFS_INFO *logical_fs_info, TSK_INUM_T a_addr) { } if ((result != TSK_OK) || (!search_helper->target_found)) { - free_search_helper(search_helper); tsk_error_reset(); tsk_error_set_errno(TSK_ERR_FS_INODE_NUM); tsk_error_set_errstr("load_path_from_inum - failed to find path corresponding to inum %" PRIuINUM, search_helper->target_inum); + // Free search_helper after using it to format the error string. + free_search_helper(search_helper); return NULL; } From 18a0d8a347a465e855589740d95ed19c1fc9f0d1 Mon Sep 17 00:00:00 2001 From: Joachim Metz Date: Sat, 11 Feb 2023 10:13:16 +0100 Subject: [PATCH 0024/1548] Added sanity checks to tsk_fs_load_file_action #2807 --- tsk/fs/fs_load.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/tsk/fs/fs_load.c b/tsk/fs/fs_load.c index 491b069f76..0afd94074c 100644 --- a/tsk/fs/fs_load.c +++ b/tsk/fs/fs_load.c @@ -14,6 +14,8 @@ */ #include "tsk_fs_i.h" +#include + /* File Walk Action to load the journal * TSK_FS_LOAD_FILE is defined in fs_tools.h @@ -25,14 +27,19 @@ tsk_fs_load_file_action(TSK_FS_FILE * fs_file, TSK_OFF_T a_off, void *ptr) { TSK_FS_LOAD_FILE *buf1 = (TSK_FS_LOAD_FILE *) ptr; - size_t cp_size; - if (size > buf1->left) - cp_size = buf1->left; - else - cp_size = size; + if (buf1->cur == NULL) { + return TSK_WALK_ERROR; + } + size_t cp_size = size; + if (cp_size > buf1->left) cp_size = buf1->left; + size_t cp_offset = (size_t) (buf1->cur - buf1->base); + if ((cp_size > buf1->total) || (cp_offset > (buf1->total - cp_size))) { + return TSK_WALK_ERROR; + } memcpy(buf1->cur, buf, cp_size); + buf1->left -= cp_size; buf1->cur = (char *) ((uintptr_t) buf1->cur + cp_size); From d63db5956a2843a32958430da9584d661f21d204 Mon Sep 17 00:00:00 2001 From: Luis Filipe Nassif Date: Wed, 21 Jun 2023 19:48:33 -0300 Subject: [PATCH 0025/1548] fix #2800: return unsigned byte by InputStream API (-1 just if EOF) --- .../src/org/sleuthkit/datamodel/ReadContentInputStream.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bindings/java/src/org/sleuthkit/datamodel/ReadContentInputStream.java b/bindings/java/src/org/sleuthkit/datamodel/ReadContentInputStream.java index 4c844b62e1..10601f045f 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/ReadContentInputStream.java +++ b/bindings/java/src/org/sleuthkit/datamodel/ReadContentInputStream.java @@ -39,7 +39,7 @@ public ReadContentInputStream(Content content) { @Override public int read() throws ReadContentInputStreamException { byte[] buff = new byte[1]; - return (read(buff) != -1) ? buff[0] : -1; + return (read(buff) != -1) ? buff[0] & 0xFF : -1; } @Override From fd19051920849343631df1cbf8d4b86f1bf98b2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B6kt=C3=BCrk=20Y=C3=BCksek?= Date: Mon, 26 Jun 2023 22:05:47 -0700 Subject: [PATCH 0026/1548] configure.ac: use '=' for comparison instead of '==' MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The operator '==' isn't POSIX compliant[0]. Use the standard '=', as it's done everywhere else in configure.ac. [0] https://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html Bug: https://bugs.gentoo.org/870250 Signed-off-by: Göktürk Yüksek --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index c4226f5be4..bec6ddbf62 100644 --- a/configure.ac +++ b/configure.ac @@ -252,7 +252,7 @@ AS_IF([test "x$enable_java" != "xno"], [ dnl if we found everything we need, set ax_java_support for the dnl status message and set X_JNI for use in Makefile AS_IF([test "x$JNI_CPPFLAGS" != x && test "x$ANT_FOUND" != x && test "x$JAVA" != x], [ax_java_support=yes], [ax_java_support=no]) -AM_CONDITIONAL([X_JNI],[test "x$ax_java_support" == "xyes"]) +AM_CONDITIONAL([X_JNI],[test "x$ax_java_support" = "xyes"]) AC_CONFIG_COMMANDS([tsk/tsk_incs.h], [echo "#ifndef _TSK_INCS_H" > tsk/tsk_incs.h From 2671daa86b3924462b654ad34a4ee0923231c6d9 Mon Sep 17 00:00:00 2001 From: Joachim Metz Date: Sat, 25 Mar 2023 12:02:14 +0100 Subject: [PATCH 0027/1548] Changes to findFilesInPool to support LVM --- tsk/auto/auto.cpp | 47 +++++++++++++++++++++++++++++++++++- tsk/pool/lvm_pool_compat.cpp | 47 ++++++++++++++++++++++++++++++++++++ tsk/pool/lvm_pool_compat.hpp | 8 +++++- 3 files changed, 100 insertions(+), 2 deletions(-) diff --git a/tsk/auto/auto.cpp b/tsk/auto/auto.cpp index 89243df85f..2f0e4d56ed 100755 --- a/tsk/auto/auto.cpp +++ b/tsk/auto/auto.cpp @@ -467,7 +467,6 @@ TskAuto::findFilesInPool(TSK_OFF_T start, TSK_POOL_TYPE_ENUM ptype) else if (retval1 == TSK_FILTER_STOP) return TSK_STOP; - /* Only APFS pools are currently supported */ if (pool->ctype == TSK_POOL_TYPE_APFS) { TSK_POOL_VOLUME_INFO *vol_info = pool->vol_list; @@ -487,6 +486,7 @@ TskAuto::findFilesInPool(TSK_OFF_T start, TSK_POOL_TYPE_ENUM ptype) TSK_RETVAL_ENUM retval = findFilesInFsInt(fs_info, fs_info->root_inum); tsk_fs_close(fs_info); + // TODO: what if retval != TSK_STOP, shouldn't pool_img be closed? if (retval == TSK_STOP) { tsk_img_close(pool_img); tsk_pool_close(pool); @@ -523,6 +523,51 @@ TskAuto::findFilesInPool(TSK_OFF_T start, TSK_POOL_TYPE_ENUM ptype) vol_info = vol_info->next; } } +#ifdef HAVE_LIBVSLVM + if (pool->ctype == TSK_POOL_TYPE_LVM) { + TSK_POOL_VOLUME_INFO *vol_info = pool->vol_list; + while (vol_info != NULL) { + + // The call to filterPoolVol is needed to ensure the object state is + // correctly set for filling the database. + TSK_FILTER_ENUM filterRetval = filterPoolVol(vol_info); + if ((filterRetval == TSK_FILTER_STOP) || (m_stopAllProcessing)) { + tsk_pool_close(pool); + return TSK_STOP; + } + + TSK_IMG_INFO *pool_img = pool->get_img_info(pool, vol_info->block); + if (pool_img == NULL) { + tsk_pool_close(pool); + tsk_error_set_errstr2( + "findFilesInPool: Error opening LVM logical volume: %" PRIdOFF "", + vol_info->block); + registerError(); + return TSK_ERR; + } + TSK_FS_INFO *fs_info = tsk_fs_open_img(pool_img, 0, TSK_FS_TYPE_DETECT); + if (fs_info == NULL) { + tsk_img_close(pool_img); + tsk_pool_close(pool); + tsk_error_set_errstr2( + "findFilesInPool: Unable to open file system in LVM logical volume: %" PRIdOFF "", + vol_info->block); + registerError(); + return TSK_ERR; + } + TSK_RETVAL_ENUM retval = findFilesInFsInt(fs_info, fs_info->root_inum); + + tsk_fs_close(fs_info); + tsk_img_close(pool_img); + + if (retval == TSK_STOP) { + tsk_pool_close(pool); + return TSK_STOP; + } + vol_info = vol_info->next; + } + } +#endif /* HAVE_LIBVSLVM */ else { tsk_pool_close(pool); tsk_error_reset(); diff --git a/tsk/pool/lvm_pool_compat.cpp b/tsk/pool/lvm_pool_compat.cpp index 85cedb7d72..bbe71bdc82 100644 --- a/tsk/pool/lvm_pool_compat.cpp +++ b/tsk/pool/lvm_pool_compat.cpp @@ -28,6 +28,53 @@ static uint8_t getError(libvslvm_error_t *vslvm_error, char error_string[512]) return retval <= 0; } +LVMPoolCompat::~LVMPoolCompat() { + // Clean up the dynamic allocations + if (_info.vol_list != nullptr) { + auto vol = _info.vol_list; + while (vol != nullptr) { + if (vol->desc != nullptr) delete[] vol->desc; + vol = vol->next; + } + delete[] _info.vol_list; + _info.vol_list = nullptr; + } +} + +// Note that vol_list is used by findFilesInPool +void LVMPoolCompat::init_volumes() { + int number_of_logical_volumes = 0; + if (libvslvm_volume_group_get_number_of_logical_volumes(_lvm_volume_group, &number_of_logical_volumes, NULL) != 1 ) { + return; + } + _info.num_vols = number_of_logical_volumes; + _info.vol_list = new TSK_POOL_VOLUME_INFO[number_of_logical_volumes](); + + libvslvm_logical_volume_t *lvm_logical_volume = NULL; + TSK_POOL_VOLUME_INFO *last = nullptr; + + for (int volume_index = 0; volume_index < number_of_logical_volumes; volume_index++ ) { + if (libvslvm_volume_group_get_logical_volume(_lvm_volume_group, volume_index, &lvm_logical_volume, NULL) != 1 ) { + return; + } + auto &vinfo = _info.vol_list[volume_index]; + + vinfo.tag = TSK_POOL_VOL_INFO_TAG; + vinfo.index = volume_index; + vinfo.block = volume_index + 1; + vinfo.prev = last; + if (vinfo.prev != nullptr) { + vinfo.prev->next = &vinfo; + } + vinfo.desc = new char[64]; + libvslvm_logical_volume_get_name(lvm_logical_volume, vinfo.desc, 64, NULL); + + libvslvm_logical_volume_free(&lvm_logical_volume, NULL); + + last = &vinfo; + } +} + uint8_t LVMPoolCompat::poolstat(FILE *hFile) const noexcept try { tsk_fprintf(hFile, "POOL CONTAINER INFORMATION\n"); diff --git a/tsk/pool/lvm_pool_compat.hpp b/tsk/pool/lvm_pool_compat.hpp index e9aad68974..3affec84a0 100644 --- a/tsk/pool/lvm_pool_compat.hpp +++ b/tsk/pool/lvm_pool_compat.hpp @@ -17,10 +17,16 @@ #include "tsk_lvm.hpp" class LVMPoolCompat : public TSKPoolCompat { + void init_volumes(); + public: template LVMPoolCompat(Args&&... args) - : TSKPoolCompat(TSK_POOL_TYPE_LVM, std::forward(args)...) { } + : TSKPoolCompat(TSK_POOL_TYPE_LVM, std::forward(args)...) { + init_volumes(); + } + + ~LVMPoolCompat(); uint8_t poolstat(FILE* hFile) const noexcept; TSK_IMG_INFO * getImageInfo(const TSK_POOL_INFO *pool_info, TSK_DADDR_T pvol_block) noexcept; From 2fa3241ec99af7b7f41daeab545468e8b1cf08bb Mon Sep 17 00:00:00 2001 From: Aristeu Jr Date: Sun, 2 Apr 2023 20:37:06 -0300 Subject: [PATCH 0028/1548] changes to support unallocated space --- bindings/java/jni/auto_db_java.cpp | 300 +++++++++++++++-- bindings/java/jni/auto_db_java.h | 7 +- .../src/org/sleuthkit/datamodel/TskData.java | 2 + tsk/auto/auto.cpp | 25 +- tsk/auto/auto_db.cpp | 305 ++++++++++++++++-- tsk/auto/db_sqlite.cpp | 16 +- tsk/auto/tsk_case_db.h | 11 +- tsk/auto/tsk_db_sqlite.h | 2 + tsk/vs/mm_open.c | 1 + tsk/vs/tsk_vs.h | 1 + 10 files changed, 610 insertions(+), 60 deletions(-) diff --git a/bindings/java/jni/auto_db_java.cpp b/bindings/java/jni/auto_db_java.cpp index e0e9afb5c4..d80964589e 100644 --- a/bindings/java/jni/auto_db_java.cpp +++ b/bindings/java/jni/auto_db_java.cpp @@ -289,12 +289,40 @@ TskAutoDbJava::addPoolInfoAndVS(const TSK_POOL_INFO *pool_info, int64_t parObjId } saveObjectInfo(poolObjId, parObjId, TSK_DB_OBJECT_TYPE_POOL); - // Add the pool volume - jlong objIdj = m_jniEnv->CallLongMethod(m_javaDbObj, m_addVolumeSystemMethodID, - poolObjIdj, TSK_VS_TYPE_APFS, pool_info->img_offset, (uint64_t)pool_info->block_size); - objId = (int64_t)objIdj; - saveObjectInfo(objId, poolObjId, TSK_DB_OBJECT_TYPE_VS); + + + if (pool_info->ctype == TSK_POOL_TYPE_APFS){ + // Add the APFS pool volume + jlong objIdj = m_jniEnv->CallLongMethod(m_javaDbObj, m_addVolumeSystemMethodID, + poolObjIdj, TSK_VS_TYPE_APFS, pool_info->img_offset, (uint64_t)pool_info->block_size); + objId = (int64_t)objIdj; + + // populating cache m_savedVsInfo and ObjectInfo + TSK_DB_VS_INFO vs_db; + vs_db.objId = objId; + vs_db.offset = pool_info->img_offset; + vs_db.vstype = TSK_VS_TYPE_APFS; + vs_db.block_size = pool_info->block_size; + m_savedVsInfo.push_back(vs_db); + saveObjectInfo(objId, poolObjId, TSK_DB_OBJECT_TYPE_VS); + } + if (pool_info->ctype == TSK_POOL_TYPE_LVM){ + // Add the APFS pool volume + jlong objIdj = m_jniEnv->CallLongMethod(m_javaDbObj, m_addVolumeSystemMethodID, + poolObjIdj, TSK_VS_TYPE_LVM, pool_info->img_offset, (uint64_t)pool_info->block_size); + objId = (int64_t)objIdj; + + // populating cache m_savedVsInfo and objectInfo + TSK_DB_VS_INFO vs_db; + vs_db.objId = objId; + vs_db.offset = pool_info->img_offset; + vs_db.vstype = TSK_VS_TYPE_LVM; + vs_db.block_size = pool_info->block_size; + m_savedVsInfo.push_back(vs_db); + saveObjectInfo(objId, poolObjId, TSK_DB_OBJECT_TYPE_VS); + } + return TSK_OK; } @@ -321,7 +349,21 @@ TskAutoDbJava::addPoolVolumeInfo(const TSK_POOL_VOLUME_INFO* pool_vol, return TSK_ERR; } + + // here we add pool vol into available vs_part fields + TSK_DB_VS_PART_INFO vol_info_db; + vol_info_db.objId = objId; ///< set to 0 if unknown (before it becomes a db object) + // pool_vol_info_db.tag = ; ///< Set to TSK_POOL_VOLUME_INFO_TAG when struct is alloc + // vol_info_db. = pool_vol->index; ///< Index of Volume + snprintf(vol_info_db.desc, TSK_MAX_DB_VS_PART_INFO_DESC_LEN - 1, "%s", pool_vol->desc); ///< Description + //pool_vol_info_db.password_hint = ; ///< Password hint for encrypted volumes + vol_info_db.start = pool_vol->block; ///< Starting Block number + //vol_info_db.len = pool_vol->; ///< Number of blocks in the volume + //vol_info_db.flags = pool_vol->flags; //flags are not compatible + m_savedVsPartInfo.push_back(vol_info_db); + saveObjectInfo(objId, parObjId, TSK_DB_OBJECT_TYPE_VOL); + return TSK_OK; } @@ -1197,7 +1239,7 @@ TskAutoDbJava::addUnallocatedPoolBlocksToDb(size_t & numPool) { if (m_poolOffsetToVsId.find(pool_info->img_offset) == m_poolOffsetToVsId.end()) { tsk_error_reset(); tsk_error_set_errno(TSK_ERR_AUTO_DB); - tsk_error_set_errstr("Error addUnallocatedPoolBlocksToDb() - could not find volume system object ID for pool at offset %lld", pool_info->img_offset); + tsk_error_set_errstr("Error addUnallocatedPoolBlocksToDb() - could not find volume system object ID for pool at offset %lld", (long long int)pool_info->img_offset); return TSK_ERR; } int64_t curPoolVs = m_poolOffsetToVsId[pool_info->img_offset]; @@ -1705,7 +1747,7 @@ TSK_WALK_RET_ENUM TskAutoDbJava::fsWalkUnallocBlocksCb(const TSK_FS_BLOCK *a_blo * @param dbFsInfo fs to process * @returns TSK_OK on success, TSK_ERR on error */ -TSK_RETVAL_ENUM TskAutoDbJava::addFsInfoUnalloc(const TSK_DB_FS_INFO & dbFsInfo) { +TSK_RETVAL_ENUM TskAutoDbJava::addFsInfoUnalloc(const TSK_IMG_INFO* curImgInfo, const TSK_DB_FS_INFO & dbFsInfo) { // Unalloc space is handled separately for APFS if (dbFsInfo.fType == TSK_FS_TYPE_APFS) { @@ -1713,9 +1755,10 @@ TSK_RETVAL_ENUM TskAutoDbJava::addFsInfoUnalloc(const TSK_DB_FS_INFO & dbFsInfo) } //open the fs we have from database - TSK_FS_INFO * fsInfo = tsk_fs_open_img(m_img_info, dbFsInfo.imgOffset, dbFsInfo.fType); + TSK_FS_INFO * fsInfo = tsk_fs_open_img((TSK_IMG_INFO*)curImgInfo, dbFsInfo.imgOffset, dbFsInfo.fType); if (fsInfo == NULL) { tsk_error_set_errstr2("TskAutoDbJava::addFsInfoUnalloc: error opening fs at offset %" PRIdOFF, dbFsInfo.imgOffset); + tsk_error_set_errno(TSK_ERR_AUTO); registerError(); return TSK_ERR; } @@ -1723,6 +1766,7 @@ TSK_RETVAL_ENUM TskAutoDbJava::addFsInfoUnalloc(const TSK_DB_FS_INFO & dbFsInfo) //create a "fake" dir to hold the unalloc files for the fs if (addUnallocFsBlockFilesParent(dbFsInfo.objId, m_curUnallocDirId, m_curImgId) == TSK_ERR) { tsk_error_set_errstr2("addFsInfoUnalloc: error creating dir for unallocated space"); + tsk_error_set_errno(TSK_ERR_AUTO); registerError(); return TSK_ERR; } @@ -1739,6 +1783,7 @@ TSK_RETVAL_ENUM TskAutoDbJava::addFsInfoUnalloc(const TSK_DB_FS_INFO & dbFsInfo) errss << "TskAutoDbJava::addFsInfoUnalloc: error walking fs unalloc blocks, fs id: "; errss << unallocBlockWlkTrack.fsObjId; tsk_error_set_errstr2("%s", errss.str().c_str()); + tsk_error_set_errno(TSK_ERR_AUTO); registerError(); return TSK_ERR; } @@ -1756,6 +1801,9 @@ TSK_RETVAL_ENUM TskAutoDbJava::addFsInfoUnalloc(const TSK_DB_FS_INFO & dbFsInfo) int64_t fileObjId = 0; if (addUnallocBlockFile(m_curUnallocDirId, dbFsInfo.objId, unallocBlockWlkTrack.size, unallocBlockWlkTrack.ranges, fileObjId, m_curImgId) == TSK_ERR) { + tsk_error_set_errstr2("addFsInfoUnalloc: error addUnallocBlockFile"); + tsk_error_set_errno(TSK_ERR_AUTO); + registerError(); registerError(); tsk_fs_close(fsInfo); return TSK_ERR; @@ -1779,7 +1827,7 @@ TSK_RETVAL_ENUM TskAutoDbJava::addUnallocSpaceToDb() { size_t numVsP = 0; size_t numFs = 0; size_t numPool = 0; - + TSK_RETVAL_ENUM retFsSpace = addUnallocFsSpaceToDb(numFs); TSK_RETVAL_ENUM retVsSpace = addUnallocVsSpaceToDb(numVsP); TSK_RETVAL_ENUM retPoolSpace = addUnallocatedPoolBlocksToDb(numPool); @@ -1798,32 +1846,243 @@ TSK_RETVAL_ENUM TskAutoDbJava::addUnallocSpaceToDb() { } +TSK_RETVAL_ENUM TskAutoDbJava::getVsPartById(int64_t objId, TSK_VS_PART_INFO & vsPartInfo){ + for (vector::iterator curVsPartDbInfo = m_savedVsPartInfo.begin(); curVsPartDbInfo!= m_savedVsPartInfo.end(); ++curVsPartDbInfo) { + if (curVsPartDbInfo->objId == objId){ + vsPartInfo.start = curVsPartDbInfo->start; + vsPartInfo.desc = curVsPartDbInfo->desc; + vsPartInfo.flags = curVsPartDbInfo->flags; + vsPartInfo.len = curVsPartDbInfo->len; + + return TSK_OK; + } + } + return TSK_ERR; +} + +TSK_RETVAL_ENUM TskAutoDbJava::getVsByFsId(int64_t objId, TSK_DB_VS_INFO & vsDbInfo){ + TSK_DB_OBJECT* fsObjDbInfo = NULL; + if ( getObjectInfo( objId, &fsObjDbInfo) == TSK_OK){ //searches for fs object + for (vector::iterator curVsPartDbInfo = m_savedVsPartInfo.begin(); curVsPartDbInfo!= m_savedVsPartInfo.end(); ++curVsPartDbInfo) { //searches for vspart parent of fs + if (fsObjDbInfo->parObjId == curVsPartDbInfo->objId){ + TSK_DB_OBJECT* vsPartObjDbInfo = NULL; + if ( getObjectInfo(curVsPartDbInfo->objId, &vsPartObjDbInfo ) == TSK_OK){ + for (vector::iterator curVsDbInfo = m_savedVsInfo.begin(); curVsDbInfo!= m_savedVsInfo.end(); ++curVsDbInfo) { //searches for vs parent of vspart + if (vsPartObjDbInfo->parObjId == curVsDbInfo->objId){ + vsDbInfo.objId = curVsDbInfo->objId; + vsDbInfo.block_size = curVsDbInfo->block_size; + vsDbInfo.vstype = curVsDbInfo->vstype; + vsDbInfo.offset = curVsDbInfo->offset; + return TSK_OK; + } + } + tsk_error_set_errstr("TskAutoDbJava:: GetVsByFsId: error getting VS from FS. (Parent VS not Found)."); + tsk_error_set_errno(TSK_ERR_AUTO); + registerError(); + return TSK_ERR; + } + } + } + tsk_error_set_errstr("TskAutoDbJava:: GetVsByFsId: error getting VS from FS (Parent VS Part not found)."); + tsk_error_set_errstr2("cache size: %" PRIdOFF, m_savedVsPartInfo.size()); + tsk_error_set_errno(TSK_ERR_AUTO); + registerError(); + return TSK_ERR; + } + else { + tsk_error_set_errstr("TskAutoDbJava:: GetVsByFsId: error getting VS from FS (FS object not found)."); + tsk_error_set_errno(TSK_ERR_AUTO); + registerError(); + return TSK_ERR; + } +} + + /** * Process each file system in the database and add its unallocated sectors to virtual files. * @param numFs (out) number of filesystems found * @returns TSK_OK on success, TSK_ERR on error (if some or all fs could not be processed) */ TSK_RETVAL_ENUM TskAutoDbJava::addUnallocFsSpaceToDb(size_t & numFs) { - + if(m_stopAllProcessing) { return TSK_OK; } - numFs = m_savedFsInfo.size(); + numFs = m_savedFsInfo.size(); TSK_RETVAL_ENUM allFsProcessRet = TSK_OK; - for (vector::iterator it = m_savedFsInfo.begin(); it!= m_savedFsInfo.end(); ++it) { - if (m_stopAllProcessing) { + + + for (vector::iterator curFsDbInfo = m_savedFsInfo.begin(); curFsDbInfo!= m_savedFsInfo.end(); ++curFsDbInfo) { + if (m_stopAllProcessing) break; + + // finds VS related to the FS + TSK_DB_VS_INFO curVsDbInfo; + if(getVsByFsId(curFsDbInfo->objId, curVsDbInfo) == TSK_ERR){ + tsk_error_set_errstr2( + "TskAutoDbJava::addUnallocFsSpaceToDb: error getting VS from FS." + ); + tsk_error_set_errno(TSK_ERR_AUTO); + registerError(); + //allFsProcessRet = TSK_STOP; + return TSK_ERR; + } + else { + if ((curVsDbInfo.vstype == TSK_VS_TYPE_APFS)||(curVsDbInfo.vstype == TSK_VS_TYPE_LVM)){ + + TSK_DB_OBJECT* fsObjInfo = NULL; + if (getObjectInfo ( curFsDbInfo->objId, &fsObjInfo) == TSK_ERR ) { + tsk_error_set_errstr( + "TskAutoDbJava::addUnallocFsSpaceToDb: error getting Object by ID" + ); + tsk_error_set_errno(TSK_ERR_AUTO); + registerError(); + return TSK_ERR; + + } + + TSK_VS_PART_INFO curVsPartInfo; + if (getVsPartById(fsObjInfo->parObjId, curVsPartInfo) == TSK_ERR){ + tsk_error_set_errstr( + "TskAutoDbJava::addUnallocFsSpaceToDb: error getting Volume Part from FSInfo" + ); + tsk_error_set_errno(TSK_ERR_AUTO); + registerError(); + return TSK_ERR; + } + + + + + if (curVsDbInfo.vstype == TSK_VS_TYPE_APFS) { + const auto pool = tsk_pool_open_img_sing(m_img_info, curVsDbInfo.offset, TSK_POOL_TYPE_APFS); + if (pool == nullptr) { + tsk_error_set_errstr2( + "TskAutoDbJava::addUnallocFsSpaceToDb:: Error opening pool. "); + tsk_error_set_errstr2("Offset: %" PRIdOFF, curVsDbInfo.offset); + registerError(); + allFsProcessRet = TSK_ERR; + } + const auto pool_vol_img = pool->get_img_info(pool, curVsPartInfo.start); + + if (pool_vol_img != NULL) { + TSK_FS_INFO *fs_info = apfs_open(pool_vol_img, 0, TSK_FS_TYPE_APFS, ""); + if (fs_info) { + TSK_RETVAL_ENUM retval = addFsInfoUnalloc(pool_vol_img, *curFsDbInfo); + if (retval == TSK_ERR) + allFsProcessRet = TSK_ERR; + + tsk_fs_close(fs_info); + tsk_img_close(pool_vol_img); + + if (retval == TSK_STOP) { + tsk_pool_close(pool); + allFsProcessRet = TSK_STOP; + } + + + } + else { + if (curVsPartInfo.flags & TSK_POOL_VOLUME_FLAG_ENCRYPTED) { + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_FS_ENCRYPTED); + tsk_error_set_errstr( + "TskAutoDbJava::addUnallocFsSpaceToDb: Encrypted APFS file system"); + tsk_error_set_errstr2("Block: %" PRIdOFF, curVsPartInfo.start); + registerError(); + } + else { + tsk_error_set_errstr2( + "TskAutoDbJava::addUnallocFsSpaceToDb: Error opening APFS file system"); + registerError(); + } + + tsk_img_close(pool_vol_img); + tsk_pool_close(pool); + allFsProcessRet = TSK_ERR; + } + tsk_img_close(pool_vol_img); + } + else { + tsk_pool_close(pool); + tsk_error_set_errstr2( + "TskAutoDbJava::addUnallocFsSpaceToDb: Error opening APFS pool"); + registerError(); + allFsProcessRet = TSK_ERR; + } + + } + #ifdef HAVE_LIBVSLVM + if ( curVsDbInfo.vstype == TSK_VS_TYPE_LVM) { + + const auto pool = tsk_pool_open_img_sing(m_img_info, curVsDbInfo.offset, TSK_POOL_TYPE_LVM); + if (pool == nullptr) { + tsk_error_set_errstr2( + "findFilesInPool: Error opening pool"); + registerError(); + allFsProcessRet = TSK_ERR; + } + + + TSK_IMG_INFO *pool_vol_img = pool->get_img_info(pool, curVsPartInfo.start); + if (pool_vol_img == NULL) { + tsk_pool_close(pool); + tsk_error_set_errstr2( + "TskAutoDbJava::addUnallocFsSpaceToDb: Error opening LVM logical volume: %" PRIdOFF "", + curVsPartInfo.start); + tsk_error_set_errno(TSK_ERR_FS); + registerError(); + allFsProcessRet = TSK_ERR; + } + else { + TSK_FS_INFO *fs_info = tsk_fs_open_img(pool_vol_img, curFsDbInfo->imgOffset, curFsDbInfo->fType); + if (fs_info == NULL) { + tsk_img_close(pool_vol_img); + tsk_pool_close(pool); + tsk_error_set_errstr2( + "findFilesInPool: Unable to open file system in LVM logical volume: %" PRIdOFF "", + curFsDbInfo->imgOffset); + tsk_error_set_errno(TSK_ERR_FS); + registerError(); + allFsProcessRet = TSK_ERR; + } + else { + TSK_RETVAL_ENUM retval = addFsInfoUnalloc(pool_vol_img, *curFsDbInfo); + if (retval == TSK_ERR) + allFsProcessRet = TSK_ERR; + + tsk_fs_close(fs_info); + tsk_img_close(pool_vol_img); + + if (retval == TSK_STOP) { + tsk_pool_close(pool); + allFsProcessRet = TSK_STOP; + } + } + } + + } + #endif /* HAVE_LIBVSLVM */ + + if (curVsDbInfo.vstype == TSK_VS_TYPE_UNSUPP){ + tsk_error_set_errstr2( + "TskAutoDbJava::addUnallocFsSpaceToDb: VS Type not supported"); + registerError(); + allFsProcessRet = TSK_ERR; + } + } + else { + if (addFsInfoUnalloc(m_img_info, *curFsDbInfo) == TSK_ERR){ + allFsProcessRet = TSK_ERR; + } + } } - if (addFsInfoUnalloc(*it) == TSK_ERR) - allFsProcessRet = TSK_ERR; } - - //TODO set parent_path for newly created virt dir/file hierarchy for consistency - return allFsProcessRet; } + /** * Process each volume in the database and add its unallocated sectors to virtual files. * @param numVsP (out) number of vs partitions found @@ -1936,7 +2195,7 @@ TSK_RETVAL_ENUM TskAutoDbJava::addUnallocImageSpaceToDb() { const TSK_OFF_T imgSize = getImageSize(); if (imgSize == -1) { - tsk_error_set_errstr("addUnallocImageSpaceToDb: error getting current image size, can't create unalloc block file for the image."); + tsk_error_set_errstr("addUnallocImageSpaceToDb: error getting curent image size, can't create unalloc block file for the image."); registerError(); return TSK_ERR; } @@ -1945,7 +2204,8 @@ TSK_RETVAL_ENUM TskAutoDbJava::addUnallocImageSpaceToDb() { //add unalloc block file for the entire image vector ranges; ranges.push_back(tempRange); - int64_t fileObjId = 0; + // int64_t fileObjId = 0; + if (TSK_ERR == addUnallocBlockFileInChunks(0, imgSize, m_curImgId, m_curImgId)) { return TSK_ERR; } diff --git a/bindings/java/jni/auto_db_java.h b/bindings/java/jni/auto_db_java.h index 6980a5dcfe..e2fb8b1f0f 100644 --- a/bindings/java/jni/auto_db_java.h +++ b/bindings/java/jni/auto_db_java.h @@ -161,7 +161,7 @@ class TskAutoDbJava :public TskAuto { jmethodID m_addLayoutFileRangeMethodID = NULL; // Cached objects - vector m_savedFsInfo; + vector m_savedFsInfo; vector m_savedVsInfo; vector m_savedVsPartInfo; vector m_savedObjects; @@ -200,7 +200,7 @@ class TskAutoDbJava :public TskAuto { TSK_RETVAL_ENUM addUnallocatedPoolBlocksToDb(size_t & numPool); static TSK_WALK_RET_ENUM fsWalkUnallocBlocksCb(const TSK_FS_BLOCK *a_block, void *a_ptr); - TSK_RETVAL_ENUM addFsInfoUnalloc(const TSK_DB_FS_INFO & dbFsInfo); + TSK_RETVAL_ENUM addFsInfoUnalloc(const TSK_IMG_INFO* curImgInfo, const TSK_DB_FS_INFO & dbFsInfo); TSK_RETVAL_ENUM addUnallocFsSpaceToDb(size_t & numFs); TSK_RETVAL_ENUM addUnallocVsSpaceToDb(size_t & numVsP); TSK_RETVAL_ENUM addUnallocImageSpaceToDb(); @@ -235,7 +235,8 @@ class TskAutoDbJava :public TskAuto { int64_t dataSourceObjId); TSK_RETVAL_ENUM addUnallocFsBlockFilesParent(const int64_t fsObjId, int64_t& objId, int64_t dataSourceObjId); TSK_RETVAL_ENUM addUnallocatedPoolVolume(int vol_index, int64_t parObjId, int64_t& objId); - + TSK_RETVAL_ENUM getVsPartById(int64_t objId, TSK_VS_PART_INFO & vsPartInfo); + TSK_RETVAL_ENUM getVsByFsId(int64_t objId, TSK_DB_VS_INFO & vsDbInfo); }; #endif diff --git a/bindings/java/src/org/sleuthkit/datamodel/TskData.java b/bindings/java/src/org/sleuthkit/datamodel/TskData.java index 0972d09e4b..eff55c0552 100644 --- a/bindings/java/src/org/sleuthkit/datamodel/TskData.java +++ b/bindings/java/src/org/sleuthkit/datamodel/TskData.java @@ -588,6 +588,7 @@ public enum TSK_VS_TYPE_ENUM { TSK_VS_TYPE_MAC(0x0008, "Mac"), ///< Mac partition table NON-NLS TSK_VS_TYPE_GPT(0x0010, "GPT"), ///< GPT partition table NON-NLS TSK_VS_TYPE_APFS(0x0020, "APFS"), ///< APFS pool NON-NLS + TSK_VS_TYPE_LVM(0x0030, "LVM"), ///< LVM pool NON-NLS TSK_VS_TYPE_DBFILLER(0x00F0, bundle.getString("TskData.tskVSTypeEnum.fake")), ///< fake partition table type for loaddb (for images that do not have a volume system) TSK_VS_TYPE_UNSUPP(0xFFFF, bundle.getString("TskData.tskVSTypeEnum.unsupported")); ///< Unsupported @@ -749,6 +750,7 @@ public String getName() { public enum TSK_POOL_TYPE_ENUM { TSK_POOL_TYPE_DETECT(0, "Auto detect"), ///< Use autodetection methods TSK_POOL_TYPE_APFS(1, "APFS Pool"), ///< APFS Pooled Volumes + TSK_POOL_TYPE_LVM(2, "LVM Pool"), ///< LVM Pooled Volumes TSK_POOL_TYPE_UNSUPP(0xffff, "Unsupported") ///< Unsupported pool container type ; diff --git a/tsk/auto/auto.cpp b/tsk/auto/auto.cpp index 2f0e4d56ed..fd577441b2 100755 --- a/tsk/auto/auto.cpp +++ b/tsk/auto/auto.cpp @@ -479,16 +479,16 @@ TskAuto::findFilesInPool(TSK_OFF_T start, TSK_POOL_TYPE_ENUM ptype) } if (filterRetval != TSK_FILTER_SKIP) { - TSK_IMG_INFO *pool_img = pool->get_img_info(pool, vol_info->block); - if (pool_img != NULL) { - TSK_FS_INFO *fs_info = apfs_open(pool_img, 0, TSK_FS_TYPE_APFS, ""); + TSK_IMG_INFO *pool_vol_img = pool->get_img_info(pool, vol_info->block); + if (pool_vol_img != NULL) { + TSK_FS_INFO *fs_info = apfs_open(pool_vol_img, 0, TSK_FS_TYPE_APFS, ""); if (fs_info) { TSK_RETVAL_ENUM retval = findFilesInFsInt(fs_info, fs_info->root_inum); tsk_fs_close(fs_info); - // TODO: what if retval != TSK_STOP, shouldn't pool_img be closed? + // TODO: what if retval != TSK_STOP, shouldn't pool_vol_img be closed? if (retval == TSK_STOP) { - tsk_img_close(pool_img); + tsk_img_close(pool_vol_img); tsk_pool_close(pool); return TSK_STOP; } @@ -507,9 +507,12 @@ TskAuto::findFilesInPool(TSK_OFF_T start, TSK_POOL_TYPE_ENUM ptype) "findFilesInPool: Error opening APFS file system"); registerError(); } + tsk_img_close(pool_vol_img); + tsk_pool_close(pool); + return TSK_ERR; } - tsk_img_close(pool_img); + tsk_img_close(pool_vol_img); } else { tsk_pool_close(pool); @@ -536,8 +539,8 @@ TskAuto::findFilesInPool(TSK_OFF_T start, TSK_POOL_TYPE_ENUM ptype) return TSK_STOP; } - TSK_IMG_INFO *pool_img = pool->get_img_info(pool, vol_info->block); - if (pool_img == NULL) { + TSK_IMG_INFO *pool_vol_img = pool->get_img_info(pool, vol_info->block); + if (pool_vol_img == NULL) { tsk_pool_close(pool); tsk_error_set_errstr2( "findFilesInPool: Error opening LVM logical volume: %" PRIdOFF "", @@ -545,9 +548,9 @@ TskAuto::findFilesInPool(TSK_OFF_T start, TSK_POOL_TYPE_ENUM ptype) registerError(); return TSK_ERR; } - TSK_FS_INFO *fs_info = tsk_fs_open_img(pool_img, 0, TSK_FS_TYPE_DETECT); + TSK_FS_INFO *fs_info = tsk_fs_open_img(pool_vol_img, 0, TSK_FS_TYPE_DETECT); if (fs_info == NULL) { - tsk_img_close(pool_img); + tsk_img_close(pool_vol_img); tsk_pool_close(pool); tsk_error_set_errstr2( "findFilesInPool: Unable to open file system in LVM logical volume: %" PRIdOFF "", @@ -558,7 +561,7 @@ TskAuto::findFilesInPool(TSK_OFF_T start, TSK_POOL_TYPE_ENUM ptype) TSK_RETVAL_ENUM retval = findFilesInFsInt(fs_info, fs_info->root_inum); tsk_fs_close(fs_info); - tsk_img_close(pool_img); + tsk_img_close(pool_vol_img); if (retval == TSK_STOP) { tsk_pool_close(pool); diff --git a/tsk/auto/auto_db.cpp b/tsk/auto/auto_db.cpp index bac4d7f88a..d92c1ae884 100755 --- a/tsk/auto/auto_db.cpp +++ b/tsk/auto/auto_db.cpp @@ -301,6 +301,14 @@ TSK_FILTER_ENUM TskAutoDb::filterVs(const TSK_VS_INFO * vs_info) return TSK_FILTER_STOP; } + // populating cache m_savedVsInfo and ObjectInfo + TSK_DB_VS_INFO vs_db; + vs_db.objId = m_curImgId; + vs_db.offset = vs_info->offset; + vs_db.vstype = vs_info->vstype; + vs_db.block_size = vs_info->block_size; + m_savedVsInfo.push_back(vs_db); + return TSK_FILTER_CONT; } @@ -315,6 +323,7 @@ TskAutoDb::filterPool(const TSK_POOL_INFO * pool_info) registerError(); return TSK_FILTER_STOP; } + // Save the parent obj ID for the pool m_poolOffsetToParentId[pool_info->img_offset] = m_curVolId; } @@ -324,10 +333,23 @@ TskAutoDb::filterPool(const TSK_POOL_INFO * pool_info) registerError(); return TSK_FILTER_STOP; } + // Save the parent obj ID for the pool m_poolOffsetToParentId[pool_info->img_offset] = m_curImgId; } + // populating cache m_savedVsInfo + TSK_DB_VS_INFO vs_db; + vs_db.objId = m_curPoolVs; + vs_db.offset = pool_info->img_offset; + if (pool_info->ctype == TSK_POOL_TYPE_APFS) + vs_db.vstype = TSK_VS_TYPE_APFS; + if (pool_info->ctype == TSK_POOL_TYPE_LVM) + vs_db.vstype = TSK_VS_TYPE_LVM; + vs_db.block_size = pool_info->block_size; + m_savedVsInfo.push_back(vs_db); + + // Store the volume system object ID for later use m_poolOffsetToVsId[pool_info->img_offset] = m_curPoolVs; @@ -349,7 +371,7 @@ TskAutoDb::addUnallocatedPoolBlocksToDb(size_t & numPool) { if (m_poolOffsetToVsId.find(pool_info->img_offset) == m_poolOffsetToVsId.end()) { tsk_error_reset(); tsk_error_set_errno(TSK_ERR_AUTO_DB); - tsk_error_set_errstr("Error addUnallocatedPoolBlocksToDb() - could not find volume system object ID for pool at offset %lld", pool_info->img_offset); + tsk_error_set_errstr("Error addUnallocatedPoolBlocksToDb() - could not find volume system object ID for pool at offset %lld", (long long int)pool_info->img_offset); return TSK_ERR; } int64_t curPoolVs = m_poolOffsetToVsId[pool_info->img_offset]; @@ -402,6 +424,12 @@ TskAutoDb::filterPoolVol(const TSK_POOL_VOLUME_INFO * pool_vol) return TSK_FILTER_STOP; } + TSK_DB_VS_PART_INFO vol_info_db; + vol_info_db.objId = m_curPoolVol; + snprintf(vol_info_db.desc, TSK_MAX_DB_VS_PART_INFO_DESC_LEN - 1, "%s", pool_vol->desc); + vol_info_db.start = pool_vol->block; ///< Starting Block number + m_savedVsPartInfo.push_back(vol_info_db); + return TSK_FILTER_CONT; } @@ -412,11 +440,24 @@ TskAutoDb::filterVol(const TSK_VS_PART_INFO * vs_part) m_foundStructure = true; m_poolFound = false; + + if (m_db->addVolumeInfo(vs_part, m_curVsId, m_curVolId)) { registerError(); return TSK_FILTER_STOP; } + // Save the volume info for creating unallocated blocks later + TSK_DB_VS_PART_INFO vs_part_db; + vs_part_db.objId = m_curVolId; + vs_part_db.addr = vs_part->addr; + vs_part_db.start = vs_part->start; + vs_part_db.len = vs_part->len; + strncpy(vs_part_db.desc, vs_part->desc, TSK_MAX_DB_VS_PART_INFO_DESC_LEN - 1); + vs_part_db.flags = vs_part->flags; + m_savedVsPartInfo.push_back(vs_part_db); + + return TSK_FILTER_CONT; } @@ -472,6 +513,20 @@ TskAutoDb::filterFs(TSK_FS_INFO * fs_info) setFileFilterFlags(filterFlags); + + // Save the file system info for creating unallocated blocks later + TSK_DB_FS_INFO fs_info_db; + fs_info_db.objId = m_curFsId; + fs_info_db.imgOffset = fs_info->offset; + fs_info_db.fType = fs_info->ftype; + fs_info_db.block_size = fs_info->block_size; + fs_info_db.block_count = fs_info->block_count; + fs_info_db.root_inum = fs_info->root_inum; + fs_info_db.first_inum = fs_info->first_inum; + fs_info_db.last_inum = fs_info->last_inum; + m_savedFsInfo.push_back(fs_info_db); + + return TSK_FILTER_CONT; } @@ -1094,7 +1149,7 @@ TSK_WALK_RET_ENUM TskAutoDb::fsWalkUnallocBlocksCb(const TSK_FS_BLOCK *a_block, * @param dbFsInfo fs to process * @returns TSK_OK on success, TSK_ERR on error */ -TSK_RETVAL_ENUM TskAutoDb::addFsInfoUnalloc(const TSK_DB_FS_INFO & dbFsInfo) { +TSK_RETVAL_ENUM TskAutoDb::addFsInfoUnalloc(const TSK_IMG_INFO* curImgInfo, const TSK_DB_FS_INFO & dbFsInfo) { // Unalloc space is handled separately for APFS if (dbFsInfo.fType == TSK_FS_TYPE_APFS) { @@ -1102,7 +1157,7 @@ TSK_RETVAL_ENUM TskAutoDb::addFsInfoUnalloc(const TSK_DB_FS_INFO & dbFsInfo) { } //open the fs we have from database - TSK_FS_INFO * fsInfo = tsk_fs_open_img(m_img_info, dbFsInfo.imgOffset, dbFsInfo.fType); + TSK_FS_INFO * fsInfo = tsk_fs_open_img((TSK_IMG_INFO*)curImgInfo, dbFsInfo.imgOffset, dbFsInfo.fType); if (fsInfo == NULL) { tsk_error_set_errstr2("TskAutoDb::addFsInfoUnalloc: error opening fs at offset %" PRIdOFF, dbFsInfo.imgOffset); registerError(); @@ -1192,37 +1247,245 @@ TSK_RETVAL_ENUM TskAutoDb::addUnallocSpaceToDb() { * @param numFs (out) number of filesystems found * @returns TSK_OK on success, TSK_ERR on error (if some or all fs could not be processed) */ -TSK_RETVAL_ENUM TskAutoDb::addUnallocFsSpaceToDb(size_t & numFs) { - - vector fsInfos; +TSK_RETVAL_ENUM TskAutoDb::getVsPartById(int64_t objId, TSK_VS_PART_INFO & vsPartInfo){ + for (vector::iterator curVsPartDbInfo = m_savedVsPartInfo.begin(); curVsPartDbInfo!= m_savedVsPartInfo.end(); ++curVsPartDbInfo) { + if (curVsPartDbInfo->objId == objId){ + vsPartInfo.start = curVsPartDbInfo->start; + vsPartInfo.desc = curVsPartDbInfo->desc; + vsPartInfo.flags = curVsPartDbInfo->flags; + vsPartInfo.len = curVsPartDbInfo->len; - if(m_stopAllProcessing) { - return TSK_OK; + return TSK_OK; + } } + return TSK_ERR; +} - uint16_t ret = m_db->getFsInfos(m_curImgId, fsInfos); - if (ret) { - tsk_error_set_errstr2("addUnallocFsSpaceToDb: error getting fs infos from db"); - registerError(); - return TSK_ERR; +TSK_RETVAL_ENUM TskAutoDb::getVsByFsId(int64_t objId, TSK_DB_VS_INFO & vsDbInfo){ + TSK_DB_OBJECT fsObjDbInfo; + if ( m_db->getObjectInfo( objId, fsObjDbInfo) == TSK_OK){ //searches for fs object + for (vector::iterator curVsPartDbInfo = m_savedVsPartInfo.begin(); curVsPartDbInfo!= m_savedVsPartInfo.end(); ++curVsPartDbInfo) { //searches for vspart parent of fs + if (fsObjDbInfo.parObjId == curVsPartDbInfo->objId){ + TSK_DB_OBJECT vsPartObjDbInfo; + if ( m_db->getObjectInfo(curVsPartDbInfo->objId, vsPartObjDbInfo ) == TSK_OK){ + for (vector::iterator curVsDbInfo = m_savedVsInfo.begin(); curVsDbInfo!= m_savedVsInfo.end(); ++curVsDbInfo) { //searches for vs parent of vspart + if (vsPartObjDbInfo.parObjId == curVsDbInfo->objId){ + vsDbInfo.objId = curVsDbInfo->objId; + vsDbInfo.block_size = curVsDbInfo->block_size; + vsDbInfo.vstype = curVsDbInfo->vstype; + vsDbInfo.offset = curVsDbInfo->offset; + return TSK_OK; + } + } + tsk_error_set_errstr("TskAutoDb:: GetVsByFsId: error getting VS from FS. (Parent VS not Found)"); + tsk_error_set_errstr2("cache size: %" PRIdOFF, m_savedVsInfo.size()); + tsk_error_set_errno(TSK_ERR_AUTO); + registerError(); + return TSK_ERR; + } + } + } + tsk_error_set_errstr("TskAutoDb:: GetVsByFsId: error getting VS from FS (Parent VS_Part not found) cache size: %" + PRIdOFF, m_savedVsPartInfo.size() ); + tsk_error_set_errstr2("FS ParentObjId: %" PRIdOFF, fsObjDbInfo.parObjId); + tsk_error_set_errno(TSK_ERR_AUTO); + registerError(); + return TSK_ERR; + } + else { + tsk_error_set_errstr("TskAutoDb:: GetVsByFsId: error getting VS from FS (FS object not found)"); + tsk_error_set_errno(TSK_ERR_AUTO); + registerError(); + return TSK_ERR; } +} + - numFs = fsInfos.size(); +/** +* Process each file system in the database and add its unallocated sectors to virtual files. +* @param numFs (out) number of filesystems found +* @returns TSK_OK on success, TSK_ERR on error (if some or all fs could not be processed) +*/ +TSK_RETVAL_ENUM TskAutoDb::addUnallocFsSpaceToDb(size_t & numFs) { + + if(m_stopAllProcessing) { + return TSK_OK; + } + numFs = m_savedFsInfo.size(); TSK_RETVAL_ENUM allFsProcessRet = TSK_OK; - for (vector::iterator it = fsInfos.begin(); it!= fsInfos.end(); ++it) { - if (m_stopAllProcessing) { + + + for (vector::iterator curFsDbInfo = m_savedFsInfo.begin(); curFsDbInfo!= m_savedFsInfo.end(); ++curFsDbInfo) { + if (m_stopAllProcessing) break; + + // finds VS related to the FS + TSK_DB_VS_INFO curVsDbInfo; + if(getVsByFsId(curFsDbInfo->objId, curVsDbInfo) == TSK_ERR){ + tsk_error_set_errstr2( + "TskAutoDb::addUnallocFsSpaceToDb: error getting VS from FS." + ); + tsk_error_set_errno(TSK_ERR_AUTO); + registerError(); + //allFsProcessRet = TSK_STOP; + return TSK_ERR; + } + else { + if ((curVsDbInfo.vstype == TSK_VS_TYPE_APFS)||(curVsDbInfo.vstype == TSK_VS_TYPE_LVM)){ + + TSK_DB_OBJECT fsObjInfo; + if (m_db->getObjectInfo ( curFsDbInfo->objId, fsObjInfo) == TSK_ERR ) { + tsk_error_set_errstr( + "TskAutoDb::addUnallocFsSpaceToDb: error getting Object by ID" + ); + tsk_error_set_errno(TSK_ERR_AUTO); + registerError(); + return TSK_ERR; + + } + + TSK_VS_PART_INFO curVsPartInfo; + if (getVsPartById(fsObjInfo.parObjId, curVsPartInfo) == TSK_ERR){ + tsk_error_set_errstr( + "TskAutoDb::addUnallocFsSpaceToDb: error getting Volume Part from FSInfo" + ); + tsk_error_set_errno(TSK_ERR_AUTO); + registerError(); + return TSK_ERR; + } + + + + + if (curVsDbInfo.vstype == TSK_VS_TYPE_APFS) { + const auto pool = tsk_pool_open_img_sing(m_img_info, curVsDbInfo.offset, TSK_POOL_TYPE_APFS); + if (pool == nullptr) { + tsk_error_set_errstr2( + "TskAutoDb::addUnallocFsSpaceToDb:: Error opening pool. "); + tsk_error_set_errstr2("Offset: %" PRIdOFF, curVsDbInfo.offset); + registerError(); + allFsProcessRet = TSK_ERR; + } + const auto pool_img = pool->get_img_info(pool, curVsPartInfo.start); + + if (pool_img != NULL) { + TSK_FS_INFO *fs_info = apfs_open(pool_img, 0, TSK_FS_TYPE_APFS, ""); + if (fs_info) { + TSK_RETVAL_ENUM retval = addFsInfoUnalloc(pool_img, *curFsDbInfo); + if (retval == TSK_ERR) + allFsProcessRet = TSK_ERR; + + tsk_fs_close(fs_info); + tsk_img_close(pool_img); + + if (retval == TSK_STOP) { + tsk_pool_close(pool); + allFsProcessRet = TSK_STOP; + } + + + } + else { + if (curVsPartInfo.flags & TSK_POOL_VOLUME_FLAG_ENCRYPTED) { + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_FS_ENCRYPTED); + tsk_error_set_errstr( + "TskAutoDb::addUnallocFsSpaceToDb: Encrypted APFS file system"); + tsk_error_set_errstr2("Block: %" PRIdOFF, curVsPartInfo.start); + registerError(); + } + else { + tsk_error_set_errstr2( + "TskAutoDb::addUnallocFsSpaceToDb: Error opening APFS file system"); + registerError(); + } + + tsk_img_close(pool_img); + tsk_pool_close(pool); + allFsProcessRet = TSK_ERR; + } + tsk_img_close(pool_img); + } + else { + tsk_pool_close(pool); + tsk_error_set_errstr2( + "TskAutoDb::addUnallocFsSpaceToDb: Error opening APFS pool"); + registerError(); + allFsProcessRet = TSK_ERR; + } + + } + #ifdef HAVE_LIBVSLVM + if ( curVsDbInfo.vstype == TSK_VS_TYPE_LVM) { + + const auto pool = tsk_pool_open_img_sing(m_img_info, curVsDbInfo.offset, TSK_POOL_TYPE_LVM); + if (pool == nullptr) { + tsk_error_set_errstr2( + "findFilesInPool: Error opening pool"); + registerError(); + allFsProcessRet = TSK_ERR; + } + + + TSK_IMG_INFO *pool_img = pool->get_img_info(pool, curVsPartInfo.start); + if (pool_img == NULL) { + tsk_pool_close(pool); + tsk_error_set_errstr2( + "TskAutoDb::addUnallocFsSpaceToDb: Error opening LVM logical volume: %" PRIdOFF "", + curVsPartInfo.start); + tsk_error_set_errno(TSK_ERR_FS); + registerError(); + allFsProcessRet = TSK_ERR; + } + else { + TSK_FS_INFO *fs_info = tsk_fs_open_img(pool_img, curFsDbInfo->imgOffset, curFsDbInfo->fType); + if (fs_info == NULL) { + tsk_img_close(pool_img); + tsk_pool_close(pool); + tsk_error_set_errstr2( + "findFilesInPool: Unable to open file system in LVM logical volume: %" PRIdOFF "", + curFsDbInfo->imgOffset); + tsk_error_set_errno(TSK_ERR_FS); + registerError(); + allFsProcessRet = TSK_ERR; + } + else { + TSK_RETVAL_ENUM retval = addFsInfoUnalloc(pool_img, *curFsDbInfo); + if (retval == TSK_ERR) + allFsProcessRet = TSK_ERR; + + tsk_fs_close(fs_info); + tsk_img_close(pool_img); + + if (retval == TSK_STOP) { + tsk_pool_close(pool); + allFsProcessRet = TSK_STOP; + } + } + } + + } + #endif /* HAVE_LIBVSLVM */ + + if (curVsDbInfo.vstype == TSK_VS_TYPE_UNSUPP){ + tsk_error_set_errstr2( + "TskAutoDb::addUnallocFsSpaceToDb: VS Type not supported"); + registerError(); + allFsProcessRet = TSK_ERR; + } + } + else { + if (addFsInfoUnalloc(m_img_info, *curFsDbInfo) == TSK_ERR){ + allFsProcessRet = TSK_ERR; + } + } } - if (addFsInfoUnalloc(*it) == TSK_ERR) - allFsProcessRet = TSK_ERR; } - - //TODO set parent_path for newly created virt dir/file hierarchy for consistency - return allFsProcessRet; } + /** * Process each volume in the database and add its unallocated sectors to virtual files. * @param numVsP (out) number of vs partitions found diff --git a/tsk/auto/db_sqlite.cpp b/tsk/auto/db_sqlite.cpp index 6c2c58d941..a3a9a86bda 100644 --- a/tsk/auto/db_sqlite.cpp +++ b/tsk/auto/db_sqlite.cpp @@ -32,7 +32,7 @@ using std::for_each; TskDbSqlite::TskDbSqlite(const char* a_dbFilePathUtf8, bool a_blkMapFlag) : TskDb(a_dbFilePathUtf8, a_blkMapFlag) { - strncpy(m_dbFilePathUtf8, a_dbFilePathUtf8, 1024); + snprintf(m_dbFilePathUtf8, 1024, "%s", a_dbFilePathUtf8); m_utf8 = true; m_blkMapFlag = a_blkMapFlag; m_db = NULL; @@ -786,15 +786,25 @@ TskDbSqlite::addPoolInfoAndVS(const TSK_POOL_INFO *pool_info, int64_t parObjId, return retVal; } + // Add volume system if (addObject(TSK_DB_OBJECT_TYPE_VS, poolObjId, vsObjId)) return 1; - snprintf(stmt, 1024, - "INSERT INTO tsk_vs_info (obj_id, vs_type, img_offset, block_size) VALUES (%" PRId64 ", %d,%" PRIuDADDR ",%d)", vsObjId, TSK_VS_TYPE_APFS, pool_info->img_offset, pool_info->block_size); // TODO - offset + if (pool_info->ctype == TSK_POOL_TYPE_APFS){ + snprintf(stmt, 1024, + "INSERT INTO tsk_vs_info (obj_id, vs_type, img_offset, block_size) VALUES (%" PRId64 ", %d,%" PRIuDADDR ",%d)", vsObjId, TSK_VS_TYPE_APFS, pool_info->img_offset, pool_info->block_size); // TODO - offset + } + #ifdef HAVE_LIBVSLVM + if (pool_info->ctype == TSK_POOL_TYPE_LVM){ + snprintf(stmt, 1024, + "INSERT INTO tsk_vs_info (obj_id, vs_type, img_offset, block_size) VALUES (%" PRId64 ", %d,%" PRIuDADDR ",%d)", vsObjId, TSK_VS_TYPE_LVM, pool_info->img_offset, pool_info->block_size); // TODO - offset + } + #endif /* HAVE_LIBVSLVM */ return attempt_exec(stmt, "Error adding data to tsk_vs_info table: %s\n"); + } /** diff --git a/tsk/auto/tsk_case_db.h b/tsk/auto/tsk_case_db.h index 18d98fc46f..bc8338ae49 100644 --- a/tsk/auto/tsk_case_db.h +++ b/tsk/auto/tsk_case_db.h @@ -159,6 +159,12 @@ class TskAutoDb:public TskAuto { std::map m_poolOffsetToParentId; std::map m_poolOffsetToVsId; + // Cached objects + vector m_savedFsInfo; + vector m_savedVsInfo; + vector m_savedVsPartInfo; + vector m_savedObjects; + // prevent copying until we add proper logic to handle it TskAutoDb(const TskAutoDb&); TskAutoDb & operator=(const TskAutoDb&); @@ -193,13 +199,14 @@ class TskAutoDb:public TskAuto { int md5HashAttr(unsigned char md5Hash[16], const TSK_FS_ATTR * fs_attr); TSK_RETVAL_ENUM addUnallocatedPoolBlocksToDb(size_t & numPool); static TSK_WALK_RET_ENUM fsWalkUnallocBlocksCb(const TSK_FS_BLOCK *a_block, void *a_ptr); - TSK_RETVAL_ENUM addFsInfoUnalloc(const TSK_DB_FS_INFO & dbFsInfo); + TSK_RETVAL_ENUM addFsInfoUnalloc(const TSK_IMG_INFO* curImgInfo, const TSK_DB_FS_INFO & dbFsInfo); TSK_RETVAL_ENUM addUnallocFsSpaceToDb(size_t & numFs); TSK_RETVAL_ENUM addUnallocVsSpaceToDb(size_t & numVsP); TSK_RETVAL_ENUM addUnallocImageSpaceToDb(); TSK_RETVAL_ENUM addUnallocSpaceToDb(); TSK_RETVAL_ENUM addUnallocBlockFileInChunks(uint64_t byteStart, TSK_OFF_T totalSize, int64_t parentObjId, int64_t dataSourceObjId); - + TSK_RETVAL_ENUM getVsPartById(int64_t objId, TSK_VS_PART_INFO & vsPartInfo); + TSK_RETVAL_ENUM getVsByFsId(int64_t objId, TSK_DB_VS_INFO & vsDbInfo); }; diff --git a/tsk/auto/tsk_db_sqlite.h b/tsk/auto/tsk_db_sqlite.h index 13d5541216..72c21f5ee0 100755 --- a/tsk/auto/tsk_db_sqlite.h +++ b/tsk/auto/tsk_db_sqlite.h @@ -31,6 +31,8 @@ using std::map; using std::vector; + + /** \internal * C++ class that wraps the database internals. */ diff --git a/tsk/vs/mm_open.c b/tsk/vs/mm_open.c index c8c415bcff..57cde454f4 100644 --- a/tsk/vs/mm_open.c +++ b/tsk/vs/mm_open.c @@ -225,6 +225,7 @@ tsk_vs_open(TSK_IMG_INFO * img_info, TSK_DADDR_T offset, case TSK_VS_TYPE_GPT: return tsk_vs_gpt_open(img_info, offset); case TSK_VS_TYPE_APFS: // Not supported yet + case TSK_VS_TYPE_LVM: // Not supported yet case TSK_VS_TYPE_UNSUPP: default: tsk_error_reset(); diff --git a/tsk/vs/tsk_vs.h b/tsk/vs/tsk_vs.h index 5432df34bf..b948cfb851 100644 --- a/tsk/vs/tsk_vs.h +++ b/tsk/vs/tsk_vs.h @@ -54,6 +54,7 @@ extern "C" { TSK_VS_TYPE_MAC = 0x0008, ///< Mac partition table TSK_VS_TYPE_GPT = 0x0010, ///< GPT partition table TSK_VS_TYPE_APFS = 0x0020, ///< APFS + TSK_VS_TYPE_LVM = 0x0030, ///< LVM TSK_VS_TYPE_DBFILLER = 0x00F0, ///< fake partition table type for loaddb (for images that do not have a volume system) TSK_VS_TYPE_UNSUPP = 0xffff, ///< Unsupported } TSK_VS_TYPE_ENUM; From d9bae74d21c9247b0e1a60cfd6092f132e3044cc Mon Sep 17 00:00:00 2001 From: Aristeu Jr Date: Thu, 22 Jun 2023 14:07:53 -0300 Subject: [PATCH 0029/1548] code adjustments --- bindings/java/jni/auto_db_java.cpp | 21 ++++++++------------- bindings/java/jni/auto_db_java.h | 2 +- 2 files changed, 9 insertions(+), 14 deletions(-) diff --git a/bindings/java/jni/auto_db_java.cpp b/bindings/java/jni/auto_db_java.cpp index d80964589e..43a07bfb08 100644 --- a/bindings/java/jni/auto_db_java.cpp +++ b/bindings/java/jni/auto_db_java.cpp @@ -307,7 +307,7 @@ TskAutoDbJava::addPoolInfoAndVS(const TSK_POOL_INFO *pool_info, int64_t parObjId m_savedVsInfo.push_back(vs_db); saveObjectInfo(objId, poolObjId, TSK_DB_OBJECT_TYPE_VS); } - if (pool_info->ctype == TSK_POOL_TYPE_LVM){ + else if (pool_info->ctype == TSK_POOL_TYPE_LVM){ // Add the APFS pool volume jlong objIdj = m_jniEnv->CallLongMethod(m_javaDbObj, m_addVolumeSystemMethodID, poolObjIdj, TSK_VS_TYPE_LVM, pool_info->img_offset, (uint64_t)pool_info->block_size); @@ -351,15 +351,11 @@ TskAutoDbJava::addPoolVolumeInfo(const TSK_POOL_VOLUME_INFO* pool_vol, // here we add pool vol into available vs_part fields + // some fields were not directly compatible and were not added TSK_DB_VS_PART_INFO vol_info_db; vol_info_db.objId = objId; ///< set to 0 if unknown (before it becomes a db object) - // pool_vol_info_db.tag = ; ///< Set to TSK_POOL_VOLUME_INFO_TAG when struct is alloc - // vol_info_db. = pool_vol->index; ///< Index of Volume snprintf(vol_info_db.desc, TSK_MAX_DB_VS_PART_INFO_DESC_LEN - 1, "%s", pool_vol->desc); ///< Description - //pool_vol_info_db.password_hint = ; ///< Password hint for encrypted volumes - vol_info_db.start = pool_vol->block; ///< Starting Block number - //vol_info_db.len = pool_vol->; ///< Number of blocks in the volume - //vol_info_db.flags = pool_vol->flags; //flags are not compatible + vol_info_db.start = pool_vol->block; ///< Starting Block number m_savedVsPartInfo.push_back(vol_info_db); saveObjectInfo(objId, parObjId, TSK_DB_OBJECT_TYPE_VOL); @@ -1239,7 +1235,7 @@ TskAutoDbJava::addUnallocatedPoolBlocksToDb(size_t & numPool) { if (m_poolOffsetToVsId.find(pool_info->img_offset) == m_poolOffsetToVsId.end()) { tsk_error_reset(); tsk_error_set_errno(TSK_ERR_AUTO_DB); - tsk_error_set_errstr("Error addUnallocatedPoolBlocksToDb() - could not find volume system object ID for pool at offset %lld", (long long int)pool_info->img_offset); + tsk_error_set_errstr("Error addUnallocatedPoolBlocksToDb() - could not find volume system object ID for pool at offset %jd", (intptr_t)pool_info->img_offset); return TSK_ERR; } int64_t curPoolVs = m_poolOffsetToVsId[pool_info->img_offset]; @@ -1755,7 +1751,7 @@ TSK_RETVAL_ENUM TskAutoDbJava::addFsInfoUnalloc(const TSK_IMG_INFO* curImgInfo, } //open the fs we have from database - TSK_FS_INFO * fsInfo = tsk_fs_open_img((TSK_IMG_INFO*)curImgInfo, dbFsInfo.imgOffset, dbFsInfo.fType); + TSK_FS_INFO * fsInfo = tsk_fs_open_img((TSK_IMG_INFO*)curImgInfo, dbFsInfo.imgOffset, dbFsInfo.fType); if (fsInfo == NULL) { tsk_error_set_errstr2("TskAutoDbJava::addFsInfoUnalloc: error opening fs at offset %" PRIdOFF, dbFsInfo.imgOffset); tsk_error_set_errno(TSK_ERR_AUTO); @@ -1804,7 +1800,6 @@ TSK_RETVAL_ENUM TskAutoDbJava::addFsInfoUnalloc(const TSK_IMG_INFO* curImgInfo, tsk_error_set_errstr2("addFsInfoUnalloc: error addUnallocBlockFile"); tsk_error_set_errno(TSK_ERR_AUTO); registerError(); - registerError(); tsk_fs_close(fsInfo); return TSK_ERR; } @@ -1827,7 +1822,7 @@ TSK_RETVAL_ENUM TskAutoDbJava::addUnallocSpaceToDb() { size_t numVsP = 0; size_t numFs = 0; size_t numPool = 0; - + TSK_RETVAL_ENUM retFsSpace = addUnallocFsSpaceToDb(numFs); TSK_RETVAL_ENUM retVsSpace = addUnallocVsSpaceToDb(numVsP); TSK_RETVAL_ENUM retPoolSpace = addUnallocatedPoolBlocksToDb(numPool); @@ -1904,12 +1899,12 @@ TSK_RETVAL_ENUM TskAutoDbJava::getVsByFsId(int64_t objId, TSK_DB_VS_INFO & vsDbI * @returns TSK_OK on success, TSK_ERR on error (if some or all fs could not be processed) */ TSK_RETVAL_ENUM TskAutoDbJava::addUnallocFsSpaceToDb(size_t & numFs) { - + if(m_stopAllProcessing) { return TSK_OK; } - numFs = m_savedFsInfo.size(); + numFs = m_savedFsInfo.size(); TSK_RETVAL_ENUM allFsProcessRet = TSK_OK; diff --git a/bindings/java/jni/auto_db_java.h b/bindings/java/jni/auto_db_java.h index e2fb8b1f0f..b64719cf0d 100644 --- a/bindings/java/jni/auto_db_java.h +++ b/bindings/java/jni/auto_db_java.h @@ -161,7 +161,7 @@ class TskAutoDbJava :public TskAuto { jmethodID m_addLayoutFileRangeMethodID = NULL; // Cached objects - vector m_savedFsInfo; + vector m_savedFsInfo; vector m_savedVsInfo; vector m_savedVsPartInfo; vector m_savedObjects; From bd79d4e51720b174fb891d2e48a708bc821eb193 Mon Sep 17 00:00:00 2001 From: Aristeu Jr Date: Tue, 27 Jun 2023 16:00:18 -0300 Subject: [PATCH 0030/1548] unalloc on FS without VS and error msgs adjustment --- bindings/java/jni/auto_db_java.cpp | 42 ++++++++++++++---------------- tsk/auto/auto_db.cpp | 37 ++++++++++++-------------- 2 files changed, 37 insertions(+), 42 deletions(-) diff --git a/bindings/java/jni/auto_db_java.cpp b/bindings/java/jni/auto_db_java.cpp index 43a07bfb08..9d5ed51b78 100644 --- a/bindings/java/jni/auto_db_java.cpp +++ b/bindings/java/jni/auto_db_java.cpp @@ -1869,26 +1869,25 @@ TSK_RETVAL_ENUM TskAutoDbJava::getVsByFsId(int64_t objId, TSK_DB_VS_INFO & vsDbI vsDbInfo.vstype = curVsDbInfo->vstype; vsDbInfo.offset = curVsDbInfo->offset; return TSK_OK; - } + } + } + if (tsk_verbose) { + tsk_fprintf(stderr, "TskAutoDb:: GetVsByFsId: error getting VS from FS. (Parent VS not Found)"); } - tsk_error_set_errstr("TskAutoDbJava:: GetVsByFsId: error getting VS from FS. (Parent VS not Found)."); - tsk_error_set_errno(TSK_ERR_AUTO); - registerError(); return TSK_ERR; } } } - tsk_error_set_errstr("TskAutoDbJava:: GetVsByFsId: error getting VS from FS (Parent VS Part not found)."); - tsk_error_set_errstr2("cache size: %" PRIdOFF, m_savedVsPartInfo.size()); - tsk_error_set_errno(TSK_ERR_AUTO); - registerError(); + if (tsk_verbose) { + tsk_fprintf(stderr, "TskAutoDb:: GetVsByFsId: error getting VS from FS (Parent VS_Part not found)"); + } return TSK_ERR; } else { - tsk_error_set_errstr("TskAutoDbJava:: GetVsByFsId: error getting VS from FS (FS object not found)."); - tsk_error_set_errno(TSK_ERR_AUTO); - registerError(); - return TSK_ERR; + if (tsk_verbose) { + tsk_fprintf(stderr, "TskAutoDb:: GetVsByFsId: error getting VS from FS (FS object not found)\n"); + } + return TSK_ERR; } } @@ -1911,17 +1910,16 @@ TSK_RETVAL_ENUM TskAutoDbJava::addUnallocFsSpaceToDb(size_t & numFs) { for (vector::iterator curFsDbInfo = m_savedFsInfo.begin(); curFsDbInfo!= m_savedFsInfo.end(); ++curFsDbInfo) { if (m_stopAllProcessing) break; - // finds VS related to the FS TSK_DB_VS_INFO curVsDbInfo; if(getVsByFsId(curFsDbInfo->objId, curVsDbInfo) == TSK_ERR){ - tsk_error_set_errstr2( - "TskAutoDbJava::addUnallocFsSpaceToDb: error getting VS from FS." - ); - tsk_error_set_errno(TSK_ERR_AUTO); - registerError(); - //allFsProcessRet = TSK_STOP; - return TSK_ERR; + // FS is not inside a VS + if (tsk_verbose) { + tsk_fprintf(stderr, "TskAutoDbJava::addUnallocFsSpaceToDb: FS not inside a VS, adding the unnalocated space\n"); + } + TSK_RETVAL_ENUM retval = addFsInfoUnalloc(m_img_info, *curFsDbInfo); + if (retval == TSK_ERR) + allFsProcessRet = TSK_ERR; } else { if ((curVsDbInfo.vstype == TSK_VS_TYPE_APFS)||(curVsDbInfo.vstype == TSK_VS_TYPE_LVM)){ @@ -2014,7 +2012,7 @@ TSK_RETVAL_ENUM TskAutoDbJava::addUnallocFsSpaceToDb(size_t & numFs) { const auto pool = tsk_pool_open_img_sing(m_img_info, curVsDbInfo.offset, TSK_POOL_TYPE_LVM); if (pool == nullptr) { tsk_error_set_errstr2( - "findFilesInPool: Error opening pool"); + "TskAutoDbJava::addUnallocFsSpaceToDb: Error opening pool"); registerError(); allFsProcessRet = TSK_ERR; } @@ -2036,7 +2034,7 @@ TSK_RETVAL_ENUM TskAutoDbJava::addUnallocFsSpaceToDb(size_t & numFs) { tsk_img_close(pool_vol_img); tsk_pool_close(pool); tsk_error_set_errstr2( - "findFilesInPool: Unable to open file system in LVM logical volume: %" PRIdOFF "", + "TskAutoDbJava::addUnallocFsSpaceToDb: Unable to open file system in LVM logical volume: %" PRIdOFF "", curFsDbInfo->imgOffset); tsk_error_set_errno(TSK_ERR_FS); registerError(); diff --git a/tsk/auto/auto_db.cpp b/tsk/auto/auto_db.cpp index d92c1ae884..82b9b792a3 100755 --- a/tsk/auto/auto_db.cpp +++ b/tsk/auto/auto_db.cpp @@ -1277,26 +1277,23 @@ TSK_RETVAL_ENUM TskAutoDb::getVsByFsId(int64_t objId, TSK_DB_VS_INFO & vsDbInfo) return TSK_OK; } } - tsk_error_set_errstr("TskAutoDb:: GetVsByFsId: error getting VS from FS. (Parent VS not Found)"); - tsk_error_set_errstr2("cache size: %" PRIdOFF, m_savedVsInfo.size()); - tsk_error_set_errno(TSK_ERR_AUTO); - registerError(); + if (tsk_verbose) { + tsk_fprintf(stderr, "TskAutoDb:: GetVsByFsId: error getting VS from FS. (Parent VS not Found)"); + } return TSK_ERR; } } } - tsk_error_set_errstr("TskAutoDb:: GetVsByFsId: error getting VS from FS (Parent VS_Part not found) cache size: %" - PRIdOFF, m_savedVsPartInfo.size() ); - tsk_error_set_errstr2("FS ParentObjId: %" PRIdOFF, fsObjDbInfo.parObjId); - tsk_error_set_errno(TSK_ERR_AUTO); - registerError(); + if (tsk_verbose) { + tsk_fprintf(stderr, "TskAutoDb:: GetVsByFsId: error getting VS from FS (Parent VS_Part not found)"); + } return TSK_ERR; } else { - tsk_error_set_errstr("TskAutoDb:: GetVsByFsId: error getting VS from FS (FS object not found)"); - tsk_error_set_errno(TSK_ERR_AUTO); - registerError(); - return TSK_ERR; + if (tsk_verbose) { + tsk_fprintf(stderr, "TskAutoDb:: GetVsByFsId: error getting VS from FS (FS object not found)\n"); + } + return TSK_ERR; } } @@ -1323,13 +1320,13 @@ TSK_RETVAL_ENUM TskAutoDb::addUnallocFsSpaceToDb(size_t & numFs) { // finds VS related to the FS TSK_DB_VS_INFO curVsDbInfo; if(getVsByFsId(curFsDbInfo->objId, curVsDbInfo) == TSK_ERR){ - tsk_error_set_errstr2( - "TskAutoDb::addUnallocFsSpaceToDb: error getting VS from FS." - ); - tsk_error_set_errno(TSK_ERR_AUTO); - registerError(); - //allFsProcessRet = TSK_STOP; - return TSK_ERR; + // FS is not inside a VS + if (tsk_verbose) { + tsk_fprintf(stderr, "TskAutoDbJava::addUnallocFsSpaceToDb: FS not inside a VS, adding the unnalocated space\n"); + } + TSK_RETVAL_ENUM retval = addFsInfoUnalloc(m_img_info, *curFsDbInfo); + if (retval == TSK_ERR) + allFsProcessRet = TSK_ERR; } else { if ((curVsDbInfo.vstype == TSK_VS_TYPE_APFS)||(curVsDbInfo.vstype == TSK_VS_TYPE_LVM)){ From 5e1a57677ee411b07824472e5d7b705105cb6b54 Mon Sep 17 00:00:00 2001 From: Aristeu Jr Date: Tue, 27 Jun 2023 16:39:43 -0300 Subject: [PATCH 0031/1548] lvm adjustment for offset correct usage --- tsk/pool/lvm_pool_compat.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tsk/pool/lvm_pool_compat.cpp b/tsk/pool/lvm_pool_compat.cpp index bbe71bdc82..7e80818381 100644 --- a/tsk/pool/lvm_pool_compat.cpp +++ b/tsk/pool/lvm_pool_compat.cpp @@ -145,8 +145,9 @@ lvm_logical_volume_img_read(TSK_IMG_INFO * img_info, TSK_OFF_T offset, char *buf IMG_POOL_INFO *pool_img_info = (IMG_POOL_INFO *)img_info; libvslvm_error_t *vslvm_error = NULL; - // correct the offset to be relative to the start of the logical volume - offset -= pool_img_info->pool_info->img_offset; + // Commented: offset is already relative (0) to the img_info, that is relative to the volume + //// correct the offset to be relative to the start of the logical volume + //offset -= pool_img_info->pool_info->img_offset; if (tsk_verbose) { tsk_fprintf(stderr, "lvm_logical_volume_img_read: offset: %" PRIdOFF " read len: %" PRIuSIZE ".\n", From 9f5a59828af220f62d8f828560acba22e18798a0 Mon Sep 17 00:00:00 2001 From: Aristeu Jr Date: Wed, 28 Jun 2023 09:23:12 -0300 Subject: [PATCH 0032/1548] offset adjustments --- bindings/java/jni/auto_db_java.cpp | 12 +++++++++--- tsk/auto/auto_db.cpp | 23 ++++++++++++++--------- 2 files changed, 23 insertions(+), 12 deletions(-) diff --git a/bindings/java/jni/auto_db_java.cpp b/bindings/java/jni/auto_db_java.cpp index 9d5ed51b78..5d9491f8e7 100644 --- a/bindings/java/jni/auto_db_java.cpp +++ b/bindings/java/jni/auto_db_java.cpp @@ -2029,21 +2029,27 @@ TSK_RETVAL_ENUM TskAutoDbJava::addUnallocFsSpaceToDb(size_t & numFs) { allFsProcessRet = TSK_ERR; } else { - TSK_FS_INFO *fs_info = tsk_fs_open_img(pool_vol_img, curFsDbInfo->imgOffset, curFsDbInfo->fType); + TSK_FS_INFO *fs_info = tsk_fs_open_img(pool_vol_img, 0, curFsDbInfo->fType); if (fs_info == NULL) { tsk_img_close(pool_vol_img); tsk_pool_close(pool); tsk_error_set_errstr2( "TskAutoDbJava::addUnallocFsSpaceToDb: Unable to open file system in LVM logical volume: %" PRIdOFF "", - curFsDbInfo->imgOffset); + curVsPartInfo.start); tsk_error_set_errno(TSK_ERR_FS); registerError(); allFsProcessRet = TSK_ERR; } else { TSK_RETVAL_ENUM retval = addFsInfoUnalloc(pool_vol_img, *curFsDbInfo); - if (retval == TSK_ERR) + if (retval == TSK_ERR){ + tsk_error_set_errstr2( + "TskAutoDb::addUnallocFsSpaceToDb: Error getting unallocated space"); + tsk_error_set_errno(TSK_ERR_FS); + registerError(); allFsProcessRet = TSK_ERR; + } + tsk_fs_close(fs_info); tsk_img_close(pool_vol_img); diff --git a/tsk/auto/auto_db.cpp b/tsk/auto/auto_db.cpp index 82b9b792a3..9d514061d7 100755 --- a/tsk/auto/auto_db.cpp +++ b/tsk/auto/auto_db.cpp @@ -1275,7 +1275,7 @@ TSK_RETVAL_ENUM TskAutoDb::getVsByFsId(int64_t objId, TSK_DB_VS_INFO & vsDbInfo) vsDbInfo.vstype = curVsDbInfo->vstype; vsDbInfo.offset = curVsDbInfo->offset; return TSK_OK; - } + } } if (tsk_verbose) { tsk_fprintf(stderr, "TskAutoDb:: GetVsByFsId: error getting VS from FS. (Parent VS not Found)"); @@ -1425,8 +1425,8 @@ TSK_RETVAL_ENUM TskAutoDb::addUnallocFsSpaceToDb(size_t & numFs) { } - TSK_IMG_INFO *pool_img = pool->get_img_info(pool, curVsPartInfo.start); - if (pool_img == NULL) { + TSK_IMG_INFO *pool_vol_img = pool->get_img_info(pool, curVsPartInfo.start); + if (pool_vol_img == NULL) { tsk_pool_close(pool); tsk_error_set_errstr2( "TskAutoDb::addUnallocFsSpaceToDb: Error opening LVM logical volume: %" PRIdOFF "", @@ -1436,24 +1436,29 @@ TSK_RETVAL_ENUM TskAutoDb::addUnallocFsSpaceToDb(size_t & numFs) { allFsProcessRet = TSK_ERR; } else { - TSK_FS_INFO *fs_info = tsk_fs_open_img(pool_img, curFsDbInfo->imgOffset, curFsDbInfo->fType); + TSK_FS_INFO *fs_info = tsk_fs_open_img(pool_vol_img, 0, curFsDbInfo->fType); if (fs_info == NULL) { - tsk_img_close(pool_img); + tsk_img_close(pool_vol_img); tsk_pool_close(pool); tsk_error_set_errstr2( "findFilesInPool: Unable to open file system in LVM logical volume: %" PRIdOFF "", - curFsDbInfo->imgOffset); + curVsPartInfo.start); tsk_error_set_errno(TSK_ERR_FS); registerError(); allFsProcessRet = TSK_ERR; } else { - TSK_RETVAL_ENUM retval = addFsInfoUnalloc(pool_img, *curFsDbInfo); - if (retval == TSK_ERR) + TSK_RETVAL_ENUM retval = addFsInfoUnalloc(pool_vol_img, *curFsDbInfo); + if (retval == TSK_ERR){ + tsk_error_set_errstr2( + "TskAutoDb::addUnallocFsSpaceToDb: Error getting unallocated space"); + tsk_error_set_errno(TSK_ERR_FS); + registerError(); allFsProcessRet = TSK_ERR; + } tsk_fs_close(fs_info); - tsk_img_close(pool_img); + tsk_img_close(pool_vol_img); if (retval == TSK_STOP) { tsk_pool_close(pool); From 26d2d3959cb1687ce11692bc1114758897348338 Mon Sep 17 00:00:00 2001 From: Aristeu Jr Date: Fri, 30 Jun 2023 09:49:14 -0300 Subject: [PATCH 0033/1548] relative lvm offset on fstools and code cleaning --- tools/fstools/blkcalc.cpp | 8 +++++++- tools/fstools/blkcat.cpp | 12 +++++++++--- tools/fstools/blkls.cpp | 18 +++++++++++++++--- tools/fstools/blkstat.cpp | 12 +++++++++--- tools/fstools/fcat.cpp | 14 ++++++++++---- tools/fstools/ffind.cpp | 14 ++++++++++---- tools/fstools/fls.cpp | 16 ++++++++++++++-- tools/fstools/fsstat.cpp | 8 +++++++- tools/fstools/icat.cpp | 10 ++++++++-- tools/fstools/ifind.cpp | 10 ++++++++-- tools/fstools/ils.cpp | 18 ++++++++++++------ tools/fstools/istat.cpp | 10 ++++++++-- tsk/pool/lvm_pool_compat.cpp | 5 +---- 13 files changed, 118 insertions(+), 37 deletions(-) diff --git a/tools/fstools/blkcalc.cpp b/tools/fstools/blkcalc.cpp index 6d345c1a1d..bab5b0b621 100644 --- a/tools/fstools/blkcalc.cpp +++ b/tools/fstools/blkcalc.cpp @@ -262,8 +262,14 @@ main(int argc, char **argv1) exit(1); } + TSK_OFF_T offset = imgaddr * img->sector_size; +#if HAVE_LIBVSLVM + if (pool->ctype == TSK_POOL_TYPE_LVM){ + offset = 0; + } +#endif /* HAVE_LIBVSLVM */ img = pool->get_img_info(pool, (TSK_DADDR_T)pvol_block); - if ((fs = tsk_fs_open_img_decrypt(img, imgaddr * img->sector_size, fstype, password)) == NULL) { + if ((fs = tsk_fs_open_img_decrypt(img, offset, fstype, password)) == NULL){ tsk_error_print(stderr); if (tsk_error_get_errno() == TSK_ERR_FS_UNSUPTYPE) tsk_fs_type_print(stderr); diff --git a/tools/fstools/blkcat.cpp b/tools/fstools/blkcat.cpp index 886556e0ee..9084de3f1c 100644 --- a/tools/fstools/blkcat.cpp +++ b/tools/fstools/blkcat.cpp @@ -1,10 +1,10 @@ /* ** blkcat -** The Sleuth Kit +** The Sleuth Kit ** ** Given an image , block number, and size, display the contents ** of the block to stdout. -** +** ** Brian Carrier [carrier sleuthkit [dot] org] ** Copyright (c) 2006-2011 Brian Carrier, Basis Technology. All Rights reserved ** Copyright (c) 2003-2005 Brian Carrier. All rights reserved @@ -323,8 +323,14 @@ main(int argc, char **argv1) exit(1); } + TSK_OFF_T offset = imgaddr * img->sector_size; +#if HAVE_LIBVSLVM + if (pool->ctype == TSK_POOL_TYPE_LVM){ + offset = 0; + } +#endif /* HAVE_LIBVSLVM */ img = pool->get_img_info(pool, (TSK_DADDR_T)pvol_block); - if ((fs = tsk_fs_open_img_decrypt(img, imgaddr * img->sector_size, fstype, password)) == NULL) { + if ((fs = tsk_fs_open_img_decrypt(img, offset, fstype, password)) == NULL) { tsk_error_print(stderr); if (tsk_error_get_errno() == TSK_ERR_FS_UNSUPTYPE) tsk_fs_type_print(stderr); diff --git a/tools/fstools/blkls.cpp b/tools/fstools/blkls.cpp index 2b628d0d29..8f1c528165 100644 --- a/tools/fstools/blkls.cpp +++ b/tools/fstools/blkls.cpp @@ -3,7 +3,7 @@ ** ** Brian Carrier [carrier sleuthkit [dot] org] ** Copyright (c) 2006-2011 Brian Carrier, Basis Technology. All Rights reserved -** Copyright (c) 2003-2005 Brian Carrier. All rights reserved +** Copyright (c) 2003-2005 Brian Carrier. All rights reserved ** ** TASK ** Copyright (c) 2002 Brian Carrier, @stake Inc. All rights reserved @@ -248,8 +248,14 @@ main(int argc, char **argv1) exit(1); } + TSK_OFF_T offset = imgaddr * img->sector_size; +#if HAVE_LIBVSLVM + if (pool->ctype == TSK_POOL_TYPE_LVM){ + offset = 0; + } +#endif /* HAVE_LIBVSLVM */ img = pool->get_img_info(pool, (TSK_DADDR_T)pvol_block); - if ((fs = tsk_fs_open_img_decrypt(img, imgaddr * img->sector_size, fstype, password)) == NULL) { + if ((fs = tsk_fs_open_img_decrypt(img, offset, fstype, password)) == NULL) { tsk_error_print(stderr); if (tsk_error_get_errno() == TSK_ERR_FS_UNSUPTYPE) tsk_fs_type_print(stderr); @@ -364,8 +370,14 @@ main(int argc, char **argv1) exit(1); } + TSK_OFF_T offset = imgaddr * img->sector_size; +#if HAVE_LIBVSLVM + if (pool->ctype == TSK_POOL_TYPE_LVM){ + offset = 0; + } +#endif /* HAVE_LIBVSLVM */ img = pool->get_img_info(pool, (TSK_DADDR_T)pvol_block); - if ((fs = tsk_fs_open_img_decrypt(img, imgaddr * img->sector_size, fstype, password)) == NULL) { + if ((fs = tsk_fs_open_img_decrypt(img, offset, fstype, password)) == NULL) { tsk_error_print(stderr); if (tsk_error_get_errno() == TSK_ERR_FS_UNSUPTYPE) tsk_fs_type_print(stderr); diff --git a/tools/fstools/blkstat.cpp b/tools/fstools/blkstat.cpp index 743dc68977..a4cb9b5723 100644 --- a/tools/fstools/blkstat.cpp +++ b/tools/fstools/blkstat.cpp @@ -1,12 +1,12 @@ /* ** blkstat -** The Sleuth Kit +** The Sleuth Kit ** ** Get the details about a data unit ** ** Brian Carrier [carrier sleuthkit [dot] org] ** Copyright (c) 2006-2011 Brian Carrier, Basis Technology. All Rights reserved -** Copyright (c) 2003-2005 Brian Carrier. All rights reserved +** Copyright (c) 2003-2005 Brian Carrier. All rights reserved ** ** TASK ** Copyright (c) 2002 Brian Carrier, @stake Inc. All rights reserved @@ -200,8 +200,14 @@ main(int argc, char **argv1) exit(1); } + TSK_OFF_T offset = imgaddr * img->sector_size; +#if HAVE_LIBVSLVM + if (pool->ctype == TSK_POOL_TYPE_LVM){ + offset = 0; + } +#endif /* HAVE_LIBVSLVM */ img = pool->get_img_info(pool, (TSK_DADDR_T)pvol_block); - if ((fs = tsk_fs_open_img_decrypt(img, imgaddr * img->sector_size, fstype, password)) == NULL) { + if ((fs = tsk_fs_open_img_decrypt(img, offset, fstype, password)) == NULL) { tsk_error_print(stderr); if (tsk_error_get_errno() == TSK_ERR_FS_UNSUPTYPE) tsk_fs_type_print(stderr); diff --git a/tools/fstools/fcat.cpp b/tools/fstools/fcat.cpp index 05e62e899d..1f6ce03044 100644 --- a/tools/fstools/fcat.cpp +++ b/tools/fstools/fcat.cpp @@ -1,6 +1,6 @@ /* -** fcat -** The Sleuth Kit +** fcat +** The Sleuth Kit ** ** Brian Carrier [carrier sleuthkit [dot] org] ** Copyright (c) 2012 Brian Carrier, Basis Technology. All Rights reserved @@ -214,8 +214,14 @@ main(int argc, char **argv1) exit(1); } + TSK_OFF_T offset = imgaddr * img->sector_size; +#if HAVE_LIBVSLVM + if (pool->ctype == TSK_POOL_TYPE_LVM){ + offset = 0; + } +#endif /* HAVE_LIBVSLVM */ img = pool->get_img_info(pool, (TSK_DADDR_T)pvol_block); - if ((fs = tsk_fs_open_img_decrypt(img, imgaddr * img->sector_size, fstype, password)) == NULL) { + if ((fs = tsk_fs_open_img_decrypt(img, offset, fstype, password)) == NULL) { tsk_error_print(stderr); if (tsk_error_get_errno() == TSK_ERR_FS_UNSUPTYPE) tsk_fs_type_print(stderr); @@ -239,7 +245,7 @@ main(int argc, char **argv1) free(path); exit(1); } - free(path); + free(path); // @@@ Cannot currently get ADS with this approach retval = diff --git a/tools/fstools/ffind.cpp b/tools/fstools/ffind.cpp index a129da8af4..fdbb424c76 100644 --- a/tools/fstools/ffind.cpp +++ b/tools/fstools/ffind.cpp @@ -1,12 +1,12 @@ /* ** ffind (file find) -** The Sleuth Kit +** The Sleuth Kit ** ** Find the file that uses the specified inode (including deleted files) -** +** ** Brian Carrier [carrier sleuthkit [dot] org] ** Copyright (c) 2006-2011 Brian Carrier, Basis Technology. All Rights reserved -** Copyright (c) 2003-2005 Brian Carrier. All rights reserved +** Copyright (c) 2003-2005 Brian Carrier. All rights reserved ** ** TASK ** Copyright (c) 2002 Brian Carrier, @stake Inc. All rights reserved @@ -231,8 +231,14 @@ main(int argc, char **argv1) exit(1); } + TSK_OFF_T offset = imgaddr * img->sector_size; +#if HAVE_LIBVSLVM + if (pool->ctype == TSK_POOL_TYPE_LVM){ + offset = 0; + } +#endif /* HAVE_LIBVSLVM */ img = pool->get_img_info(pool, (TSK_DADDR_T)pvol_block); - if ((fs = tsk_fs_open_img_decrypt(img, imgaddr * img->sector_size, fstype, password)) == NULL) { + if ((fs = tsk_fs_open_img_decrypt(img, offset, fstype, password)) == NULL) { tsk_error_print(stderr); if (tsk_error_get_errno() == TSK_ERR_FS_UNSUPTYPE) tsk_fs_type_print(stderr); diff --git a/tools/fstools/fls.cpp b/tools/fstools/fls.cpp index 94ff76d784..729b540c5f 100644 --- a/tools/fstools/fls.cpp +++ b/tools/fstools/fls.cpp @@ -334,8 +334,14 @@ main(int argc, char **argv1) } img_parent = img; + TSK_OFF_T offset = imgaddr * img->sector_size; +#if HAVE_LIBVSLVM + if (pool->ctype == TSK_POOL_TYPE_LVM){ + offset = 0; + } +#endif /* HAVE_LIBVSLVM */ img = pool->get_img_info(pool, (TSK_DADDR_T)pvol_block); - if ((fs = tsk_fs_open_img_decrypt(img, imgaddr * img->sector_size, fstype, password)) == NULL) { + if ((fs = tsk_fs_open_img_decrypt(img, offset, fstype, password)) == NULL) { tsk_error_print(stderr); if (tsk_error_get_errno() == TSK_ERR_FS_UNSUPTYPE) tsk_fs_type_print(stderr); @@ -390,8 +396,14 @@ main(int argc, char **argv1) } img_parent = img; + TSK_OFF_T offset = imgaddr * img->sector_size; +#if HAVE_LIBVSLVM + if (pool->ctype == TSK_POOL_TYPE_LVM){ + offset = 0; + } +#endif /* HAVE_LIBVSLVM */ img = pool->get_img_info(pool, (TSK_DADDR_T)pvol_block); - if ((fs = tsk_fs_open_img_decrypt(img, imgaddr * img->sector_size, fstype, password)) == NULL) { + if ((fs = tsk_fs_open_img_decrypt(img, offset, fstype, password)) == NULL) { tsk_error_print(stderr); if (tsk_error_get_errno() == TSK_ERR_FS_UNSUPTYPE) tsk_fs_type_print(stderr); diff --git a/tools/fstools/fsstat.cpp b/tools/fstools/fsstat.cpp index ee802e4fb5..be763a6457 100644 --- a/tools/fstools/fsstat.cpp +++ b/tools/fstools/fsstat.cpp @@ -210,8 +210,14 @@ main(int argc, char **argv1) exit(1); } + TSK_OFF_T offset = imgaddr * img->sector_size; +#if HAVE_LIBVSLVM + if (pool->ctype == TSK_POOL_TYPE_LVM){ + offset = 0; + } +#endif /* HAVE_LIBVSLVM */ img = pool->get_img_info(pool, (TSK_DADDR_T)pvol_block); - if ((fs = tsk_fs_open_img_decrypt(img, imgaddr * img->sector_size, fstype, password)) == NULL) { + if ((fs = tsk_fs_open_img_decrypt(img, offset, fstype, password)) == NULL) { tsk_error_print(stderr); if (tsk_error_get_errno() == TSK_ERR_FS_UNSUPTYPE) tsk_fs_type_print(stderr); diff --git a/tools/fstools/icat.cpp b/tools/fstools/icat.cpp index 0e6b1cee3f..a0add75fa6 100644 --- a/tools/fstools/icat.cpp +++ b/tools/fstools/icat.cpp @@ -231,7 +231,7 @@ main(int argc, char **argv1) } if (pvol_block == 0) { - if ((fs = tsk_fs_open_img_decrypt(img, imgaddr * img->sector_size, + if ((fs = tsk_fs_open_img_decrypt(img, imgaddr * img->sector_size, fstype, password)) == NULL) { tsk_error_print(stderr); if (tsk_error_get_errno() == TSK_ERR_FS_UNSUPTYPE) @@ -249,8 +249,14 @@ main(int argc, char **argv1) exit(1); } + TSK_OFF_T offset = imgaddr * img->sector_size; +#if HAVE_LIBVSLVM + if (pool->ctype == TSK_POOL_TYPE_LVM){ + offset = 0; + } +#endif /* HAVE_LIBVSLVM */ img = pool->get_img_info(pool, (TSK_DADDR_T)pvol_block); - if ((fs = tsk_fs_open_img_decrypt(img, imgaddr * img->sector_size, fstype, password)) == NULL) { + if ((fs = tsk_fs_open_img_decrypt(img, offset, fstype, password)) == NULL) { tsk_error_print(stderr); if (tsk_error_get_errno() == TSK_ERR_FS_UNSUPTYPE) tsk_fs_type_print(stderr); diff --git a/tools/fstools/ifind.cpp b/tools/fstools/ifind.cpp index 81c76396f1..8eb39d9927 100644 --- a/tools/fstools/ifind.cpp +++ b/tools/fstools/ifind.cpp @@ -3,7 +3,7 @@ ** The Sleuth Kit ** ** Given an image and block number, identify which inode it is used by -** +** ** Brian Carrier [carrier sleuthkit [dot] org] ** Copyright (c) 2006-2011 Brian Carrier, Basis Technology. All Rights reserved ** Copyright (c) 2003-2005 Brian Carrier. All rights reserved @@ -291,8 +291,14 @@ main(int argc, char **argv1) exit(1); } + TSK_OFF_T offset = imgaddr * img->sector_size; +#if HAVE_LIBVSLVM + if (pool->ctype == TSK_POOL_TYPE_LVM){ + offset = 0; + } +#endif /* HAVE_LIBVSLVM */ img = pool->get_img_info(pool, (TSK_DADDR_T)pvol_block); - if ((fs = tsk_fs_open_img_decrypt(img, imgaddr * img->sector_size, fstype, password)) == NULL) { + if ((fs = tsk_fs_open_img_decrypt(img, offset, fstype, password)) == NULL) { tsk_error_print(stderr); if (tsk_error_get_errno() == TSK_ERR_FS_UNSUPTYPE) tsk_fs_type_print(stderr); diff --git a/tools/fstools/ils.cpp b/tools/fstools/ils.cpp index 4277154268..93f2936bf4 100644 --- a/tools/fstools/ils.cpp +++ b/tools/fstools/ils.cpp @@ -1,14 +1,14 @@ /* -** The Sleuth Kit +** The Sleuth Kit ** ** Brian Carrier [carrier sleuthkit [dot] org] ** Copyright (c) 2006-2011 Brian Carrier, Basis Technology. All Rights reserved -** Copyright (c) 2003-2005 Brian Carrier. All rights reserved +** Copyright (c) 2003-2005 Brian Carrier. All rights reserved ** ** TASK ** Copyright (c) 2002 Brian Carrier, @stake Inc. All rights reserved -** -** Copyright (c) 1997,1998,1999, International Business Machines +** +** Copyright (c) 1997,1998,1999, International Business Machines ** Corporation and others. All Rights Reserved. */ @@ -57,7 +57,7 @@ usage() tsk_fprintf(stderr, "\t-f fstype: File system type (use '-f list' for supported types)\n"); tsk_fprintf(stderr, - "\t-o imgoffset: The offset of the file system in the image (in sectors)\n"); + "\t-o imgoffset: The offset of the file system in the image (in sectors)\n"); tsk_fprintf(stderr, "\t-P pooltype: Pool container type (use '-p list' for supported types)\n"); tsk_fprintf(stderr, @@ -367,8 +367,14 @@ main(int argc, char **argv1) exit(1); } + TSK_OFF_T offset = imgaddr * img->sector_size; +#if HAVE_LIBVSLVM + if (pool->ctype == TSK_POOL_TYPE_LVM){ + offset = 0; + } +#endif /* HAVE_LIBVSLVM */ img = pool->get_img_info(pool, (TSK_DADDR_T)pvol_block); - if ((fs = tsk_fs_open_img_decrypt(img, imgaddr * img->sector_size, fstype, password)) == NULL) { + if ((fs = tsk_fs_open_img_decrypt(img, offset, fstype, password)) == NULL) { tsk_error_print(stderr); if (tsk_error_get_errno() == TSK_ERR_FS_UNSUPTYPE) tsk_fs_type_print(stderr); diff --git a/tools/fstools/istat.cpp b/tools/fstools/istat.cpp index 5a9de5c97d..b10ba2366b 100644 --- a/tools/fstools/istat.cpp +++ b/tools/fstools/istat.cpp @@ -250,7 +250,7 @@ main(int argc, char **argv1) } if (pvol_block == 0) { - if ((fs = tsk_fs_open_img_decrypt(img, imgaddr * img->sector_size, + if ((fs = tsk_fs_open_img_decrypt(img, imgaddr * img->sector_size, fstype, password)) == NULL) { tsk_error_print(stderr); if (tsk_error_get_errno() == TSK_ERR_FS_UNSUPTYPE) @@ -268,8 +268,14 @@ main(int argc, char **argv1) exit(1); } + TSK_OFF_T offset = imgaddr * img->sector_size; +#if HAVE_LIBVSLVM + if (pool->ctype == TSK_POOL_TYPE_LVM){ + offset = 0; + } +#endif /* HAVE_LIBVSLVM */ img = pool->get_img_info(pool, (TSK_DADDR_T)pvol_block); - if ((fs = tsk_fs_open_img_decrypt(img, imgaddr * img->sector_size, fstype, password)) == NULL) { + if ((fs = tsk_fs_open_img_decrypt(img, offset, fstype, password)) == NULL) { tsk_error_print(stderr); if (tsk_error_get_errno() == TSK_ERR_FS_UNSUPTYPE) tsk_fs_type_print(stderr); diff --git a/tsk/pool/lvm_pool_compat.cpp b/tsk/pool/lvm_pool_compat.cpp index 7e80818381..c1937895fb 100644 --- a/tsk/pool/lvm_pool_compat.cpp +++ b/tsk/pool/lvm_pool_compat.cpp @@ -18,7 +18,7 @@ #include /** - * Get error string from libvslvm and make buffer empty if that didn't work. + * Get error string from libvslvm and make buffer empty if that didn't work. * @returns 1 if error message was not set */ static uint8_t getError(libvslvm_error_t *vslvm_error, char error_string[512]) @@ -145,9 +145,6 @@ lvm_logical_volume_img_read(TSK_IMG_INFO * img_info, TSK_OFF_T offset, char *buf IMG_POOL_INFO *pool_img_info = (IMG_POOL_INFO *)img_info; libvslvm_error_t *vslvm_error = NULL; - // Commented: offset is already relative (0) to the img_info, that is relative to the volume - //// correct the offset to be relative to the start of the logical volume - //offset -= pool_img_info->pool_info->img_offset; if (tsk_verbose) { tsk_fprintf(stderr, "lvm_logical_volume_img_read: offset: %" PRIdOFF " read len: %" PRIuSIZE ".\n", From f83d94d172faa17ebd15033be13f0eb6474d6094 Mon Sep 17 00:00:00 2001 From: sweesiahh <42726212+sweesiahh@users.noreply.github.com> Date: Fri, 22 Mar 2024 19:48:24 +0800 Subject: [PATCH 0034/1548] Update ntfs.c handle large ntfs allocation size --- tsk/fs/ntfs.c | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/tsk/fs/ntfs.c b/tsk/fs/ntfs.c index 80ffa865cf..829e08f890 100644 --- a/tsk/fs/ntfs.c +++ b/tsk/fs/ntfs.c @@ -96,7 +96,7 @@ nt2unixtime(uint64_t ntdate) // return 0 if before 1970 if (ntdate < NSEC_BTWN_1601_1970) return 0; - + ntdate -= (uint64_t) NSEC_BTWN_1601_1970; ntdate /= (uint64_t) 10000000; @@ -5314,13 +5314,25 @@ ntfs_open(TSK_IMG_INFO * img_info, TSK_OFF_T offset, goto on_error; } - if ((ntfs->fs->csize != 0x01) && - (ntfs->fs->csize != 0x02) && - (ntfs->fs->csize != 0x04) && - (ntfs->fs->csize != 0x08) && - (ntfs->fs->csize != 0x10) && - (ntfs->fs->csize != 0x20) && (ntfs->fs->csize != 0x40) - && (ntfs->fs->csize != 0x80)) { + uint32_t csize = ntfs->fs->csize; + if (ntfs->fs->csize > 0x80) { + csize = 1 << -(int8_t)ntfs->fs->csize; + } + + if ((csize != 0x01) && + (csize != 0x02) && + (csize != 0x04) && + (csize != 0x08) && + (csize != 0x10) && + (csize != 0x20) && + (csize != 0x40) && + (csize != 0x80) && + (csize != 0x100) && + (csize != 0x200) && + (csize != 0x400) && + (csize != 0x800) && + (csize != 0x1000) + ) { tsk_error_reset(); tsk_error_set_errno(TSK_ERR_FS_MAGIC); tsk_error_set_errstr @@ -5332,14 +5344,14 @@ ntfs_open(TSK_IMG_INFO * img_info, TSK_OFF_T offset, goto on_error; } - ntfs->csize_b = ntfs->fs->csize * ntfs->ssize_b; + ntfs->csize_b = csize * ntfs->ssize_b; fs->first_block = 0; /* This field is defined as 64-bits but according to the * NTFS drivers in Linux, old Windows versions used only 32-bits */ fs->block_count = (TSK_DADDR_T) tsk_getu64(fs->endian, - ntfs->fs->vol_size_s) / ntfs->fs->csize; + ntfs->fs->vol_size_s) / csize; if (fs->block_count == 0) { tsk_error_reset(); tsk_error_set_errno(TSK_ERR_FS_MAGIC); @@ -5532,7 +5544,7 @@ ntfs_open(TSK_IMG_INFO * img_info, TSK_OFF_T offset, "ssize: %" PRIu16 " csize: %d serial: %" PRIx64 "\n", tsk_getu16(fs->endian, ntfs->fs->ssize), - ntfs->fs->csize, tsk_getu64(fs->endian, ntfs->fs->serial)); + csize, tsk_getu64(fs->endian, ntfs->fs->serial)); tsk_fprintf(stderr, "mft_rsize: %d idx_rsize: %d vol: %d mft: %" PRIu64 " mft_mir: %" PRIu64 "\n", From 90514ce0c8093b06b09007c3d5c30f6f0703f49f Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Mon, 2 Aug 2021 15:44:02 +0100 Subject: [PATCH 0035/1548] chmod a-x all of the C/C++ source files and headers. --- samples/posix-cpp-style.cpp | 0 samples/posix-style.cpp | 0 tools/autotools/tsk_recover.cpp | 0 tools/imgtools/img_cat.cpp | 0 tools/logicalimager/LogicalImagerDateRule.cpp | 0 tools/logicalimager/LogicalImagerDateRule.h | 0 tools/logicalimager/LogicalImagerExtensionRule.cpp | 0 tools/logicalimager/LogicalImagerExtensionRule.h | 0 tools/logicalimager/LogicalImagerFilenameRule.cpp | 0 tools/logicalimager/LogicalImagerFilenameRule.h | 0 tools/logicalimager/LogicalImagerPathRule.cpp | 0 tools/logicalimager/LogicalImagerPathRule.h | 0 tools/logicalimager/LogicalImagerRuleBase.cpp | 0 tools/logicalimager/LogicalImagerRuleBase.h | 0 tools/logicalimager/LogicalImagerSizeRule.cpp | 0 tools/logicalimager/LogicalImagerSizeRule.h | 0 tools/logicalimager/RegFileInfo.cpp | 0 tools/logicalimager/RegFileInfo.h | 0 tools/logicalimager/RegHiveType.h | 0 tools/logicalimager/RegKey.cpp | 0 tools/logicalimager/RegKey.h | 0 tools/logicalimager/RegParser.cpp | 0 tools/logicalimager/RegParser.h | 0 tools/logicalimager/RegVal.cpp | 0 tools/logicalimager/RegVal.h | 0 tools/logicalimager/RegistryAnalyzer.cpp | 0 tools/logicalimager/RegistryAnalyzer.h | 0 tools/logicalimager/RegistryLoader.cpp | 0 tools/logicalimager/RegistryLoader.h | 0 tools/logicalimager/TskFindFiles.h | 0 tools/logicalimager/TskHelper.cpp | 0 tools/logicalimager/TskHelper.h | 0 tools/logicalimager/UserAccount.cpp | 0 tools/logicalimager/UserAccount.h | 0 tools/vstools/mmls.cpp | 0 tsk/auto/auto.cpp | 0 tsk/auto/auto_db.cpp | 0 tsk/auto/guid.cpp | 0 tsk/auto/guid.h | 0 tsk/auto/tsk_db.cpp | 0 tsk/auto/tsk_db.h | 0 tsk/auto/tsk_db_sqlite.h | 0 tsk/base/tsk_os.h | 0 tsk/fs/apfs_compat.cpp | 0 tsk/fs/apfs_open.cpp | 0 tsk/fs/dcalc_lib.c | 0 tsk/fs/dcat_lib.c | 0 tsk/fs/dls_lib.c | 0 tsk/fs/exfatfs.c | 0 tsk/fs/exfatfs_dent.c | 0 tsk/fs/exfatfs_meta.c | 0 tsk/fs/ext2fs.c | 0 tsk/fs/fatfs_meta.c | 0 tsk/fs/fatfs_utils.c | 0 tsk/fs/fatxxfs.c | 0 tsk/fs/fatxxfs_dent.c | 0 tsk/fs/fatxxfs_meta.c | 0 tsk/fs/ffs.c | 0 tsk/fs/fs_attr.c | 0 tsk/fs/fs_io.c | 0 tsk/fs/fs_name.c | 0 tsk/fs/ils_lib.c | 0 tsk/fs/iso9660.c | 0 tsk/fs/tsk_apfs.h | 0 tsk/fs/tsk_exfatfs.h | 0 tsk/fs/tsk_fatxxfs.h | 0 tsk/fs/yaffs.cpp | 0 tsk/hashdb/binsrch_index.cpp | 0 tsk/hashdb/encase.c | 0 tsk/hashdb/hashkeeper.c | 0 tsk/hashdb/hdb_base.c | 0 tsk/hashdb/md5sum.c | 0 tsk/hashdb/nsrl.c | 0 tsk/img/aff.c | 0 tsk/img/ewf.cpp | 0 tsk/img/ewf.h | 0 tsk/img/img_io.c | 0 tsk/img/img_writer.cpp | 0 tsk/img/raw.c | 0 tsk/img/tsk_img_i.h | 0 tsk/img/vhd.c | 0 tsk/img/vmdk.c | 0 tsk/pool/apfs_pool.cpp | 0 tsk/pool/apfs_pool_compat.cpp | 0 tsk/pool/pool_open.cpp | 0 tsk/pool/pool_read.cpp | 0 86 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 samples/posix-cpp-style.cpp mode change 100755 => 100644 samples/posix-style.cpp mode change 100755 => 100644 tools/autotools/tsk_recover.cpp mode change 100755 => 100644 tools/imgtools/img_cat.cpp mode change 100755 => 100644 tools/logicalimager/LogicalImagerDateRule.cpp mode change 100755 => 100644 tools/logicalimager/LogicalImagerDateRule.h mode change 100755 => 100644 tools/logicalimager/LogicalImagerExtensionRule.cpp mode change 100755 => 100644 tools/logicalimager/LogicalImagerExtensionRule.h mode change 100755 => 100644 tools/logicalimager/LogicalImagerFilenameRule.cpp mode change 100755 => 100644 tools/logicalimager/LogicalImagerFilenameRule.h mode change 100755 => 100644 tools/logicalimager/LogicalImagerPathRule.cpp mode change 100755 => 100644 tools/logicalimager/LogicalImagerPathRule.h mode change 100755 => 100644 tools/logicalimager/LogicalImagerRuleBase.cpp mode change 100755 => 100644 tools/logicalimager/LogicalImagerRuleBase.h mode change 100755 => 100644 tools/logicalimager/LogicalImagerSizeRule.cpp mode change 100755 => 100644 tools/logicalimager/LogicalImagerSizeRule.h mode change 100755 => 100644 tools/logicalimager/RegFileInfo.cpp mode change 100755 => 100644 tools/logicalimager/RegFileInfo.h mode change 100755 => 100644 tools/logicalimager/RegHiveType.h mode change 100755 => 100644 tools/logicalimager/RegKey.cpp mode change 100755 => 100644 tools/logicalimager/RegKey.h mode change 100755 => 100644 tools/logicalimager/RegParser.cpp mode change 100755 => 100644 tools/logicalimager/RegParser.h mode change 100755 => 100644 tools/logicalimager/RegVal.cpp mode change 100755 => 100644 tools/logicalimager/RegVal.h mode change 100755 => 100644 tools/logicalimager/RegistryAnalyzer.cpp mode change 100755 => 100644 tools/logicalimager/RegistryAnalyzer.h mode change 100755 => 100644 tools/logicalimager/RegistryLoader.cpp mode change 100755 => 100644 tools/logicalimager/RegistryLoader.h mode change 100755 => 100644 tools/logicalimager/TskFindFiles.h mode change 100755 => 100644 tools/logicalimager/TskHelper.cpp mode change 100755 => 100644 tools/logicalimager/TskHelper.h mode change 100755 => 100644 tools/logicalimager/UserAccount.cpp mode change 100755 => 100644 tools/logicalimager/UserAccount.h mode change 100755 => 100644 tools/vstools/mmls.cpp mode change 100755 => 100644 tsk/auto/auto.cpp mode change 100755 => 100644 tsk/auto/auto_db.cpp mode change 100755 => 100644 tsk/auto/guid.cpp mode change 100755 => 100644 tsk/auto/guid.h mode change 100755 => 100644 tsk/auto/tsk_db.cpp mode change 100755 => 100644 tsk/auto/tsk_db.h mode change 100755 => 100644 tsk/auto/tsk_db_sqlite.h mode change 100755 => 100644 tsk/base/tsk_os.h mode change 100755 => 100644 tsk/fs/apfs_compat.cpp mode change 100755 => 100644 tsk/fs/apfs_open.cpp mode change 100755 => 100644 tsk/fs/dcalc_lib.c mode change 100755 => 100644 tsk/fs/dcat_lib.c mode change 100755 => 100644 tsk/fs/dls_lib.c mode change 100755 => 100644 tsk/fs/exfatfs.c mode change 100755 => 100644 tsk/fs/exfatfs_dent.c mode change 100755 => 100644 tsk/fs/exfatfs_meta.c mode change 100755 => 100644 tsk/fs/ext2fs.c mode change 100755 => 100644 tsk/fs/fatfs_meta.c mode change 100755 => 100644 tsk/fs/fatfs_utils.c mode change 100755 => 100644 tsk/fs/fatxxfs.c mode change 100755 => 100644 tsk/fs/fatxxfs_dent.c mode change 100755 => 100644 tsk/fs/fatxxfs_meta.c mode change 100755 => 100644 tsk/fs/ffs.c mode change 100755 => 100644 tsk/fs/fs_attr.c mode change 100755 => 100644 tsk/fs/fs_io.c mode change 100755 => 100644 tsk/fs/fs_name.c mode change 100755 => 100644 tsk/fs/ils_lib.c mode change 100755 => 100644 tsk/fs/iso9660.c mode change 100755 => 100644 tsk/fs/tsk_apfs.h mode change 100755 => 100644 tsk/fs/tsk_exfatfs.h mode change 100755 => 100644 tsk/fs/tsk_fatxxfs.h mode change 100755 => 100644 tsk/fs/yaffs.cpp mode change 100755 => 100644 tsk/hashdb/binsrch_index.cpp mode change 100755 => 100644 tsk/hashdb/encase.c mode change 100755 => 100644 tsk/hashdb/hashkeeper.c mode change 100755 => 100644 tsk/hashdb/hdb_base.c mode change 100755 => 100644 tsk/hashdb/md5sum.c mode change 100755 => 100644 tsk/hashdb/nsrl.c mode change 100755 => 100644 tsk/img/aff.c mode change 100755 => 100644 tsk/img/ewf.cpp mode change 100755 => 100644 tsk/img/ewf.h mode change 100755 => 100644 tsk/img/img_io.c mode change 100755 => 100644 tsk/img/img_writer.cpp mode change 100755 => 100644 tsk/img/raw.c mode change 100755 => 100644 tsk/img/tsk_img_i.h mode change 100755 => 100644 tsk/img/vhd.c mode change 100755 => 100644 tsk/img/vmdk.c mode change 100755 => 100644 tsk/pool/apfs_pool.cpp mode change 100755 => 100644 tsk/pool/apfs_pool_compat.cpp mode change 100755 => 100644 tsk/pool/pool_open.cpp mode change 100755 => 100644 tsk/pool/pool_read.cpp diff --git a/samples/posix-cpp-style.cpp b/samples/posix-cpp-style.cpp old mode 100755 new mode 100644 diff --git a/samples/posix-style.cpp b/samples/posix-style.cpp old mode 100755 new mode 100644 diff --git a/tools/autotools/tsk_recover.cpp b/tools/autotools/tsk_recover.cpp old mode 100755 new mode 100644 diff --git a/tools/imgtools/img_cat.cpp b/tools/imgtools/img_cat.cpp old mode 100755 new mode 100644 diff --git a/tools/logicalimager/LogicalImagerDateRule.cpp b/tools/logicalimager/LogicalImagerDateRule.cpp old mode 100755 new mode 100644 diff --git a/tools/logicalimager/LogicalImagerDateRule.h b/tools/logicalimager/LogicalImagerDateRule.h old mode 100755 new mode 100644 diff --git a/tools/logicalimager/LogicalImagerExtensionRule.cpp b/tools/logicalimager/LogicalImagerExtensionRule.cpp old mode 100755 new mode 100644 diff --git a/tools/logicalimager/LogicalImagerExtensionRule.h b/tools/logicalimager/LogicalImagerExtensionRule.h old mode 100755 new mode 100644 diff --git a/tools/logicalimager/LogicalImagerFilenameRule.cpp b/tools/logicalimager/LogicalImagerFilenameRule.cpp old mode 100755 new mode 100644 diff --git a/tools/logicalimager/LogicalImagerFilenameRule.h b/tools/logicalimager/LogicalImagerFilenameRule.h old mode 100755 new mode 100644 diff --git a/tools/logicalimager/LogicalImagerPathRule.cpp b/tools/logicalimager/LogicalImagerPathRule.cpp old mode 100755 new mode 100644 diff --git a/tools/logicalimager/LogicalImagerPathRule.h b/tools/logicalimager/LogicalImagerPathRule.h old mode 100755 new mode 100644 diff --git a/tools/logicalimager/LogicalImagerRuleBase.cpp b/tools/logicalimager/LogicalImagerRuleBase.cpp old mode 100755 new mode 100644 diff --git a/tools/logicalimager/LogicalImagerRuleBase.h b/tools/logicalimager/LogicalImagerRuleBase.h old mode 100755 new mode 100644 diff --git a/tools/logicalimager/LogicalImagerSizeRule.cpp b/tools/logicalimager/LogicalImagerSizeRule.cpp old mode 100755 new mode 100644 diff --git a/tools/logicalimager/LogicalImagerSizeRule.h b/tools/logicalimager/LogicalImagerSizeRule.h old mode 100755 new mode 100644 diff --git a/tools/logicalimager/RegFileInfo.cpp b/tools/logicalimager/RegFileInfo.cpp old mode 100755 new mode 100644 diff --git a/tools/logicalimager/RegFileInfo.h b/tools/logicalimager/RegFileInfo.h old mode 100755 new mode 100644 diff --git a/tools/logicalimager/RegHiveType.h b/tools/logicalimager/RegHiveType.h old mode 100755 new mode 100644 diff --git a/tools/logicalimager/RegKey.cpp b/tools/logicalimager/RegKey.cpp old mode 100755 new mode 100644 diff --git a/tools/logicalimager/RegKey.h b/tools/logicalimager/RegKey.h old mode 100755 new mode 100644 diff --git a/tools/logicalimager/RegParser.cpp b/tools/logicalimager/RegParser.cpp old mode 100755 new mode 100644 diff --git a/tools/logicalimager/RegParser.h b/tools/logicalimager/RegParser.h old mode 100755 new mode 100644 diff --git a/tools/logicalimager/RegVal.cpp b/tools/logicalimager/RegVal.cpp old mode 100755 new mode 100644 diff --git a/tools/logicalimager/RegVal.h b/tools/logicalimager/RegVal.h old mode 100755 new mode 100644 diff --git a/tools/logicalimager/RegistryAnalyzer.cpp b/tools/logicalimager/RegistryAnalyzer.cpp old mode 100755 new mode 100644 diff --git a/tools/logicalimager/RegistryAnalyzer.h b/tools/logicalimager/RegistryAnalyzer.h old mode 100755 new mode 100644 diff --git a/tools/logicalimager/RegistryLoader.cpp b/tools/logicalimager/RegistryLoader.cpp old mode 100755 new mode 100644 diff --git a/tools/logicalimager/RegistryLoader.h b/tools/logicalimager/RegistryLoader.h old mode 100755 new mode 100644 diff --git a/tools/logicalimager/TskFindFiles.h b/tools/logicalimager/TskFindFiles.h old mode 100755 new mode 100644 diff --git a/tools/logicalimager/TskHelper.cpp b/tools/logicalimager/TskHelper.cpp old mode 100755 new mode 100644 diff --git a/tools/logicalimager/TskHelper.h b/tools/logicalimager/TskHelper.h old mode 100755 new mode 100644 diff --git a/tools/logicalimager/UserAccount.cpp b/tools/logicalimager/UserAccount.cpp old mode 100755 new mode 100644 diff --git a/tools/logicalimager/UserAccount.h b/tools/logicalimager/UserAccount.h old mode 100755 new mode 100644 diff --git a/tools/vstools/mmls.cpp b/tools/vstools/mmls.cpp old mode 100755 new mode 100644 diff --git a/tsk/auto/auto.cpp b/tsk/auto/auto.cpp old mode 100755 new mode 100644 diff --git a/tsk/auto/auto_db.cpp b/tsk/auto/auto_db.cpp old mode 100755 new mode 100644 diff --git a/tsk/auto/guid.cpp b/tsk/auto/guid.cpp old mode 100755 new mode 100644 diff --git a/tsk/auto/guid.h b/tsk/auto/guid.h old mode 100755 new mode 100644 diff --git a/tsk/auto/tsk_db.cpp b/tsk/auto/tsk_db.cpp old mode 100755 new mode 100644 diff --git a/tsk/auto/tsk_db.h b/tsk/auto/tsk_db.h old mode 100755 new mode 100644 diff --git a/tsk/auto/tsk_db_sqlite.h b/tsk/auto/tsk_db_sqlite.h old mode 100755 new mode 100644 diff --git a/tsk/base/tsk_os.h b/tsk/base/tsk_os.h old mode 100755 new mode 100644 diff --git a/tsk/fs/apfs_compat.cpp b/tsk/fs/apfs_compat.cpp old mode 100755 new mode 100644 diff --git a/tsk/fs/apfs_open.cpp b/tsk/fs/apfs_open.cpp old mode 100755 new mode 100644 diff --git a/tsk/fs/dcalc_lib.c b/tsk/fs/dcalc_lib.c old mode 100755 new mode 100644 diff --git a/tsk/fs/dcat_lib.c b/tsk/fs/dcat_lib.c old mode 100755 new mode 100644 diff --git a/tsk/fs/dls_lib.c b/tsk/fs/dls_lib.c old mode 100755 new mode 100644 diff --git a/tsk/fs/exfatfs.c b/tsk/fs/exfatfs.c old mode 100755 new mode 100644 diff --git a/tsk/fs/exfatfs_dent.c b/tsk/fs/exfatfs_dent.c old mode 100755 new mode 100644 diff --git a/tsk/fs/exfatfs_meta.c b/tsk/fs/exfatfs_meta.c old mode 100755 new mode 100644 diff --git a/tsk/fs/ext2fs.c b/tsk/fs/ext2fs.c old mode 100755 new mode 100644 diff --git a/tsk/fs/fatfs_meta.c b/tsk/fs/fatfs_meta.c old mode 100755 new mode 100644 diff --git a/tsk/fs/fatfs_utils.c b/tsk/fs/fatfs_utils.c old mode 100755 new mode 100644 diff --git a/tsk/fs/fatxxfs.c b/tsk/fs/fatxxfs.c old mode 100755 new mode 100644 diff --git a/tsk/fs/fatxxfs_dent.c b/tsk/fs/fatxxfs_dent.c old mode 100755 new mode 100644 diff --git a/tsk/fs/fatxxfs_meta.c b/tsk/fs/fatxxfs_meta.c old mode 100755 new mode 100644 diff --git a/tsk/fs/ffs.c b/tsk/fs/ffs.c old mode 100755 new mode 100644 diff --git a/tsk/fs/fs_attr.c b/tsk/fs/fs_attr.c old mode 100755 new mode 100644 diff --git a/tsk/fs/fs_io.c b/tsk/fs/fs_io.c old mode 100755 new mode 100644 diff --git a/tsk/fs/fs_name.c b/tsk/fs/fs_name.c old mode 100755 new mode 100644 diff --git a/tsk/fs/ils_lib.c b/tsk/fs/ils_lib.c old mode 100755 new mode 100644 diff --git a/tsk/fs/iso9660.c b/tsk/fs/iso9660.c old mode 100755 new mode 100644 diff --git a/tsk/fs/tsk_apfs.h b/tsk/fs/tsk_apfs.h old mode 100755 new mode 100644 diff --git a/tsk/fs/tsk_exfatfs.h b/tsk/fs/tsk_exfatfs.h old mode 100755 new mode 100644 diff --git a/tsk/fs/tsk_fatxxfs.h b/tsk/fs/tsk_fatxxfs.h old mode 100755 new mode 100644 diff --git a/tsk/fs/yaffs.cpp b/tsk/fs/yaffs.cpp old mode 100755 new mode 100644 diff --git a/tsk/hashdb/binsrch_index.cpp b/tsk/hashdb/binsrch_index.cpp old mode 100755 new mode 100644 diff --git a/tsk/hashdb/encase.c b/tsk/hashdb/encase.c old mode 100755 new mode 100644 diff --git a/tsk/hashdb/hashkeeper.c b/tsk/hashdb/hashkeeper.c old mode 100755 new mode 100644 diff --git a/tsk/hashdb/hdb_base.c b/tsk/hashdb/hdb_base.c old mode 100755 new mode 100644 diff --git a/tsk/hashdb/md5sum.c b/tsk/hashdb/md5sum.c old mode 100755 new mode 100644 diff --git a/tsk/hashdb/nsrl.c b/tsk/hashdb/nsrl.c old mode 100755 new mode 100644 diff --git a/tsk/img/aff.c b/tsk/img/aff.c old mode 100755 new mode 100644 diff --git a/tsk/img/ewf.cpp b/tsk/img/ewf.cpp old mode 100755 new mode 100644 diff --git a/tsk/img/ewf.h b/tsk/img/ewf.h old mode 100755 new mode 100644 diff --git a/tsk/img/img_io.c b/tsk/img/img_io.c old mode 100755 new mode 100644 diff --git a/tsk/img/img_writer.cpp b/tsk/img/img_writer.cpp old mode 100755 new mode 100644 diff --git a/tsk/img/raw.c b/tsk/img/raw.c old mode 100755 new mode 100644 diff --git a/tsk/img/tsk_img_i.h b/tsk/img/tsk_img_i.h old mode 100755 new mode 100644 diff --git a/tsk/img/vhd.c b/tsk/img/vhd.c old mode 100755 new mode 100644 diff --git a/tsk/img/vmdk.c b/tsk/img/vmdk.c old mode 100755 new mode 100644 diff --git a/tsk/pool/apfs_pool.cpp b/tsk/pool/apfs_pool.cpp old mode 100755 new mode 100644 diff --git a/tsk/pool/apfs_pool_compat.cpp b/tsk/pool/apfs_pool_compat.cpp old mode 100755 new mode 100644 diff --git a/tsk/pool/pool_open.cpp b/tsk/pool/pool_open.cpp old mode 100755 new mode 100644 diff --git a/tsk/pool/pool_read.cpp b/tsk/pool/pool_read.cpp old mode 100755 new mode 100644 From d071536e5110f26569ee8c894e49897a451d40eb Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Fri, 23 Aug 2024 13:29:08 +0100 Subject: [PATCH 0036/1548] Simplify bootstrap: Run 'autoreconf -fi'. --- bootstrap | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/bootstrap b/bootstrap index a6e465b44f..e7b8536728 100755 --- a/bootstrap +++ b/bootstrap @@ -1,5 +1,3 @@ #!/bin/sh -aclocal \ - && (libtoolize --force || glibtoolize --force) \ - && automake --foreign --add-missing --copy \ - && autoconf + +autoreconf -fi From 8fe40604ebc52d36a968e69a3352b40888fcce01 Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Fri, 23 Aug 2024 13:51:36 +0100 Subject: [PATCH 0037/1548] Make sure autoconf is installed for the Linux appveyor test. --- appveyor.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/appveyor.yml b/appveyor.yml index 33d19dfa32..c825a97b0d 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -60,6 +60,9 @@ for: only: - job_name: Linux Build + install: + - sudo apt install -y autoconf + build_script: - ./bootstrap - ./configure -q From 5df64c7ddce1cad68320d9e1186df446a81d7eec Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Wed, 11 Oct 2017 13:24:34 +0100 Subject: [PATCH 0038/1548] Removed unnecessary m4_includes. m4 macros are already include by AC_CONFIG_MACRO_DIR. --- configure.ac | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/configure.ac b/configure.ac index ff0b6703b2..0990d5501a 100644 --- a/configure.ac +++ b/configure.ac @@ -1,29 +1,16 @@ dnl -*- Autoconf -*- dnl Process this file with autoconf to produce a configure script. - AC_PREREQ(2.59) AC_INIT(sleuthkit, 4.12.1) -m4_include([m4/ax_pthread.m4]) -dnl include the version from 1.12.1. This will work for -m4_include([m4/cppunit.m4]) -m4_include([m4/ax_jni_include_dir.m4]) -m4_include([m4/ac_prog_javac_works.m4]) -m4_include([m4/ac_prog_javac.m4]) -m4_include([m4/ac_prog_java_works.m4]) -m4_include([m4/ac_prog_java.m4]) -m4_include([m4/ax_cxx_compile_stdcxx.m4]) - +AC_CONFIG_AUX_DIR([config]) +AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_SRCDIR([tsk/base/tsk_base.h]) AC_CONFIG_HEADERS([tsk/tsk_config.h]) -AC_CONFIG_AUX_DIR(config) AM_INIT_AUTOMAKE([foreign tar-ustar]) -AM_PATH_CPPUNIT(1.12.1) -AM_CONDITIONAL([CPPUNIT],[test "x$no_cppunit" = x]) AM_PROG_LIBTOOL AM_MAINTAINER_MODE -AC_CONFIG_MACRO_DIR([m4]) dnl Checks for programs. AC_PROG_CXX From e9eb6643b64f6e0f80a14f4ed0978a8d3cb494c4 Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Wed, 15 Jan 2020 13:44:03 +0000 Subject: [PATCH 0039/1548] Fixed typo. --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 0990d5501a..6843cad360 100644 --- a/configure.ac +++ b/configure.ac @@ -69,7 +69,7 @@ AC_CHECK_FUNCS([strlcpy strlcat]) AX_PTHREAD([ AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]) - CLIBS="$PTHREAD_LIBS $LIBS" + LIBS="$PTHREAD_LIBS $LIBS" CPPFLAGS="$CPPFLAGS $PTHREAD_CFLAGS" LDFLAGS="$LDFLAGS $PTHREAD_CFLAGS" CC="$PTHREAD_CC"],[]) From 0605d401e0f681aba5e9dc1573d7806fffbc7293 Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Thu, 9 Apr 2020 19:27:44 +0100 Subject: [PATCH 0040/1548] Do not add /usr/local/lib to LDFLAGS or /usr/local/inclue to CPPFLAGS automatically. If they're wanted, they should be added by specifying them when configure is run. --- configure.ac | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/configure.ac b/configure.ac index 6843cad360..d003e0e377 100644 --- a/configure.ac +++ b/configure.ac @@ -81,19 +81,6 @@ AC_ARG_ENABLE([multithreading], dnl Enable multithreading by default in the presence of pthread AS_IF([test "x$ax_pthread_ok" = "xyes" && test "x$enable_multithreading" != "xno"], [ax_multithread=yes], [ax_multithread=no]) -case "$host" in -*-*-mingw*) - dnl Adding the native /usr/local is wrong for cross-compiling - ;; -*) - dnl Not all compilers include /usr/local in the include and link path - if test -d /usr/local/include; then - CPPFLAGS="$CPPFLAGS -I/usr/local/include" - LDFLAGS="$LDFLAGS -L/usr/local/lib" - fi - ;; -esac - dnl Add enable/disable option AC_ARG_ENABLE([java], [AS_HELP_STRING([--disable-java], [Do not build the java bindings or jar file])]) From 6e841c398c85a66edf8bdb35dc64de0d3cfb67b3 Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Thu, 9 Apr 2020 20:00:37 +0100 Subject: [PATCH 0041/1548] Group image format libraries together. Remove stray semicolon. --- configure.ac | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/configure.ac b/configure.ac index d003e0e377..aa5211623d 100644 --- a/configure.ac +++ b/configure.ac @@ -337,14 +337,15 @@ dnl openssl is disabled, so removed line openssl support: $ax_openssl AC_MSG_NOTICE([ Building: afflib support: $ax_afflib - libewf support: $ax_libewf - zlib support: $ax_zlib - libbfio support: $ax_libbfio + libewf support: $ax_libewf libvhdi support: $ax_libvhdi libvmdk support: $ax_libvmdk libvslvm support: $ax_libvslvm + + zlib support: $ax_zlib + Features: Java/JNI support: $ax_java_support Multithreading: $ax_multithread -]); +]) From d9662f3fb153991dfdc11fde4234eb42914d5e99 Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Thu, 9 Apr 2020 20:07:21 +0100 Subject: [PATCH 0042/1548] Whitespace. --- configure.ac | 2 -- 1 file changed, 2 deletions(-) diff --git a/configure.ac b/configure.ac index aa5211623d..428ae28c67 100644 --- a/configure.ac +++ b/configure.ac @@ -87,7 +87,6 @@ AC_ARG_ENABLE([java], dnl Checks for libraries. - dnl Some platforms will complain about missing included functions if libstdc++ is not included. AC_CHECK_LIB(stdc++, main, , AC_MSG_ERROR([missing libstdc++])) AC_CHECK_HEADERS(list, , , AC_MSG_ERROR([missing STL list class header])) @@ -189,7 +188,6 @@ AS_IF([test "x$enable_cppunit" != "xno"], [ AM_CONDITIONAL([HAVE_CPPUNIT],[test "x$ac_cv_cppunit" = xyes]) dnl check for user online input - AC_ARG_ENABLE([offline], [ AS_HELP_STRING([--enable-offline],[Turn on offline mode])], [case "${enableval}" in From 1aaab4c105bcb05a54f8a6b60c252882d02973dd Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Mon, 6 Jun 2022 19:38:51 +0100 Subject: [PATCH 0043/1548] Set subdir-objects option for automake to prevent conflicts with other PRs. --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 428ae28c67..fb7df82f4f 100644 --- a/configure.ac +++ b/configure.ac @@ -8,7 +8,7 @@ AC_CONFIG_AUX_DIR([config]) AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_SRCDIR([tsk/base/tsk_base.h]) AC_CONFIG_HEADERS([tsk/tsk_config.h]) -AM_INIT_AUTOMAKE([foreign tar-ustar]) +AM_INIT_AUTOMAKE([foreign subdir-objects tar-ustar]) AM_PROG_LIBTOOL AM_MAINTAINER_MODE From 51b6e9b46a0e1204b2b7a6cf08153323897903af Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Thu, 8 Sep 2022 16:19:40 +0100 Subject: [PATCH 0044/1548] Adjusted CPPUNIT conditional variable to reflect customary usage. --- Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index f51d773e29..df6dc229c1 100644 --- a/Makefile.am +++ b/Makefile.am @@ -33,7 +33,7 @@ EXTRA_DIST = README_win32.txt README.md INSTALL.txt ChangeLog.txt NEWS.txt API-C ACLOCAL_AMFLAGS = -I m4 # directories to compile -if CPPUNIT +if HAVE_CPPUNIT UNIT_TESTS=unit_tests endif From b8ad4e45d3482b77fce35a2f733ca8dbd0ea5e61 Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Thu, 8 Sep 2022 16:20:27 +0100 Subject: [PATCH 0045/1548] Check again for sqlite3 only if we haven't found it with pkgconfig. Don't look for libdl unconditionally. --- configure.ac | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/configure.ac b/configure.ac index fb7df82f4f..6421560cee 100644 --- a/configure.ac +++ b/configure.ac @@ -115,11 +115,16 @@ AS_IF([test "x$ac_cv_prog_PKGCONFIG" = "xyes"], )] ) -dnl needed for sqllite -AC_CHECK_LIB(dl, dlopen) - -AC_CHECK_HEADERS([sqlite3.h], [AC_CHECK_LIB([sqlite3], [sqlite3_open])]) -AS_IF([test "x$ac_cv_lib_sqlite3_sqlite3_open" = "xyes"], [ax_sqlite3=yes]) +dnl check again for sqlite3 if not found by pkgconfig +AS_IF([test "x$ax_sqlite3" != "xyes"], + [ + AC_CHECK_HEADERS( + [sqlite3.h], + [AC_CHECK_LIB([dl], [dlopen]) + AC_CHECK_LIB([sqlite3], [sqlite3_open], [ax_sqlite3=yes], [])] + ) + ] +) dnl Compile the bundled sqlite if there is no system one installed AC_MSG_CHECKING(which sqlite3 to use) From 4c9742a1b7958bd6367cf917fff62c5e5a24c570 Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Tue, 14 Jan 2020 15:28:36 +0000 Subject: [PATCH 0046/1548] Adjustments for correct use of cppunit. --- configure.ac | 3 ++- unit_tests/base/Makefile.am | 6 +++--- unit_tests/{base/test_base.cpp => runner.cpp} | 13 +++---------- 3 files changed, 8 insertions(+), 14 deletions(-) rename unit_tests/{base/test_base.cpp => runner.cpp} (91%) diff --git a/configure.ac b/configure.ac index 6421560cee..95710b7520 100644 --- a/configure.ac +++ b/configure.ac @@ -331,7 +331,8 @@ AC_CONFIG_FILES([ bindings/java/jni/Makefile case-uco/java/Makefile unit_tests/Makefile - unit_tests/base/Makefile]) + unit_tests/base/Makefile + unit_tests/img/Makefile]) AC_OUTPUT diff --git a/unit_tests/base/Makefile.am b/unit_tests/base/Makefile.am index 2eb67c711a..3b9a6b441e 100644 --- a/unit_tests/base/Makefile.am +++ b/unit_tests/base/Makefile.am @@ -1,5 +1,5 @@ -AM_CPPFLAGS = -I../.. $(CPPUNIT_CFLAGS) -AM_CXXFLAGS += -Wno-unused-command-line-argument +AM_CPPFLAGS = -I../.. +AM_CXXFLAGS += -Wno-unused-command-line-argument $(CPPUNIT_CFLAGS) LDADD = ../../tsk/libtsk.la $(CPPUNIT_LIBS) LDFLAGS = -static @@ -7,7 +7,7 @@ TESTS = test_base check_PROGRAMS = test_base -test_base_SOURCES = test_base.cpp errors_test.cpp errors_test.h +test_base_SOURCES = ../runner.cpp errors_test.cpp errors_test.h MAINTAINERCLEANFILES = Makefile.in diff --git a/unit_tests/base/test_base.cpp b/unit_tests/runner.cpp similarity index 91% rename from unit_tests/base/test_base.cpp rename to unit_tests/runner.cpp index c7e0f9f184..0fccee377b 100644 --- a/unit_tests/base/test_base.cpp +++ b/unit_tests/runner.cpp @@ -6,16 +6,13 @@ * * This software is distributed under the Common Public License 1.0 */ -#include -#include -#include -#include + +#include + #include #include #include - - int main(int argc, char **argv) { // Get the top level suite from the registry CppUnit::Test *suite = CppUnit::TestFactoryRegistry::getRegistry().makeTest(); @@ -33,7 +30,3 @@ int main(int argc, char **argv) { // Return error code 1 if the one of test failed. return wasSuccessful ? 0 : 1; } - - - - From 65cbf1ae1d2d8abd8fc7f1ff9aefc3ab390c7292 Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Tue, 14 Jan 2020 15:31:23 +0000 Subject: [PATCH 0047/1548] Don't set an explicit check target for the unit tests, as that makes the target have the wrong executable extension. --- unit_tests/base/Makefile.am | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/unit_tests/base/Makefile.am b/unit_tests/base/Makefile.am index 3b9a6b441e..26c169473d 100644 --- a/unit_tests/base/Makefile.am +++ b/unit_tests/base/Makefile.am @@ -3,12 +3,12 @@ AM_CXXFLAGS += -Wno-unused-command-line-argument $(CPPUNIT_CFLAGS) LDADD = ../../tsk/libtsk.la $(CPPUNIT_LIBS) LDFLAGS = -static -TESTS = test_base - check_PROGRAMS = test_base test_base_SOURCES = ../runner.cpp errors_test.cpp errors_test.h +TESTS = $(check_PROGRAMS) + MAINTAINERCLEANFILES = Makefile.in indent: From d69f5cb05fea1fa2c22a7955e4452bef6af29619 Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Tue, 14 Jan 2020 15:32:09 +0000 Subject: [PATCH 0048/1548] Ignore some additional generated files. --- .gitignore | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index e7e9b1bdfc..8147ca8416 100755 --- a/.gitignore +++ b/.gitignore @@ -112,6 +112,12 @@ Makefile .deps .libs *.swp +.dirstamp + +# unit tests +unit_tests/*/*.exe +unit_tests/*/*.log +unit_tests/*/*.trs #javadoc generated /bindings/java/javadoc @@ -132,7 +138,6 @@ m4/libtool.m4 m4/lt*.m4 config/* - # Executables samples/callback_cpp_style samples/callback_style @@ -182,9 +187,8 @@ tools/vstools/mmls tools/vstools/mmstat tools/*/*.exe tools/*/*/*.exe -unit_tests/base/*.log -unit_tests/base/*.trs unit_tests/base/test_base + # EMACS backup files *~ From 43312d301aa043770c1ec66d2d2691db0a1e9174 Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Thu, 9 Apr 2020 20:25:10 +0100 Subject: [PATCH 0049/1548] unit_tests/img doesn't exist at the moment. --- configure.ac | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 95710b7520..6421560cee 100644 --- a/configure.ac +++ b/configure.ac @@ -331,8 +331,7 @@ AC_CONFIG_FILES([ bindings/java/jni/Makefile case-uco/java/Makefile unit_tests/Makefile - unit_tests/base/Makefile - unit_tests/img/Makefile]) + unit_tests/base/Makefile]) AC_OUTPUT From 8636ca69ae2434a6ce07f2be40b72f5068f03465 Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Mon, 6 Jun 2022 20:54:45 +0100 Subject: [PATCH 0050/1548] Whitespace. --- unit_tests/Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unit_tests/Makefile.am b/unit_tests/Makefile.am index c42559c154..792a44d8ce 100644 --- a/unit_tests/Makefile.am +++ b/unit_tests/Makefile.am @@ -1 +1 @@ -SUBDIRS= base +SUBDIRS = base From 09ea206e93cb9eab534a931b734a25f496ea5481 Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Thu, 8 Sep 2022 12:33:38 +0100 Subject: [PATCH 0051/1548] Sorted source file list, one per line, to ease maintenance and merges. --- tsk/img/Makefile.am | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/tsk/img/Makefile.am b/tsk/img/Makefile.am index 82eeee5dd6..0c51301b2d 100644 --- a/tsk/img/Makefile.am +++ b/tsk/img/Makefile.am @@ -2,9 +2,29 @@ AM_CPPFLAGS = -I../.. -I$(srcdir)/../.. EXTRA_DIST = .indent.pro noinst_LTLIBRARIES = libtskimg.la -libtskimg_la_SOURCES = img_open.cpp img_types.c raw.c raw.h logical_img.c logical_img.h \ - aff.c aff.h ewf.cpp ewf.h tsk_img_i.h img_io.c mult_files.c \ - vhd.c vhd.h vmdk.c vmdk.h img_writer.cpp img_writer.h unsupported_types.c unsupported_types.h + +libtskimg_la_SOURCES = \ + aff.c \ + aff.h \ + ewf.cpp \ + ewf.h \ + img_io.c \ + img_open.cpp \ + img_types.c \ + img_writer.cpp \ + img_writer.h \ + logical_img.c \ + logical_img.h \ + mult_files.c \ + raw.c \ + raw.h \ + tsk_img_i.h \ + unsupported_types.c \ + unsupported_types.h \ + vhd.c \ + vhd.h \ + vmdk.c \ + vmdk.h indent: indent *.c *.h From ad5f51f6638d740dbae70045cd22c97faaf71726 Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Wed, 20 Dec 2017 17:07:05 +0000 Subject: [PATCH 0052/1548] Added AX_PKG_CHECK_MODULES, for checking whether we have cppunit when we also have pkg-config. --- m4/ax_pkg_check_modules.m4 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/m4/ax_pkg_check_modules.m4 b/m4/ax_pkg_check_modules.m4 index f3af0f684d..1842a9a8fb 100644 --- a/m4/ax_pkg_check_modules.m4 +++ b/m4/ax_pkg_check_modules.m4 @@ -1,5 +1,5 @@ # =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_pkg_check_modules.html +# https://www.gnu.org/software/autoconf-archive/ax_pkg_check_modules.html # =========================================================================== # # SYNOPSIS @@ -50,7 +50,7 @@ # and this notice are preserved. This file is offered as-is, without any # warranty. -#serial 2 +#serial 3 AC_DEFUN([AX_PKG_CHECK_MODULES],[ m4_define([ax_package_requires], From 71bbf0e5c4c49de7268ae5e2f79d79408b199f40 Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Mon, 2 Sep 2024 12:39:33 -0400 Subject: [PATCH 0053/1548] first try at a github action - largey from bulk_extractor --- .github/workflows/compile-check-codecov.yml | 141 ++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 .github/workflows/compile-check-codecov.yml diff --git a/.github/workflows/compile-check-codecov.yml b/.github/workflows/compile-check-codecov.yml new file mode 100644 index 0000000000..5e2acb55ef --- /dev/null +++ b/.github/workflows/compile-check-codecov.yml @@ -0,0 +1,141 @@ +# This file based on https://gist.github.com/mwouts/9842452d020c08faf9e84a3bba38a66f +# See: https://help.github.com/en/actions/reference/software-installed-on-github-hosted-runners +# 2022-08-06 - slg - Updated os to be 'macos-latest', 'ubuntu-20.04', 'ubuntu-22.04' +# See https://github.com/actions/virtual-environments for details. +# 2020-06-22 - slg - customized +# 2020-06-27 - slg - expanded to G++ for MacOS +# 2020-07-03 - slg - ported to be13_api; removed python (be13_api doesn't use python) +# 2021-05-07 - slg - Started work again +# 2022-02-10 - slg - renamed be20_api. Our work here is done. + +name: TSK Tests on MacOS and Ubuntu (c++17) + +on: + push: + branches: + - '**' # This will trigger the action for all branches + pull_request: + branches: + - main # Specify the branches for which pull_request events should trigger the action + +jobs: + build: + strategy: + matrix: + os: [macos-latest, ubuntu-22.04] + platform: [x64, arm64] + runs-on: ${{ matrix.os }} + + env: + MAKE_OPTS: -j2 + + steps: + # https://github.com/actions/checkout + - name: Checkout + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Extract Version from configure.ac + id: extract_version + run: | + echo "::set-output name=version::$(grep 'AC_INIT' configure.ac| cut -d',' -f2 | tr -d "[]() ")" + + # Conditional step for push events + - name: Run on push + if: github.event_name == 'push' + run: echo "This runs on a push to any branch" + + # Conditional step for pull_request events + - name: Run on pull request + if: github.event_name == 'pull_request' + run: echo "This runs on a pull request to the main branch" + + - name: "MacOS: run CONFIGURE_MACOS.bash" + if: startsWith(matrix.os, 'macos') + run: | + bash ./bootstrap + + - name: "Ubuntu: run CONFIGURE_UBUNTU22LTS.bash" + if: startsWith(matrix.os, 'ubuntu') + run: | + bash ./bootstrap + + - name: Version Numbers + run: | + autoconf --version + automake --version + aclocal --version + gcc --version + g++ --version + + - name: Files + run: | + find . -print + + - name: Dump configure script + run: | + cat configure + + - name: C++ checks not optimizaiton with address-sanitizer (Mac and Linux) + if: false + run: | + ./configure --disable-opt --enable-address-sanitizer + make $MAKE_OPTS all + make $MAKE_OPTS bulk_extractor + make check || (cat test-suite.log; exit 1) + make distclean + + - name: C++ checks optimization with address-sanitizer (Mac and Linux) + if: false + run: | + echo === Try Address Sanitizer Optimization === + ./configure --enable-address-sanitizer --enable-silent-rules --quiet + make $MAKE_OPTS all + pushd src + make $MAKE_OPTS bulk_extractor + make check || (cat test-suite.log; exit 1) + popd + make distclean + + - name: C++ checks with thread-sanitizer on ubuntu are disabled + if: false && startsWith(matrix.os, 'ubuntu-DISABLED') + run: | + bash bootstrap.sh + ./configure --enable-thread-sanitizer --enable-silent-rules --quiet + make clean + make $MAKE_OPTS all + pushd src + make $MAKE_OPTS bulk_extractor + make check || (cat test-suite.log; exit 1) + popd + make distclean + + - name: C++ checks with codecov + if: false && startsWith(matrix.os, 'ubuntu') + run: | + bash bootstrap.sh + ./configure --disable-opt CFLAGS='-g -O0 -fprofile-arcs -ftest-coverage' CXXFLAGS='-g -O0 -fprofile-arcs -ftest-coverage' --enable-silent-rules --quiet + make clean + make $MAKE_OPTS check || (echo ==error== ; cat test-suite.log; exit 1) + make check + gcov-9 $(find -name '*.o' -or '*.c' -or '*.cpp' -or '*.h' -or '*.hpp') + + - name: upload codecov report + if: startsWith(matrix.os, 'ubuntu') + uses: codecov/codecov-action@v4 + with: + fail_ci_if_error: true + name: codecov-umbrealla + verbose: true + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + + - name: distcheck + run: | + bash bootstrap + ./configure -q + make distcheck + + - uses: ammaraskar/gcc-problem-matcher@0.2.0 + name: GCC Problem Matcher From aec76dbcae09ac73c2e5f155ee6c19bb7739ae36 Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Mon, 2 Sep 2024 16:03:49 -0400 Subject: [PATCH 0054/1548] try installing stuff first, and just check initially on macos arm --- .github/workflows/compile-check-codecov.yml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/workflows/compile-check-codecov.yml b/.github/workflows/compile-check-codecov.yml index 5e2acb55ef..7ca0479fe0 100644 --- a/.github/workflows/compile-check-codecov.yml +++ b/.github/workflows/compile-check-codecov.yml @@ -22,14 +22,21 @@ jobs: build: strategy: matrix: - os: [macos-latest, ubuntu-22.04] - platform: [x64, arm64] + os: [macos-latest] + platform: [arm64] + #os: [macos-latest, ubuntu-22.04] + #platform: [x64, arm64] runs-on: ${{ matrix.os }} env: MAKE_OPTS: -j2 steps: + - name: System Prep + run: | + brew install wget libtool autoconf automake libtool libxml2 libewf pkg-config + + # https://github.com/actions/checkout - name: Checkout uses: actions/checkout@v4 From 70f44d6c76984cabf4101e7fceb2729d201a15ed Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Mon, 2 Sep 2024 16:08:46 -0400 Subject: [PATCH 0055/1548] remove distcheck --- .github/workflows/compile-check-codecov.yml | 7 +- tsk/tsk_config.h.in | 85 +++++++++++---------- 2 files changed, 48 insertions(+), 44 deletions(-) diff --git a/.github/workflows/compile-check-codecov.yml b/.github/workflows/compile-check-codecov.yml index 7ca0479fe0..1ad4e45093 100644 --- a/.github/workflows/compile-check-codecov.yml +++ b/.github/workflows/compile-check-codecov.yml @@ -140,9 +140,10 @@ jobs: - name: distcheck run: | - bash bootstrap - ./configure -q - make distcheck + echo disabled + #bash bootstrap + #./configure -q + #make distcheck - uses: ammaraskar/gcc-problem-matcher@0.2.0 name: GCC Problem Matcher diff --git a/tsk/tsk_config.h.in b/tsk/tsk_config.h.in index 332929169f..61c0e3d608 100644 --- a/tsk/tsk_config.h.in +++ b/tsk/tsk_config.h.in @@ -18,82 +18,79 @@ /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H -/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */ +/* Define to 1 if you don't have 'vprintf' but do have '_doprnt.' */ #undef HAVE_DOPRNT -/* Define to 1 if you have the `err' function. */ +/* Define to 1 if you have the 'err' function. */ #undef HAVE_ERR -/* Define to 1 if you have the `errx' function. */ +/* Define to 1 if you have the 'errx' function. */ #undef HAVE_ERRX /* Define to 1 if you have the header file. */ #undef HAVE_ERR_H -/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */ +/* Define to 1 if fseeko (and ftello) are declared in stdio.h. */ #undef HAVE_FSEEKO -/* Define to 1 if you have the `getline' function. */ +/* Define to 1 if you have the 'getline' function. */ #undef HAVE_GETLINE -/* Define to 1 if you have the `getrusage' function. */ +/* Define to 1 if you have the 'getrusage' function. */ #undef HAVE_GETRUSAGE /* Define to 1 if you have the header file. */ #undef HAVE_INTTYPES_H -/* Define to 1 if you have the `ishexnumber' function. */ +/* Define to 1 if you have the 'ishexnumber' function. */ #undef HAVE_ISHEXNUMBER -/* Define to 1 if you have the `afflib' library (-lafflib). */ +/* Define to 1 if you have the 'afflib' library (-lafflib). */ #undef HAVE_LIBAFFLIB -/* Define to 1 if you have the `bfio' library (-lbfio). */ +/* Define to 1 if you have the 'bfio' library (-lbfio). */ #undef HAVE_LIBBFIO /* Define to 1 if you have the header file. */ #undef HAVE_LIBBFIO_H -/* Define to 1 if you have the `dl' library (-ldl). */ +/* Define to 1 if you have the 'dl' library (-ldl). */ #undef HAVE_LIBDL -/* Define to 1 if you have the `ewf' library (-lewf). */ +/* Define to 1 if you have the 'ewf' library (-lewf). */ #undef HAVE_LIBEWF /* Define to 1 if you have the header file. */ #undef HAVE_LIBEWF_H -/* Define to 1 if you have the `sqlite3' library (-lsqlite3). */ -#undef HAVE_LIBSQLITE3 - -/* Define to 1 if you have the `stdc++' library (-lstdc++). */ +/* Define to 1 if you have the 'stdc++' library (-lstdc++). */ #undef HAVE_LIBSTDC__ -/* Define to 1 if you have the `vhdi' library (-lvhdi). */ +/* Define to 1 if you have the 'vhdi' library (-lvhdi). */ #undef HAVE_LIBVHDI /* Define to 1 if you have the header file. */ #undef HAVE_LIBVHDI_H -/* Define to 1 if you have the `vmdk' library (-lvmdk). */ +/* Define to 1 if you have the 'vmdk' library (-lvmdk). */ #undef HAVE_LIBVMDK /* Define to 1 if you have the header file. */ #undef HAVE_LIBVMDK_H -/* Define to 1 if you have the `vslvm' library (-lvslvm). */ +/* Define to 1 if you have the 'vslvm' library (-lvslvm). */ #undef HAVE_LIBVSLVM /* Define to 1 if you have the header file. */ #undef HAVE_LIBVSLVM_H -/* Define to 1 if you have the `z' library (-lz). */ +/* Define to 1 if you have the 'z' library (-lz). */ #undef HAVE_LIBZ /* Define to 1 if you have the header file. */ #undef HAVE_LIST -/* Define to 1 if `lstat' has the bug that it succeeds when given the +/* Define to 1 if 'lstat' has the bug that it succeeds when given the zero-length file name argument. */ #undef HAVE_LSTAT_EMPTY_STRING_BUG @@ -139,10 +136,10 @@ /* Define to 1 if you have the header file. */ #undef HAVE_STRING_H -/* Define to 1 if you have the `strlcat' function. */ +/* Define to 1 if you have the 'strlcat' function. */ #undef HAVE_STRLCAT -/* Define to 1 if you have the `strlcpy' function. */ +/* Define to 1 if you have the 'strlcpy' function. */ #undef HAVE_STRLCPY /* Define to 1 if you have the header file. */ @@ -169,31 +166,31 @@ /* Define to 1 if you have the header file. */ #undef HAVE_UTIME_H -/* Define to 1 if `utime(file, NULL)' sets file's timestamp to the present. */ +/* Define to 1 if 'utime(file, NULL)' sets file's timestamp to the present. */ #undef HAVE_UTIME_NULL -/* Define to 1 if you have the `vasprintf' function. */ +/* Define to 1 if you have the 'vasprintf' function. */ #undef HAVE_VASPRINTF /* Define to 1 if you have the header file. */ #undef HAVE_VECTOR -/* Define to 1 if you have the `vprintf' function. */ +/* Define to 1 if you have the 'vprintf' function. */ #undef HAVE_VPRINTF -/* Define to 1 if you have the `warn' function. */ +/* Define to 1 if you have the 'warn' function. */ #undef HAVE_WARN -/* Define to 1 if you have the `warnx' function. */ +/* Define to 1 if you have the 'warnx' function. */ #undef HAVE_WARNX /* Define to 1 if you have the header file. */ #undef HAVE_ZLIB_H -/* Define to 1 if the system has the type `_Bool'. */ +/* Define to 1 if the system has the type '_Bool'. */ #undef HAVE__BOOL -/* Define to 1 if `lstat' dereferences a symlink specified with a trailing +/* Define to 1 if 'lstat' dereferences a symlink specified with a trailing slash. */ #undef LSTAT_FOLLOWS_SLASHED_SYMLINK @@ -225,13 +222,13 @@ your system. */ #undef PTHREAD_CREATE_JOINABLE -/* Define to the type of arg 1 for `select'. */ +/* Define to the type of arg 1 for 'select'. */ #undef SELECT_TYPE_ARG1 -/* Define to the type of args 2, 3 and 4 for `select'. */ +/* Define to the type of args 2, 3 and 4 for 'select'. */ #undef SELECT_TYPE_ARG234 -/* Define to the type of arg 5 for `select'. */ +/* Define to the type of arg 5 for 'select'. */ #undef SELECT_TYPE_ARG5 /* If using the C implementation of alloca, define if you know the @@ -242,7 +239,7 @@ STACK_DIRECTION = 0 => direction of growth unknown */ #undef STACK_DIRECTION -/* Define to 1 if all of the C90 standard headers exist (not just the ones +/* Define to 1 if all of the C89 standard headers exist (not just the ones required in a freestanding environment). This macro is provided for backward compatibility; new code need not use it. */ #undef STDC_HEADERS @@ -253,26 +250,32 @@ /* Number of bits in a file offset, on hosts where this is settable. */ #undef _FILE_OFFSET_BITS -/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */ +/* Define to 1 if necessary to make fseeko visible. */ #undef _LARGEFILE_SOURCE -/* Define for large files, on AIX-style hosts. */ +/* Define to 1 on platforms where this makes off_t a 64-bit type. */ #undef _LARGE_FILES -/* Define to empty if `const' does not conform to ANSI C. */ +/* Number of bits in time_t, on hosts where this is settable. */ +#undef _TIME_BITS + +/* Define to 1 on platforms where this makes time_t a 64-bit type. */ +#undef __MINGW_USE_VC2005_COMPAT + +/* Define to empty if 'const' does not conform to ANSI C. */ #undef const -/* Define to `int' if doesn't define. */ +/* Define as 'int' if doesn't define. */ #undef gid_t -/* Define to `int' if does not define. */ +/* Define to 'int' if does not define. */ #undef mode_t -/* Define to `long int' if does not define. */ +/* Define to 'long int' if does not define. */ #undef off_t -/* Define to `unsigned int' if does not define. */ +/* Define as 'unsigned int' if doesn't define. */ #undef size_t -/* Define to `int' if doesn't define. */ +/* Define as 'int' if doesn't define. */ #undef uid_t From 3950634e20df56a523504780a6c462fc2d2fc18c Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Tue, 3 Sep 2024 15:32:50 -0400 Subject: [PATCH 0056/1548] debugging github action --- .github/workflows/compile-check-codecov.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/compile-check-codecov.yml b/.github/workflows/compile-check-codecov.yml index 1ad4e45093..1334596366 100644 --- a/.github/workflows/compile-check-codecov.yml +++ b/.github/workflows/compile-check-codecov.yml @@ -133,7 +133,7 @@ jobs: uses: codecov/codecov-action@v4 with: fail_ci_if_error: true - name: codecov-umbrealla + name: "Do codecov" verbose: true env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} From 82028542f3f246b981880b659aa03b67947d227b Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Tue, 3 Sep 2024 15:36:04 -0400 Subject: [PATCH 0057/1548] enable C++ checks with codecov --- .github/workflows/compile-check-codecov.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/compile-check-codecov.yml b/.github/workflows/compile-check-codecov.yml index 1334596366..f936545c9d 100644 --- a/.github/workflows/compile-check-codecov.yml +++ b/.github/workflows/compile-check-codecov.yml @@ -119,7 +119,7 @@ jobs: make distclean - name: C++ checks with codecov - if: false && startsWith(matrix.os, 'ubuntu') + if: startsWith(matrix.os, 'ubuntu') run: | bash bootstrap.sh ./configure --disable-opt CFLAGS='-g -O0 -fprofile-arcs -ftest-coverage' CXXFLAGS='-g -O0 -fprofile-arcs -ftest-coverage' --enable-silent-rules --quiet From 120f72dcc30b9eda89688e1ef1a9b138a61eac3e Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Tue, 3 Sep 2024 15:38:46 -0400 Subject: [PATCH 0058/1548] enable C++ checks with codecov --- .github/workflows/compile-check-codecov.yml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/.github/workflows/compile-check-codecov.yml b/.github/workflows/compile-check-codecov.yml index f936545c9d..aa2bdbefca 100644 --- a/.github/workflows/compile-check-codecov.yml +++ b/.github/workflows/compile-check-codecov.yml @@ -22,10 +22,8 @@ jobs: build: strategy: matrix: - os: [macos-latest] - platform: [arm64] - #os: [macos-latest, ubuntu-22.04] - #platform: [x64, arm64] + os: [macos-latest, ubuntu-22.04] + platform: [x64, arm64] runs-on: ${{ matrix.os }} env: @@ -119,7 +117,7 @@ jobs: make distclean - name: C++ checks with codecov - if: startsWith(matrix.os, 'ubuntu') + if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.platform, 'x64') run: | bash bootstrap.sh ./configure --disable-opt CFLAGS='-g -O0 -fprofile-arcs -ftest-coverage' CXXFLAGS='-g -O0 -fprofile-arcs -ftest-coverage' --enable-silent-rules --quiet From c045c7ff021d1a6f4e22a7a3ce03ea99e977262d Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Tue, 3 Sep 2024 15:48:01 -0400 Subject: [PATCH 0059/1548] fix VM config on MacOS and Ubuntu --- .github/workflows/compile-check-codecov.yml | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/.github/workflows/compile-check-codecov.yml b/.github/workflows/compile-check-codecov.yml index aa2bdbefca..9b8fbdd88f 100644 --- a/.github/workflows/compile-check-codecov.yml +++ b/.github/workflows/compile-check-codecov.yml @@ -30,11 +30,6 @@ jobs: MAKE_OPTS: -j2 steps: - - name: System Prep - run: | - brew install wget libtool autoconf automake libtool libxml2 libewf pkg-config - - # https://github.com/actions/checkout - name: Checkout uses: actions/checkout@v4 @@ -46,24 +41,16 @@ jobs: run: | echo "::set-output name=version::$(grep 'AC_INIT' configure.ac| cut -d',' -f2 | tr -d "[]() ")" - # Conditional step for push events - - name: Run on push - if: github.event_name == 'push' - run: echo "This runs on a push to any branch" - - # Conditional step for pull_request events - - name: Run on pull request - if: github.event_name == 'pull_request' - run: echo "This runs on a pull request to the main branch" - - - name: "MacOS: run CONFIGURE_MACOS.bash" + - name: "Configure for MacOS" if: startsWith(matrix.os, 'macos') run: | + brew install wget libtool autoconf automake libtool libxml2 libewf pkg-config bash ./bootstrap - - name: "Ubuntu: run CONFIGURE_UBUNTU22LTS.bash" + - name: "Configure for Ubuntu" if: startsWith(matrix.os, 'ubuntu') run: | + sudo apt install -y autoconf automake g++ flex libexpat1-dev libre2-dev libssl-dev libtool libxml2-utils make pkg-config zlib1g-dev bash ./bootstrap - name: Version Numbers From b9baa186c5f4e1c59e2218eb1abadb515a97c046 Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Tue, 3 Sep 2024 15:54:47 -0400 Subject: [PATCH 0060/1548] added CODCOV token --- .github/workflows/compile-check-codecov.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/compile-check-codecov.yml b/.github/workflows/compile-check-codecov.yml index 9b8fbdd88f..f874c57966 100644 --- a/.github/workflows/compile-check-codecov.yml +++ b/.github/workflows/compile-check-codecov.yml @@ -114,7 +114,7 @@ jobs: gcov-9 $(find -name '*.o' -or '*.c' -or '*.cpp' -or '*.h' -or '*.hpp') - name: upload codecov report - if: startsWith(matrix.os, 'ubuntu') + if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.platform, 'x64') uses: codecov/codecov-action@v4 with: fail_ci_if_error: true From 99f6c2d2f3540b4116f869e23b9e6e002d480dd6 Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Tue, 3 Sep 2024 15:57:48 -0400 Subject: [PATCH 0061/1548] added CODCOV token --- .github/workflows/compile-check-codecov.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/compile-check-codecov.yml b/.github/workflows/compile-check-codecov.yml index f874c57966..d9b6c3e1b3 100644 --- a/.github/workflows/compile-check-codecov.yml +++ b/.github/workflows/compile-check-codecov.yml @@ -93,7 +93,7 @@ jobs: - name: C++ checks with thread-sanitizer on ubuntu are disabled if: false && startsWith(matrix.os, 'ubuntu-DISABLED') run: | - bash bootstrap.sh + bash ./bootstrap ./configure --enable-thread-sanitizer --enable-silent-rules --quiet make clean make $MAKE_OPTS all @@ -106,7 +106,7 @@ jobs: - name: C++ checks with codecov if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.platform, 'x64') run: | - bash bootstrap.sh + bash ./bootstrap ./configure --disable-opt CFLAGS='-g -O0 -fprofile-arcs -ftest-coverage' CXXFLAGS='-g -O0 -fprofile-arcs -ftest-coverage' --enable-silent-rules --quiet make clean make $MAKE_OPTS check || (echo ==error== ; cat test-suite.log; exit 1) From 9b997ba9b9696b4b42d59b4b94445df78f6f8b06 Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Tue, 3 Sep 2024 16:37:25 -0400 Subject: [PATCH 0062/1548] fixed find --- .github/workflows/compile-check-codecov.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/compile-check-codecov.yml b/.github/workflows/compile-check-codecov.yml index d9b6c3e1b3..0c6e31e0bd 100644 --- a/.github/workflows/compile-check-codecov.yml +++ b/.github/workflows/compile-check-codecov.yml @@ -111,7 +111,7 @@ jobs: make clean make $MAKE_OPTS check || (echo ==error== ; cat test-suite.log; exit 1) make check - gcov-9 $(find -name '*.o' -or '*.c' -or '*.cpp' -or '*.h' -or '*.hpp') + gcov-9 $(find -name '*.o' -or -name '*.c' -or -name '*.cpp' -or -name '*.h' -or -name '*.hpp') - name: upload codecov report if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.platform, 'x64') From c43c5123218ce10ab6b093269622583e1052cc1b Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Tue, 3 Sep 2024 17:06:59 -0400 Subject: [PATCH 0063/1548] added fixes --- codecov.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 codecov.yml diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 0000000000..7121e1887d --- /dev/null +++ b/codecov.yml @@ -0,0 +1,10 @@ +coverage: + range: 40..60 + round: nearest + precision: 2 + +fixes: + - "/home/runner/work/::" + +ignore: + - "m4/*" From 0a93e8273957bcba272451b5ad070ed76691901a Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Tue, 3 Sep 2024 17:11:10 -0400 Subject: [PATCH 0064/1548] added fixes --- .github/workflows/compile-check-codecov.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/compile-check-codecov.yml b/.github/workflows/compile-check-codecov.yml index 0c6e31e0bd..d115c3cc4f 100644 --- a/.github/workflows/compile-check-codecov.yml +++ b/.github/workflows/compile-check-codecov.yml @@ -113,6 +113,10 @@ jobs: make check gcov-9 $(find -name '*.o' -or -name '*.c' -or -name '*.cpp' -or -name '*.h' -or -name '*.hpp') + - name: List all files + run: | + find . -ls + - name: upload codecov report if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.platform, 'x64') uses: codecov/codecov-action@v4 From fa6423c121a941ba86718f18a4338aa2f73550c6 Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Tue, 3 Sep 2024 17:16:31 -0400 Subject: [PATCH 0065/1548] added pip3 install coverage --- .github/workflows/compile-check-codecov.yml | 1 + codecov.yml | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/compile-check-codecov.yml b/.github/workflows/compile-check-codecov.yml index d115c3cc4f..cc0fd4c528 100644 --- a/.github/workflows/compile-check-codecov.yml +++ b/.github/workflows/compile-check-codecov.yml @@ -106,6 +106,7 @@ jobs: - name: C++ checks with codecov if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.platform, 'x64') run: | + sudo pip3 install coverage bash ./bootstrap ./configure --disable-opt CFLAGS='-g -O0 -fprofile-arcs -ftest-coverage' CXXFLAGS='-g -O0 -fprofile-arcs -ftest-coverage' --enable-silent-rules --quiet make clean diff --git a/codecov.yml b/codecov.yml index 7121e1887d..a003dbc78e 100644 --- a/codecov.yml +++ b/codecov.yml @@ -3,8 +3,8 @@ coverage: round: nearest precision: 2 -fixes: - - "/home/runner/work/::" +#fixes: +# - "/home/runner/work/sleuthkit/sleuthkit::" ignore: - "m4/*" From 09f9498f182ee36d94ca8cb30c09d998f1fceb77 Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Wed, 4 Sep 2024 08:21:11 -0400 Subject: [PATCH 0066/1548] more code cov tests --- .github/workflows/compile-check-codecov.yml | 8 +++++--- .gitignore | 3 +++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/.github/workflows/compile-check-codecov.yml b/.github/workflows/compile-check-codecov.yml index cc0fd4c528..49fd641dfe 100644 --- a/.github/workflows/compile-check-codecov.yml +++ b/.github/workflows/compile-check-codecov.yml @@ -72,7 +72,7 @@ jobs: - name: C++ checks not optimizaiton with address-sanitizer (Mac and Linux) if: false run: | - ./configure --disable-opt --enable-address-sanitizer + ./configure --enable-address-sanitizer make $MAKE_OPTS all make $MAKE_OPTS bulk_extractor make check || (cat test-suite.log; exit 1) @@ -108,11 +108,12 @@ jobs: run: | sudo pip3 install coverage bash ./bootstrap - ./configure --disable-opt CFLAGS='-g -O0 -fprofile-arcs -ftest-coverage' CXXFLAGS='-g -O0 -fprofile-arcs -ftest-coverage' --enable-silent-rules --quiet + ./configure CFLAGS='-g -O0 -fprofile-arcs -ftest-coverage' CXXFLAGS='-g -O0 -fprofile-arcs -ftest-coverage' --enable-silent-rules --quiet make clean make $MAKE_OPTS check || (echo ==error== ; cat test-suite.log; exit 1) make check - gcov-9 $(find -name '*.o' -or -name '*.c' -or -name '*.cpp' -or -name '*.h' -or -name '*.hpp') + (cd tests; gcov -pb read_apis.cpp) + (cd tools/vstools; gcov -pb mmls.cpp) - name: List all files run: | @@ -125,6 +126,7 @@ jobs: fail_ci_if_error: true name: "Do codecov" verbose: true + directory: tests env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} diff --git a/.gitignore b/.gitignore index 8147ca8416..51771d689f 100755 --- a/.gitignore +++ b/.gitignore @@ -206,3 +206,6 @@ sleuthkit-*.tar.gz #Test data folder tests/data +*.gcno +*.gcov +*.gz From 7fba8641410fa46665e77b0d01cc5b6d83eb7dfa Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Wed, 4 Sep 2024 08:38:10 -0400 Subject: [PATCH 0067/1548] more code cov tests --- .github/workflows/compile-check-codecov.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/compile-check-codecov.yml b/.github/workflows/compile-check-codecov.yml index 49fd641dfe..51ca38268c 100644 --- a/.github/workflows/compile-check-codecov.yml +++ b/.github/workflows/compile-check-codecov.yml @@ -112,8 +112,8 @@ jobs: make clean make $MAKE_OPTS check || (echo ==error== ; cat test-suite.log; exit 1) make check - (cd tests; gcov -pb read_apis.cpp) - (cd tools/vstools; gcov -pb mmls.cpp) + (cd tests; gcov -pb read_apis.cpp) + (cd tools/vstools; gcov -pb mmls.cpp) - name: List all files run: | @@ -126,7 +126,7 @@ jobs: fail_ci_if_error: true name: "Do codecov" verbose: true - directory: tests + directory: tests env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} From c369c5ab7a0e7980a9832970d6249b5e5d0b17b3 Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Wed, 4 Sep 2024 08:53:40 -0400 Subject: [PATCH 0068/1548] dump test logfiles --- .github/workflows/compile-check-codecov.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/compile-check-codecov.yml b/.github/workflows/compile-check-codecov.yml index 51ca38268c..a2b96c0ac4 100644 --- a/.github/workflows/compile-check-codecov.yml +++ b/.github/workflows/compile-check-codecov.yml @@ -115,6 +115,13 @@ jobs: (cd tests; gcov -pb read_apis.cpp) (cd tools/vstools; gcov -pb mmls.cpp) + - name: Dump test logfile + if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.platform, 'x64') + run: | + cat tests/test-suite.log + cat tests/test_libraries.sh.log + cat tests/runtests.sh.log + - name: List all files run: | find . -ls From f68a4b5ae184870c3082956e2cb31da032e1bd30 Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Wed, 4 Sep 2024 10:25:43 -0400 Subject: [PATCH 0069/1548] updated to get the cftt disk images --- .github/workflows/compile-check-codecov.yml | 6 ++ .gitignore | 1 + tests/get_dftt.bash | 19 ++++ tests/runtests.sh | 111 +++++++++++++------- 4 files changed, 98 insertions(+), 39 deletions(-) create mode 100755 tests/get_dftt.bash diff --git a/.github/workflows/compile-check-codecov.yml b/.github/workflows/compile-check-codecov.yml index a2b96c0ac4..3a4c937184 100644 --- a/.github/workflows/compile-check-codecov.yml +++ b/.github/workflows/compile-check-codecov.yml @@ -28,6 +28,7 @@ jobs: env: MAKE_OPTS: -j2 + NOHARDFAIL: TRUE steps: # https://github.com/actions/checkout @@ -36,6 +37,10 @@ jobs: with: submodules: recursive + - name: Get disk images + run: | + bash tests/get_dftt.bash + - name: Extract Version from configure.ac id: extract_version run: | @@ -111,6 +116,7 @@ jobs: ./configure CFLAGS='-g -O0 -fprofile-arcs -ftest-coverage' CXXFLAGS='-g -O0 -fprofile-arcs -ftest-coverage' --enable-silent-rules --quiet make clean make $MAKE_OPTS check || (echo ==error== ; cat test-suite.log; exit 1) + bash tests/get_dftt.bash make check (cd tests; gcov -pb read_apis.cpp) (cd tools/vstools; gcov -pb mmls.cpp) diff --git a/.gitignore b/.gitignore index 51771d689f..82e1a2527c 100755 --- a/.gitignore +++ b/.gitignore @@ -209,3 +209,4 @@ tests/data *.gcno *.gcov *.gz +*.gcda diff --git a/tests/get_dftt.bash b/tests/get_dftt.bash new file mode 100755 index 0000000000..2d83915b7d --- /dev/null +++ b/tests/get_dftt.bash @@ -0,0 +1,19 @@ +#!/usr/bin/bash + +IMAGE_DIR=${HOME}/from_brian + +mkdir -p $IMAGE_DIR + +for fn in 3-kwsrch-ntfs.zip imageformat_mmls_1.E01 imageformat_mmls_1.vhd imageformat_mmls_1.vmdk; do + if ! test -f $IMAGE_DIR/$fn + then + curl https://digitalcorpora.s3.amazonaws.com/corpora/drives/dftt-2004/$fn -o $IMAGE_DIR/$fn + if [[ $fn == *.zip ]]; then + (cd $IMAGE_DIR; unzip $fn) + fi + fi +done + +cp $IMAGE_DIR/3-kwsrch-ntfs/ntfs-img-kw-1.dd $IMAGE_DIR/. + + diff --git a/tests/runtests.sh b/tests/runtests.sh index b1bb073d84..80b39c83aa 100755 --- a/tests/runtests.sh +++ b/tests/runtests.sh @@ -1,11 +1,8 @@ #!/bin/bash -# NOTE: This script is not currently being used anywhere. -# it curently runs fs_thread_test on a set of images that -# are not public +# This script is called by 'make check' +# It curently runs fs_thread_test on a set of images, of which some are public # -# This could probably be renamed to something with threadtest in the name - EXIT_SUCCESS=0; EXIT_FAILURE=1; @@ -29,7 +26,6 @@ check_diffs() if ! test -d ${IMAGE_DIR}; then echo "Missing image directory: ${IMAGE_DIR}"; - exit ${EXIT_IGNORE}; fi @@ -43,59 +39,96 @@ fi if ! test -x ${FS_THREAD_TEST}; then echo "Missing test executable: ${IMAGE_DIR}"; - exit ${EXIT_IGNORE}; fi -rm -f base.log thread-*.log -${FS_THREAD_TEST} -f ext2 ${IMAGE_DIR}/ext2fs.dd 1 1 -mv thread-0.log base.log -${FS_THREAD_TEST} -f ext2 ${IMAGE_DIR}/ext2fs.dd ${NTHREADS} ${NITERS} - -if ! check_diffs; +if test -f ${IMAGE_DIR}/ext2fs.dd then + echo testing ${IMAGE_DIR}/ext2fs.dd + rm -f base.log thread-*.log + ${FS_THREAD_TEST} -f ext2 ${IMAGE_DIR}/ext2fs.dd 1 1 + mv thread-0.log base.log + ${FS_THREAD_TEST} -f ext2 ${IMAGE_DIR}/ext2fs.dd ${NTHREADS} ${NITERS} + + if ! check_diffs; + then exit ${EXIT_FAILURE}; + fi +else + echo ${IMAGE_DIR}/ext2fs.dd missing + [ -z "$NOHARDFAIL" ] && exit ${EXIT_IGNORE}; fi -rm -f base.log thread-*.log -${FS_THREAD_TEST} -f ufs ${IMAGE_DIR}/misc-ufs1.dd 1 1 -mv thread-0.log base.log -${FS_THREAD_TEST} -f ufs ${IMAGE_DIR}/misc-ufs1.dd ${NTHREADS} ${NITERS} - -if ! check_diffs; +if test -f ${IMAGE_DIR}/ext2fs.dd then + echo testing ${IMAGE_DIR}/ext2fs.dd + rm -f base.log thread-*.log + ${FS_THREAD_TEST} -f ufs ${IMAGE_DIR}/misc-ufs1.dd 1 1 + mv thread-0.log base.log + ${FS_THREAD_TEST} -f ufs ${IMAGE_DIR}/misc-ufs1.dd ${NTHREADS} ${NITERS} + + if ! check_diffs; + then exit ${EXIT_FAILURE}; -fi + fi +else + echo ${IMAGE_DIR}/ext2fs.dd missing + [ -z "$NOHARDFAIL" ] && exit ${EXIT_IGNORE}; +fi -rm -f base.log thread-*.log -${FS_THREAD_TEST} -f hfs -o 64 ${IMAGE_DIR}/test_hfs.dmg 1 1 -mv thread-0.log base.log -${FS_THREAD_TEST} -f hfs -o 64 ${IMAGE_DIR}/test_hfs.dmg ${NTHREADS} ${NITERS} -if ! check_diffs; +if test -f ${IMAGE_DIR}/test_hfs.dmg then + echo testing ${IMAGE_DIR}/test_hfs.dmg + rm -f base.log thread-*.log + ${FS_THREAD_TEST} -f hfs -o 64 ${IMAGE_DIR}/test_hfs.dmg 1 1 + mv thread-0.log base.log + ${FS_THREAD_TEST} -f hfs -o 64 ${IMAGE_DIR}/test_hfs.dmg ${NTHREADS} ${NITERS} + + if ! check_diffs; + then exit ${EXIT_FAILURE}; -fi - -rm -f base.log thread-*.log -${FS_THREAD_TEST} -f ntfs ${IMAGE_DIR}/ntfs-img-kw-1.dd 1 1 -mv thread-0.log base.log -${FS_THREAD_TEST} -f ntfs ${IMAGE_DIR}/ntfs-img-kw-1.dd ${NTHREADS} ${NITERS} + fi +else + echo ${IMAGE_DIR}/test_hfs.dmg missing + [ -z "$NOHARDFAIL" ] && exit ${EXIT_IGNORE}; +fi -if ! check_diffs; +if test -f ${IMAGE_DIR}/ntfs-img-kw-1.dd then + echo testing ${IMAGE_DIR}/ntfs-img-kw-1.dd + rm -f base.log thread-*.log + ${FS_THREAD_TEST} -f ntfs ${IMAGE_DIR}/ntfs-img-kw-1.dd 1 1 + mv thread-0.log base.log + ${FS_THREAD_TEST} -f ntfs ${IMAGE_DIR}/ntfs-img-kw-1.dd ${NTHREADS} ${NITERS} + + if ! check_diffs; + then exit ${EXIT_FAILURE}; -fi + fi +else + echo ${IMAGE_DIR}/ntfs-img-kw-1.dd missing + [ -z "$NOHARDFAIL" ] && exit ${EXIT_IGNORE}; +fi -rm -f base.log thread-*.log -${FS_THREAD_TEST} -f fat ${IMAGE_DIR}/fat32.dd 1 1 -mv thread-0.log base.log -${FS_THREAD_TEST} -f fat ${IMAGE_DIR}/fat32.dd ${NTHREADS} ${NITERS} -if ! check_diffs; +if test -f ${IMAGE_DIR}/fat32.dd then + echo testing ${IMAGE_DIR}/fat32.dd + rm -f base.log thread-*.log + ${FS_THREAD_TEST} -f fat ${IMAGE_DIR}/fat32.dd 1 1 + mv thread-0.log base.log + ${FS_THREAD_TEST} -f fat ${IMAGE_DIR}/fat32.dd ${NTHREADS} ${NITERS} + + if ! check_diffs; + then exit ${EXIT_FAILURE}; -fi + fi +else + echo ${IMAGE_DIR}/fat32.dd missing + [ -z "$NOHARDFAIL" ] && exit ${EXIT_IGNORE}; +fi + exit ${EXIT_SUCCESS}; From 8c99fae33f0b909dcc36f77c05cefa371586365b Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Wed, 4 Sep 2024 10:36:41 -0400 Subject: [PATCH 0070/1548] added fsthread test to the gcov report --- .github/workflows/compile-check-codecov.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/compile-check-codecov.yml b/.github/workflows/compile-check-codecov.yml index 3a4c937184..44f7361204 100644 --- a/.github/workflows/compile-check-codecov.yml +++ b/.github/workflows/compile-check-codecov.yml @@ -119,6 +119,7 @@ jobs: bash tests/get_dftt.bash make check (cd tests; gcov -pb read_apis.cpp) + (cd tests; gcov -pb fs_thread_test.cpp) (cd tools/vstools; gcov -pb mmls.cpp) - name: Dump test logfile From 342cb5f00416e49937050527d2c87c2be69599ff Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Wed, 4 Sep 2024 11:08:17 -0400 Subject: [PATCH 0071/1548] do not link with library --- .github/workflows/compile-check-codecov.yml | 11 ++++------- .gitignore | 1 + 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/.github/workflows/compile-check-codecov.yml b/.github/workflows/compile-check-codecov.yml index 44f7361204..dcf71850ff 100644 --- a/.github/workflows/compile-check-codecov.yml +++ b/.github/workflows/compile-check-codecov.yml @@ -116,18 +116,15 @@ jobs: ./configure CFLAGS='-g -O0 -fprofile-arcs -ftest-coverage' CXXFLAGS='-g -O0 -fprofile-arcs -ftest-coverage' --enable-silent-rules --quiet make clean make $MAKE_OPTS check || (echo ==error== ; cat test-suite.log; exit 1) - bash tests/get_dftt.bash + # Now re-link the test program without the library + (cd tests; g++ -o fs_thread_test -g -O0 -fPIC -fprofile-arcs -ftest-coverage fs_thread_test.o tsk_thread.o ../tsk/*/*.o -lsqlite3 -lz) make check - (cd tests; gcov -pb read_apis.cpp) - (cd tests; gcov -pb fs_thread_test.cpp) - (cd tools/vstools; gcov -pb mmls.cpp) + gcov-9 $(find -name '*.o' -or -name '*.c' -or -name '*.cpp') - name: Dump test logfile if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.platform, 'x64') run: | - cat tests/test-suite.log - cat tests/test_libraries.sh.log - cat tests/runtests.sh.log + for fn in tests/*.log ; do echo $fn ; ls -l $fn ; cat $fn ; done - name: List all files run: | diff --git a/.gitignore b/.gitignore index 82e1a2527c..0c142535f3 100755 --- a/.gitignore +++ b/.gitignore @@ -210,3 +210,4 @@ tests/data *.gcov *.gz *.gcda +*.log From 849d55c7b486f03b216cdfa912b0c0f3aa564bae Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Wed, 4 Sep 2024 11:15:58 -0400 Subject: [PATCH 0072/1548] do not link with library --- .github/workflows/compile-check-codecov.yml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/.github/workflows/compile-check-codecov.yml b/.github/workflows/compile-check-codecov.yml index dcf71850ff..39c4aea0bf 100644 --- a/.github/workflows/compile-check-codecov.yml +++ b/.github/workflows/compile-check-codecov.yml @@ -108,7 +108,7 @@ jobs: popd make distclean - - name: C++ checks with codecov + - name: Prepare C++ checks with codecov if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.platform, 'x64') run: | sudo pip3 install coverage @@ -121,14 +121,12 @@ jobs: make check gcov-9 $(find -name '*.o' -or -name '*.c' -or -name '*.cpp') - - name: Dump test logfile + - name: Run C++ checks with codecov if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.platform, 'x64') run: | + make check for fn in tests/*.log ; do echo $fn ; ls -l $fn ; cat $fn ; done - - - name: List all files - run: | - find . -ls + gcov-9 $(find -name '*.o' -or -name '*.c' -or -name '*.cpp') - name: upload codecov report if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.platform, 'x64') From e2aa65dad34c4941bc33f8fd5b4fb7602b23b73a Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Wed, 4 Sep 2024 13:52:48 -0400 Subject: [PATCH 0073/1548] move up the *.gcda files to the directory with the source --- .github/workflows/compile-check-codecov.yml | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/.github/workflows/compile-check-codecov.yml b/.github/workflows/compile-check-codecov.yml index 39c4aea0bf..f51a13bb19 100644 --- a/.github/workflows/compile-check-codecov.yml +++ b/.github/workflows/compile-check-codecov.yml @@ -116,17 +116,10 @@ jobs: ./configure CFLAGS='-g -O0 -fprofile-arcs -ftest-coverage' CXXFLAGS='-g -O0 -fprofile-arcs -ftest-coverage' --enable-silent-rules --quiet make clean make $MAKE_OPTS check || (echo ==error== ; cat test-suite.log; exit 1) - # Now re-link the test program without the library - (cd tests; g++ -o fs_thread_test -g -O0 -fPIC -fprofile-arcs -ftest-coverage fs_thread_test.o tsk_thread.o ../tsk/*/*.o -lsqlite3 -lz) - make check - gcov-9 $(find -name '*.o' -or -name '*.c' -or -name '*.cpp') - - - name: Run C++ checks with codecov - if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.platform, 'x64') - run: | - make check - for fn in tests/*.log ; do echo $fn ; ls -l $fn ; cat $fn ; done - gcov-9 $(find -name '*.o' -or -name '*.c' -or -name '*.cpp') + # Now move the .gcda files from the .libs directories up to the proper location + for dir in base fs img util vs ; do mv -v tsk/$dir/.libs/*.gcda tsk/$dir/ ; done + # Run gcov on the gcda files + gcov-9 $(find -name '*.gcda) - name: upload codecov report if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.platform, 'x64') From 9fce296381f99af2f8ad42f5cb11cd4b0864b6aa Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Wed, 4 Sep 2024 14:04:24 -0400 Subject: [PATCH 0074/1548] do not link with library --- .github/workflows/compile-check-codecov.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/compile-check-codecov.yml b/.github/workflows/compile-check-codecov.yml index f51a13bb19..03644dac9c 100644 --- a/.github/workflows/compile-check-codecov.yml +++ b/.github/workflows/compile-check-codecov.yml @@ -117,7 +117,11 @@ jobs: make clean make $MAKE_OPTS check || (echo ==error== ; cat test-suite.log; exit 1) # Now move the .gcda files from the .libs directories up to the proper location - for dir in base fs img util vs ; do mv -v tsk/$dir/.libs/*.gcda tsk/$dir/ ; done + mv -v tsk/base/.libs/*.gcda tsk/base/ + mv -v tsk/fs/.libs/*.gcda tsk/fs/ + mv -v tsk/img/.libs/*.gcda tsk/img/ + mv -v tsk/util/.libs/*.gcda tsk/util/ + mv -v tsk/vs/.libs/*.gcda tsk/vs/ # Run gcov on the gcda files gcov-9 $(find -name '*.gcda) From e1ee7d9f297d5d7134802c377071234463273b93 Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Wed, 4 Sep 2024 14:13:18 -0400 Subject: [PATCH 0075/1548] do not link with library --- .github/workflows/compile-check-codecov.yml | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/.github/workflows/compile-check-codecov.yml b/.github/workflows/compile-check-codecov.yml index 03644dac9c..482eeb21ae 100644 --- a/.github/workflows/compile-check-codecov.yml +++ b/.github/workflows/compile-check-codecov.yml @@ -117,13 +117,9 @@ jobs: make clean make $MAKE_OPTS check || (echo ==error== ; cat test-suite.log; exit 1) # Now move the .gcda files from the .libs directories up to the proper location - mv -v tsk/base/.libs/*.gcda tsk/base/ - mv -v tsk/fs/.libs/*.gcda tsk/fs/ - mv -v tsk/img/.libs/*.gcda tsk/img/ - mv -v tsk/util/.libs/*.gcda tsk/util/ - mv -v tsk/vs/.libs/*.gcda tsk/vs/ + fs img util vs ; do mv -v tsk/$dir/.libs/*.gcda tsk/$dir/ ; done # Run gcov on the gcda files - gcov-9 $(find -name '*.gcda) + gcov-9 $(find -name '*.gcda') - name: upload codecov report if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.platform, 'x64') From d4e55907c4000ec53b9edfcb49c443ca9ac285e8 Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Wed, 4 Sep 2024 14:19:52 -0400 Subject: [PATCH 0076/1548] do not link with library --- .github/workflows/compile-check-codecov.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/compile-check-codecov.yml b/.github/workflows/compile-check-codecov.yml index 482eeb21ae..ed20614089 100644 --- a/.github/workflows/compile-check-codecov.yml +++ b/.github/workflows/compile-check-codecov.yml @@ -117,7 +117,7 @@ jobs: make clean make $MAKE_OPTS check || (echo ==error== ; cat test-suite.log; exit 1) # Now move the .gcda files from the .libs directories up to the proper location - fs img util vs ; do mv -v tsk/$dir/.libs/*.gcda tsk/$dir/ ; done + for dir in fs img util vs ; do mv -v tsk/$dir/.libs/*.gcda tsk/$dir/ ; done # Run gcov on the gcda files gcov-9 $(find -name '*.gcda') From 690e711ddf86f02af3d0f164d022ea88e8f6adfd Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Wed, 4 Sep 2024 14:33:29 -0400 Subject: [PATCH 0077/1548] do not link with library --- .github/workflows/compile-check-codecov.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/compile-check-codecov.yml b/.github/workflows/compile-check-codecov.yml index ed20614089..5780c156ba 100644 --- a/.github/workflows/compile-check-codecov.yml +++ b/.github/workflows/compile-check-codecov.yml @@ -116,10 +116,12 @@ jobs: ./configure CFLAGS='-g -O0 -fprofile-arcs -ftest-coverage' CXXFLAGS='-g -O0 -fprofile-arcs -ftest-coverage' --enable-silent-rules --quiet make clean make $MAKE_OPTS check || (echo ==error== ; cat test-suite.log; exit 1) + echo test results: + for fn in */*.log ; do echo $fn: ; cat $fn ; done # Now move the .gcda files from the .libs directories up to the proper location - for dir in fs img util vs ; do mv -v tsk/$dir/.libs/*.gcda tsk/$dir/ ; done + find . -name '.libs' -type d -exec bash -c "cd {} ; pwd ; mv -vf *.gcno .." \; # Run gcov on the gcda files - gcov-9 $(find -name '*.gcda') + gcov-9 $(find -name '*.gcda' -print) - name: upload codecov report if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.platform, 'x64') From fd5b81eed593cf722dc9b4d27c61d82bee668d51 Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Wed, 4 Sep 2024 14:43:39 -0400 Subject: [PATCH 0078/1548] do not link with library --- .github/workflows/compile-check-codecov.yml | 12 ++++++++++++ tests/test_libraries.sh | 2 +- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/.github/workflows/compile-check-codecov.yml b/.github/workflows/compile-check-codecov.yml index 5780c156ba..5e68151f21 100644 --- a/.github/workflows/compile-check-codecov.yml +++ b/.github/workflows/compile-check-codecov.yml @@ -108,6 +108,16 @@ jobs: popd make distclean + # https://gcc.gnu.org/onlinedocs/gcc/Gcov-Data-Files.html + # The .gcno notes file is generated when the source file is compiled with the GCC + # -ftest-coverage option. It contains information to reconstruct the basic + # block graphs and assign source line numbers to blocks. + + # The .gcda count data file is generated when a program containing object files + # built with the GCC -fprofile-arcs option is executed. + # A separate .gcda file is created for each object file compiled with this option. + # It contains arc transition counts, value profile counts, and some summary information. + - name: Prepare C++ checks with codecov if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.platform, 'x64') run: | @@ -121,6 +131,8 @@ jobs: # Now move the .gcda files from the .libs directories up to the proper location find . -name '.libs' -type d -exec bash -c "cd {} ; pwd ; mv -vf *.gcno .." \; # Run gcov on the gcda files + find . -name '*.gcno' -ls + find . -name '*.gcda' -ls gcov-9 $(find -name '*.gcda' -print) - name: upload codecov report diff --git a/tests/test_libraries.sh b/tests/test_libraries.sh index 7c5fb1958c..6e2d869bf8 100755 --- a/tests/test_libraries.sh +++ b/tests/test_libraries.sh @@ -24,7 +24,7 @@ for i in ${ggID[@]};do COOKIES=$(mktemp) CODE=$(wget --save-cookies $COOKIES --keep-session-cookies --no-check-certificate "https://docs.google.com/uc?export=download&id=${id}" -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/Code: \1\n/p') CODE=$(echo $CODE | rev | cut -d: -f1 | rev | xargs) - wget --load-cookies $COOKIES "https://docs.google.com/uc?export=download&confirm=${CODE}&id=${id}" -O ./data/${name} + wget --no-verbose --load-cookies $COOKIES "https://docs.google.com/uc?export=download&confirm=${CODE}&id=${id}" -O ./data/${name} rm -f $COOKIES if [ ! -f "./data/${name}" ]; then echo "Error downloading data (${name})" From 8ef1c77cf4a789d03ec2e1c3df7095a391c2d578 Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Wed, 4 Sep 2024 14:54:18 -0400 Subject: [PATCH 0079/1548] do not link with library --- .github/workflows/compile-check-codecov.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/compile-check-codecov.yml b/.github/workflows/compile-check-codecov.yml index 5e68151f21..32c2f72d5c 100644 --- a/.github/workflows/compile-check-codecov.yml +++ b/.github/workflows/compile-check-codecov.yml @@ -128,9 +128,8 @@ jobs: make $MAKE_OPTS check || (echo ==error== ; cat test-suite.log; exit 1) echo test results: for fn in */*.log ; do echo $fn: ; cat $fn ; done - # Now move the .gcda files from the .libs directories up to the proper location - find . -name '.libs' -type d -exec bash -c "cd {} ; pwd ; mv -vf *.gcno .." \; - # Run gcov on the gcda files + echo move the .gcno and .gcda files into place + find . -name '.libs' -type d -exec bash -c "cd {} ; pwd ; mv -vf *.gc* .." \; find . -name '*.gcno' -ls find . -name '*.gcda' -ls gcov-9 $(find -name '*.gcda' -print) From 3897d8722b629816a372914f22d2e91b936f7009 Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Wed, 4 Sep 2024 15:49:29 -0400 Subject: [PATCH 0080/1548] separate things --- .github/workflows/compile-check-codecov.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/compile-check-codecov.yml b/.github/workflows/compile-check-codecov.yml index 32c2f72d5c..aae471abd7 100644 --- a/.github/workflows/compile-check-codecov.yml +++ b/.github/workflows/compile-check-codecov.yml @@ -128,6 +128,10 @@ jobs: make $MAKE_OPTS check || (echo ==error== ; cat test-suite.log; exit 1) echo test results: for fn in */*.log ; do echo $fn: ; cat $fn ; done + + - name: Run gcov-9 + if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.platform, 'x64') + run: | echo move the .gcno and .gcda files into place find . -name '.libs' -type d -exec bash -c "cd {} ; pwd ; mv -vf *.gc* .." \; find . -name '*.gcno' -ls From cb5e911bdf8e989dcaf2c9bba556707e940f47e0 Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Wed, 4 Sep 2024 16:09:01 -0400 Subject: [PATCH 0081/1548] update --- .github/workflows/compile-check-codecov.yml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/compile-check-codecov.yml b/.github/workflows/compile-check-codecov.yml index aae471abd7..14ae8e35bd 100644 --- a/.github/workflows/compile-check-codecov.yml +++ b/.github/workflows/compile-check-codecov.yml @@ -28,7 +28,7 @@ jobs: env: MAKE_OPTS: -j2 - NOHARDFAIL: TRUE + NOHARDFAIL: TRUE steps: # https://github.com/actions/checkout @@ -39,7 +39,7 @@ jobs: - name: Get disk images run: | - bash tests/get_dftt.bash + bash tests/get_dftt.bash - name: Extract Version from configure.ac id: extract_version @@ -129,14 +129,16 @@ jobs: echo test results: for fn in */*.log ; do echo $fn: ; cat $fn ; done - - name: Run gcov-9 + - name: Run gcov if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.platform, 'x64') run: | echo move the .gcno and .gcda files into place find . -name '.libs' -type d -exec bash -c "cd {} ; pwd ; mv -vf *.gc* .." \; + echo gcno: find . -name '*.gcno' -ls + echo gcda: find . -name '*.gcda' -ls - gcov-9 $(find -name '*.gcda' -print) + gcov $(find -name '*.gcda' -print) - name: upload codecov report if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.platform, 'x64') From a29817d53d5e7190a83c49c8b189efcc48d403c3 Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Wed, 4 Sep 2024 16:17:24 -0400 Subject: [PATCH 0082/1548] update --- .github/workflows/compile-check-codecov.yml | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/.github/workflows/compile-check-codecov.yml b/.github/workflows/compile-check-codecov.yml index 14ae8e35bd..c13c05a7bc 100644 --- a/.github/workflows/compile-check-codecov.yml +++ b/.github/workflows/compile-check-codecov.yml @@ -138,16 +138,28 @@ jobs: find . -name '*.gcno' -ls echo gcda: find . -name '*.gcda' -ls + echo running gcov: gcov $(find -name '*.gcda' -print) + echo ls -l tests + ls -l tests + + - name: oldstyle upload codecov report + if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.platform, 'x64') && true + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + run: | + pushd src + gcov-9 *.o *.cpp rar/*.cpp rar/*.hpp + bash <(curl -s https://codecov.io/bash) + popd - name: upload codecov report - if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.platform, 'x64') + if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.platform, 'x64') && false uses: codecov/codecov-action@v4 with: fail_ci_if_error: true name: "Do codecov" verbose: true - directory: tests env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} From a42c23956a6c22f117cb392071fe05b06d37a8f3 Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Wed, 4 Sep 2024 16:22:36 -0400 Subject: [PATCH 0083/1548] update --- .github/workflows/compile-check-codecov.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/compile-check-codecov.yml b/.github/workflows/compile-check-codecov.yml index c13c05a7bc..73b4e4f355 100644 --- a/.github/workflows/compile-check-codecov.yml +++ b/.github/workflows/compile-check-codecov.yml @@ -148,10 +148,7 @@ jobs: env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} run: | - pushd src - gcov-9 *.o *.cpp rar/*.cpp rar/*.hpp bash <(curl -s https://codecov.io/bash) - popd - name: upload codecov report if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.platform, 'x64') && false From 8519024f942c4261491d5ab1a882c0d00142716a Mon Sep 17 00:00:00 2001 From: Joachim Metz Date: Sun, 7 Apr 2024 10:57:12 +0200 Subject: [PATCH 0084/1548] Changed fatfs_dos_2_unix_time to function time zone independent #2317 --- tsk/fs/fatfs_utils.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tsk/fs/fatfs_utils.c b/tsk/fs/fatfs_utils.c index 9495ac923e..440b0dff89 100644 --- a/tsk/fs/fatfs_utils.c +++ b/tsk/fs/fatfs_utils.c @@ -179,8 +179,11 @@ fatfs_dos_2_unix_time(uint16_t date, uint16_t time, uint8_t timetens) * it out */ tm1.tm_isdst = -1; - ret = mktime(&tm1); - +#if defined( _MSC_VER ) + ret = _mkgmtime(&tm1); +#else + ret = timegm(&tm1); +#endif if (ret < 0) { if (tsk_verbose) tsk_fprintf(stderr, From 97f61e1ce01f4beb7024196caf19f6d55572cda8 Mon Sep 17 00:00:00 2001 From: Shane McCulley Date: Tue, 14 Apr 2020 21:00:28 -0500 Subject: [PATCH 0085/1548] Add check for failed HTML downloads, make the script slightly nicer - Quoted vars - Replaced comma delimiter in array --- tests/test_libraries.sh | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/tests/test_libraries.sh b/tests/test_libraries.sh index 6e2d869bf8..6c19bb93f0 100755 --- a/tests/test_libraries.sh +++ b/tests/test_libraries.sh @@ -2,7 +2,7 @@ # Test script to run command line tools against disk images # -# Currently, tests mmls on image files. Will need to be refactored as we add more tests. +# Currently, tests mmls on image files. Will need to be refactored as we add more tests. EXIT_FAILURE=1 @@ -16,31 +16,31 @@ if [ ! -d "./data" ];then fi #Download from images from google drive -ggID=("imageformat_mmls_1.vhd","15vEesL8xTMFSo-uLA5dsx3puVaKcGEyw" "imageformat_mmls_1.vmdk","1uLC0FjUWdl3uLCi1QaZ8O72q281jtzIu" "imageformat_mmls_1.E01","1YBCh3yP4Ny7eads4TC-dL3ycaNNrlzWo") -for i in ${ggID[@]};do - name=${i%,*} +ggID=("imageformat_mmls_1.vhd|15vEesL8xTMFSo-uLA5dsx3puVaKcGEyw" "imageformat_mmls_1.vmdk|1uLC0FjUWdl3uLCi1QaZ8O72q281jtzIu" "imageformat_mmls_1.E01|1YBCh3yP4Ny7eads4TC-dL3ycaNNrlzWo") +for i in "${ggID[@]}";do + name=${i%|*} if [ ! -f "./data/${name}" ]; then - id=${i#*,} + id=${i#*|} COOKIES=$(mktemp) - CODE=$(wget --save-cookies $COOKIES --keep-session-cookies --no-check-certificate "https://docs.google.com/uc?export=download&id=${id}" -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/Code: \1\n/p') - CODE=$(echo $CODE | rev | cut -d: -f1 | rev | xargs) - wget --no-verbose --load-cookies $COOKIES "https://docs.google.com/uc?export=download&confirm=${CODE}&id=${id}" -O ./data/${name} - rm -f $COOKIES - if [ ! -f "./data/${name}" ]; then + CODE=$(wget --save-cookies "$COOKIES" --keep-session-cookies --no-check-certificate "https://docs.google.com/uc?export=download&id=${id}" -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/Code: \1\n/p') + CODE=$(echo "$CODE" | rev | cut -d: -f1 | rev | xargs) + wget --load-cookies "$COOKIES" "https://docs.google.com/uc?export=download&confirm=${CODE}&id=${id}" -O ./data/"${name}" + rm -f "$COOKIES" + if [ ! -f "./data/${name}" ] || grep -q "DOCTYPE html" "./data/${name}"; then echo "Error downloading data (${name})" exit $EXIT_FAILURE - fi + fi fi done #exits with FAILURE status if the command failed checkExitStatus (){ - if [ $1 -eq 0 ];then + if [ "$1" -eq 0 ];then echo "$2 test passed" else echo "$2 test failed" exit $EXIT_FAILURE - fi + fi } #command to check on the images @@ -49,7 +49,7 @@ mmls_cmd=../tools/vstools/mmls #saving the list of supported images to dev variable imgFormatList=$($mmls_cmd -i list 2>&1 > /dev/null | sed '1d' |awk '{print $1}') -# Verify mmls does not return an error with various formats. +# Verify mmls does not return an error with various formats. if [[ "${imgFormatList}" =~ "vmdk" ]]; then $mmls_cmd ./data/imageformat_mmls_1.vmdk > /dev/null checkExitStatus $? "vmdk" From 550c750e313d098c172726ee9906ba968073b97d Mon Sep 17 00:00:00 2001 From: Shane McCulley Date: Wed, 15 Apr 2020 15:45:30 -0500 Subject: [PATCH 0086/1548] Add imageformat tests to data folder instead of downloading every time --- .gitignore | 10 ++-------- tests/data/imageformat_mmls_1.E01 | Bin 0 -> 414941 bytes tests/data/imageformat_mmls_1.vhd | Bin 0 -> 18919424 bytes tests/data/imageformat_mmls_1.vmdk | Bin 0 -> 5832704 bytes 4 files changed, 2 insertions(+), 8 deletions(-) create mode 100644 tests/data/imageformat_mmls_1.E01 create mode 100644 tests/data/imageformat_mmls_1.vhd create mode 100644 tests/data/imageformat_mmls_1.vmdk diff --git a/.gitignore b/.gitignore index 0c142535f3..9c1e10e935 100755 --- a/.gitignore +++ b/.gitignore @@ -203,11 +203,5 @@ unit_tests/base/test_base sleuthkit-*.tar.gz -#Test data folder - -tests/data -*.gcno -*.gcov -*.gz -*.gcda -*.log +# Whitelist test data folder +!tests/data/* diff --git a/tests/data/imageformat_mmls_1.E01 b/tests/data/imageformat_mmls_1.E01 new file mode 100644 index 0000000000000000000000000000000000000000..314b24deddd02b72754fe48978b4fe51e8f4e589 GIT binary patch literal 414941 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

xX_uozg3G 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 z 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͡|E{s*ZEs=fKPycJJpR2+hb25l^=t7fKm9Uk&C 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 z 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

rmIfI-<&LQWK3&=&}5^@>2f?P$e zA=i-`$W7!HavQmW+(qso_mKz4L*xWZ7$WP=K@*7D+{vdyme^Dz}QZyNw98H0yL{p)u(KKjUG##2A&46Y^ zGohK$ENE6V8=4)>f#yVWp}EmKXkHXSQ4~XQG!7+D5~WZYWl$F7P#zUf5e2A(LNtcT zsDi4fhU%z+ny7`^sDrwwhx%xMhG;yR56zDjKntRU(86dDv?y8(EsmBzOQNOF(r6j9 zELsjNk5)h{qLt9fXce?7S`Dp^)6mSE8%X)#w^@ExHa}k8VIWqMOjo=oWM9F)z1}r0% z3CoOS!Lnl6uvVi<;FaTtM-7=_UogRvNg@tA;#7{DY9Vlhm{ z6imf5OvenOCl9L&W$%*O&O#Nx4hSbnSkRuC(M6~>BSMX_R7ajXPZ5-Ww3#>!x2 zv2s{>tO8aMtAtg?s$f;IYFKrw238ZRh1JIDV0E#2SbeMk)(~riHO87?O|fQJbF2l{ z5^IIE#@b+Qv36K{tOM2&>x6a2x?o+gZdiA$2i6noh4sezV12QESbuB)HV_+x4aSCG zL$P7laBKuN5*vk$#>QY{v2oaVYyvhBn}kiqreIUCY1njZ1~wC$h0Vt1U~{o~*nDgO zwh&u{Eyk8$OR;6xa%=^*5?h6>#@1kKv31ybYy-9t+k|b#wqRSaZP<2f2euR2h3&@n zUY#+8CJAfU;4q=C}BiK>w7xft|!oVW+V(*jelxb{@NcUBoV7m$56@RqPse z9lL?u#BO1?u{+pZ>>hR>dw@N}9$}BMC)iW$8TK4|fxX0DVXv__*jwx!_8$9yeZ)Rt zpRq64SL_@19s7a(#C~DFu|(_-_80qyCBc*8$?)WO3OpsA3Qvuv!PDaD@bq{FJR_b7 z&x~imv*OwC?0615C!Pz>jpxDh;s}o77>?s{IDwNmh0{2Lvp9$IxPXf|z$F~wFX0$vfXgjdF^;8pQzcy+u6UK6i{*T(DMb@6(5eY^qQ5O0Jx#+%?x@n(2)yanD8 zZ-uwU+u&{Sc6fWd1Kttugm=cf;9c=2T1NcGw5Pldxf*-|?;m7e4_(}W}ei}c6pT*DN=kW{pMf?(e8NY&G#joMl z@f-L}{1$#2zk}b!@8S3H2lzw$5&jr|feJ0rUz36Xt~1Cc|KBavf~6OmJq zGm&$V3z18aE0JrF8l2a!jSCy{577m-(yH<5Rd50OuiFOhGNACX^?#K_-B z8X_%`jz~{rATkn}h|I+Q%z22s1VW$$M&Lv)A~*5ha~wesA^`}AfJBUt358JqSM~^> z2#An~C-M>bi2}s`%q59ZL}{W7QI;r26emg$|2>x{Di9TkT0~`{4pEh;M^q;o5H+J* zJIZyVTtCV!iB?2wq7BiOXh*asI{dG^o7h8~AWjmeh||O^;x_Sv_({AXUK78F-$Z|6 z05OsnMT{oK5MzmP#CT%D|H?CoS;TB&4l$RQN6aS{5dSl;Bvuiti8aJpVjZ!b*g*Wx zypz~PY$g(jt;9BBJF$cKPyWw;N+9+U`-uI-0pcKWh&V$WA&wHqh~xkFzn&q^66c8X z#0}ymaf!H0Tp_L!*NE%?mH)FJcZj>hJ>ov`f_OyfYGWpolPRJ`u2f`dG7XuQOh=|C zGmsg{Ok`#<3z?P7MrJ2-kU7a*WNtDKnU_RJl*C9pI`j#WBq@?68ImPAk|zaHBmpUr zkc^QssgNqEkveIRCTWp2>5wkzkvn_HG&zPGOO7MQlM~2^soJII~n zE^;@yhfE;%lKaU0*NjcCV7jzP2M5zlK05_J|Uly&&cQG3-TrTihNDJA>Wek$oJ$2 z@+0|){7il!zmng`@8l2iC;5x~O(v3m$iL*jXnaFbDjAiWN6Ag4lttN;L%Ebk`BXrKR6LcB%1;%b3Q~or!c-BeC{>IqPL-faQl+TU zR2ix)RW91D0#%W!L{+A$P*tgFRCTHbRgI`+3I!B$SE>IV#OVnlR3U!sbMqQ_FP&cVt)NSexb(gwF-KQQ<52;7gW9kX@ zlzK)zr(RGmsaMo%>J9aldPlvdK2RU2Pt<4X3-y)yMt!G#P(P_()Nd-0`a}Jt{!vMy z;SI^?`LEz*FNXh_FsnO10()@YqJXp^>Rn|5fI_Gq6D=#Y-5^U?X~ z0(3#T5M7uqLKmfr(Z%T!bV<4tU79XKm!-?m<>?A^MY(TY;26RKZ5#5+>LN}$G(aq@=bW6Gw-I{Jgx24?nC#b`_cXB0rWt65IvY4LJy^f(ZlHx^hkOXJ(?avkEO@a*)>jMtT#ynchNgrMJ=B=^gY=dKbN$-a{wQd+B}je)<4?kUm5orjO7^>0|V9`UHKF zK1H9V&(LS-bM$%o0)3IbL|>+_&{yee^mY0MeUrXL-=^=-cj1XtF`UU-xenr2g-_URAcl3Mu1O1WyM1Q8g&|m3q^mqCP{geJh|E3e^KlESvADx6r z$|PfwGbxyqOe!WdlZHvlq+`-E8JLVrCMGkJg~`ffW3n?jn4C;5CO4CZ$;%)N%3uu6 z#4!XzG898I48t-U!!rUSGJug7$ix_#Q5coc7@aW~ld%|^aTu5J7@rB4kcnsVG5MJS zOhKj)QrrrV>+`slrrcsxj4>8ca>57E_z4 z!_;N!G4+`SOhcv-)0k<(G-aAG&6yTVOQsdmnrXwdW!f?AnGQ@xrW4bd>B4knx-s3E z9!yWB7t@>R!}MkPG5whV%s^%kGng5|3}uEf!ni<24WyUe%nF-89W)d@* znZitErZLl*8O%&(7Bicf!^~yoG4q)P%tB@nvzS@JEM=B4%b69-N@f+anpwlFW!5q4 znGMWFW)riS*}`mPwlUk89n4N<7qgq$!z3_!nSIQD<^Xe$Im8@hjxa}=W6W{p1ap!( z#hhl&FlU)_%z5SlbCJ2kTxPB?SD9;?hlexv*X6`U|nS0EA<^l7NdBi+so-j|D zXUucv1@n@5#k^+TFmIW6%zNeo^O5<)d}h8dUzu;rcjgE4lljH`W)hh{%wOhTG`J^e zG`b@>n}SWrreagGY1p)EIyOC6;@?6R%Z>?WG&Wa9oA(%)@K7YWaHUY@owgOv`t;AMltFTqsYHW4323wP@#nxu) zuyxsbY<;!?+mLO-GuwgcOd?ZkFwyRco^Zftk9 z2iueF#r9_VuzlHnY=3qDJCGg34rYh2L)l^MaCQVck{!j4X2-B&*>UW6b^<$*oy1ON zr?6AmY3y`%20N3T#m;8uuyfgY?0j|syO3SPE@qdoOW9@Ya&`r~l3m5FX4kN5*>&uC zb_2VS-NbHYx3F8;ZR~b-2fLHq#qMVJunFv5b|1T+J-{Ah53z^YBkWQ37<-&O!JcGK zv8UNH>{<34d;b5`Hm}&%>>Kti`;L9jeqcYcpV-gr7xpXrjs4F4V1Kf|*xzg-`-lC@ z{$rDHNx5WPaxMjzl1s&<=F)I!xpZ85E(4d5%fw~ovT#|sY+QCO2bYt}#pUMmaCtd| zLphAYxj2sCNRHxYj^S92<9JTsL=JEg2e}w0a|)+&8mDsxXL1&2a}MWn9_Mob7jp4j zJ}y63fGfxq;tF#`xT0J!t~ghME6J7ON^@nnvRpZ?JXe9M$W`Jhb5*#iTs5vbSA(m` z)#7S%b-21*J+402fNRJ#;u>>JxTah)t~u9&Yst0ZT61lfLq8d;udpDxTV}OZaKGtTgk2BR( zwcI*xJ-30|$Zg^_b6dEr+%|4Iw}acs?c#QGd$)A8x~417jD6Q7yS!e`~P@!9ztd`>PzA#^eFUl9=i}NM;l6)z?G+%}<%a`NJ^A-4td?mgzUxlyASL3VmHTar* zExtBihp)@mm z%dg|t^Bee${3d=gzlGn*Z{xS~JNTXaE`B$^hfm=5^85Jx`~m(Te~3TKAK{Pk$N1y? z3H~I1ia*Vt;m`8t`1AY){vv;gzsz6ZukzRU>--J=CVz{+&EMhg^7r`r`~&_W|A>Fg zKjEM9&-my33;relihs?&;otJ_`1kw={v-d1|IB~kzw+Ps@B9z`C;yB8%_s7I_`m!= zK8cW2NG2o~QV1!9R6=SYjgVGIC!`lL2pNS;LS`Y0kX6VgWEXM>IfYz8ZXu75S3m?* zzyw@~69|D6D1jCjffYD`7X(2RfFKD_hzYWw2&$k7x?l*VUz7PnZ5HI8t z@(TrofI)5ohC(BuvCu?lDl`+C3oV3}LMx%Q&_-x0v=iD39fXcTC!w>@Md&JY z6S@mMgq}h#p|{XS=qvOS`U?Yufx;kRurNdzDhv~b3nPS)!YE<1Fh&?Fj1$HS6NHJv zBw?~JMVKl~6Q&C@gqgxDVYV7XvXA=?kBvuxyh*iaEVs){GSW~Pe z))woCb;WvOeX)VqP;4YN7MqAo#b#o2v4z-DY$di9+lXz&c4B+6gV<5*Bz6|Nh+V~Q zVt28J*i-B!_7?kyeZ_uae{p~~P#h!<7KeyK#bM%bafCQh93_qx$B1LaapHJ!f;dr} zBu*Bmh*QOB;&gF_I8&S@&KBp0bH#b$d~t!eP+TM~7MF-i#bx4hafP^2TqUj+*NAJy zb>ez)gSb)LByJYBh+D;N;&yR|xKrFE?iTlm3F2OHpSWK<(@6as}o z5l|Eq1I0lJP!f~^r9l}`7L)_!K?P6|R05Sj6;Ksa1JywdP!rSwwLu+F7t{mwK?Beb zGy;u56VMbi1I1I~hT;5@hhE`m$oGPnY+f@|P9 zxB+g0Ti`ah1MY%*;68W&9)d^UF?a%=f@k14cmZC5SKu{x1Kxsn;63;NK7vo+Gx!3& zf^XnE_yK-`U*I=L1b@I^@DC)3hBYRWl1nM1lu{}wwUkCmE2WdtOBtk$QYI<0lts!a zWs|Z?Ii#FYE-AN^N6IT95-MR59zEtKBvPUzT4E$t;v`-YBvAsABta=A$&w6RD}xOlmH*kXlNuq}Ea! zsjbvbYAEF7=RlO1-4sQXi?W)KBU!4Uh&(gQUUI5NW71Od2kY zkVZQsx(cSF3pf;O0%Td(i~~7G*6l@Esz#Ui=@TU z5^1TlOj<6jkXA~oq}9?IX|1$QS}$#oHcFeM&C(WWtF%qpF71$ZO1q@p(jF;6+AHmo z_Dct(gVG`CuyjN^Djk!KODCk0(kbb*bVfQWos-T>7o>~QCF!zsMY<|oldelQq?^($ z>9%x7x+~q2?n@7(htebIvGhcGDm{~)OE09C(ktn;^hSCsy_4QcAEb}cC+V~FMfxgz zlfFwoq@U6+>9>?9{gM7k|D+@^DNF{F!xS(jOa)WJG%zhp2h+n0FeA(aGs7$}E6fJ7 z!yGUt%ms79JTNarAPO;v!#GGl5>k+c3}hh(c_=^;0w_TUV^D?)RG|iSXh0KM(1s3l zp$B~!z!1j6d@w&O01LuGurMqFi^5{CI4l86!cwp_ECb8Ja~Yy;cEcCbC{06W4?urure zyTWd;JL~~_!d|d9>;wD4ey~3r00+WBa4;MKhr(fSI2-{-!clNE90SL~ad14G04Ksp za59_%r^0D)I-CJ#!dY-OoCD{=d2l{l02jhVa4}p0m%?RmIa~o(!c}lJTm#p_b#Oi0 z05`%-a5LNjx5903JKO$6cnBVbN8nL-3?7Fk;7NE2o`z@O zS$GbfhZo>QcnMyHSKw864PJ*g;7xc7-iCMJU3d@PhY#RG_y|6RPvBGd3_gc1;7j-l zzJ_n$TlfyXhacca_z8Z7U*K2x4St6|;7|Aq{)UP05Bv-N!6eb3)?~5du@teCu~f0t zu{5!?v2?NYu?(?{u}rbdu`IEyv23yIu^h3Sv0Sm-u{^Q7F(ih@uoxb_;v-^YjEd1Q zCdS6N7#|a2VhqHj7>vbYa!iS-vHyR6zd@{Fq;afCtZ6KW=83k5wTQKfw28EfwU2d( zb&Pe2b&hn6b&K?f^^En3^^Wz4^^Nt5^^XmR4U7zq42=wrjEszqjE#(sOpHv9OpQ#B z%#6&A%#F;CEQ~CUER8IWtcaGjM>?2PP=Bt-T_4nz(`jzo?{PDD;c z&P2{dE<`Rxu0*ayZbWWH?nLfI9z-5Rp2VKUp2eQWUc_F;Ud3L=-o)O<-o@U>KEyu8 zKE*!AzQn%9zQw-Be#Cype#L&r5@Ua2e`Eh*3;#dtU*u&$7G)qyGL&PoEGx1qYqBmI zvMF1#EjzL+d$KPFawx~k`Q-d^0lA=DNG>cFk&DX31a@(y{Yyi49K?~xPaz4AVJ zzkEPGC?Ap!%SYs+@-g|id_q1cpOR0@XXLZ;Ir+SNLB1$ok}u0w{we>Gf6IyTANjBRPfijIX-=jjS5hb`l~hV32fl5q~6-7}MP0QblQd}valvGM7rIj*DS*4s(Ua6o| zR4OTzl`2YArJ7P*siD+VYALmqI!axoo>E_Fpfpq(DUFpTN>ino(p+hwv{YItt(7)P zTcw@SUg@B8R5~f0l`cwGrJK@S>7n#gdMUk?K1yGupVD6$pbS(7DT9?E%1~vPGF%y< zj8sM`qm?nrSY@0tUYVdwR3<5tl_|NDW%4Ow>a#gveTvu)=HSITSUjq+A`r@U7_C?Azi%4g+^@>Th! zd{=%bKb2p~ZzWOrqx@C=DM{3%YBDvsnnF#frczU@Y1Fi8IyJqTLCvUUQZuVr)U0YY zHM^Qa&8g;6bE|pOyeguiDyHIUoJy#qN~yHUsI1DVyeg=o3RFpjYD|??MO9Tz)m1|^ zRZF#1M|D+C_0>QP)p#|ZnqMuT7E}wVh1DWzQMH&_TrHuNR7XwVYaBt)Ny^ zE2)*$Dr!}=np$10q1IGuskPNQYF)LST3>CTHdGs_jnyVpnmS#bq0Urisk7BN>Rff6I$vF&E>st(i`6CS zQgxZSTwS5AR9C61)ivr`b)C9i-Jot%H>sP|E$UWvo4Q@yq3%?7sk_xZYJ$2~-KXwX z52y##L+WAmhS^_idR9HBo>woZ7u8GZW%Y`BRlTNOS8u2{)m!Rq z^^SU1y{Fz+AE*!2N9tqsiTYH1rao6+s4vx5>TC6l`c{3XzE?k}AJtFlXZ4HvRsE)Z zSAVEK)nDpwHBtSe{#E~}NwlQVi0{<>jrw}3YKVqvn1)BCJ%mPTltyce#%i3#Yl0?fK$A46#WYz{G*#0yT{ARO zvou?CG*|O9UkkKQi`VjL`LzOCL9LKhSSz9x)rx7wwGvuMt&~<;E2EXw%4y}b3R*?2 zl2%!(qE*$ZY1OqFT1~B%R$Hs1)z#{0^|c0CL#>h4SZks+)tYI|wH8`St(DeVYooQ* z+G*{z4q8X8lh#@5qIK1}Y2CFRT2HN))?4eN_0{@m{j~wwKy8pVSR0}Z)rM)qwGrA# zZIm`z8>5ZY#%bfV3ED($k~UeJqD|GNY16eC+DvVhHd~vc&DG{<^R)%qLT!<@SX-hk z)s|_?wH4Y*ZI!lKTcfSj)@kdt4cbO+leSsgqHWc-Y1_3O+D>hkwp-hyC1`uKecFEQ zfOb$jq#f3dXh*eU+HviKc2YZ~oz~81XSH+MdF_IBQM;sF)~;w*wQJgS?S^(!yQSUM z?r3+ld)j^Nf%Z^)q&?Q2Xiv3g+H>uN_ELMLz1H4nZ?$*Yd+mevQTwEQ*1l+8wQt&Y z?T7YL`=$NX616|tU+tfkL{F+G)068d^ptukJ++=jPphZX)9V@ZjCv+Lvz|rIs%O)) z>pAqCdM-V;o=4BCBRZ;MIYUE&f-dSnmvpGdbXiw)Ro8S~H*{0C zbX#|HSNC*Z5A;xv*YoN5^#Xc9y^vm5FQOOKi|NJn5_(C!lwMjdqnFjo>E-nbdPTjG zURkfASJkWO)%6;BO}&<0Td$+n)$8f?^#*!Fy^-EnZ=yHVo9WH<7J5s)mEKx!qqo)D z>FxCndPlvJ-dXRWch$S;-Sr-NPraAkTkoUy)%)rF^#S@oeULs_AEFP{hv~!h5&B4d zls;M?qmR|c>ErbY`b2$_K3SilPt~XC)AbqpOnsIFf0k`bK?|zFFU*Z`HTy+w~p#PJNfYTi>H6=zH~j`hNX@ zeo#N8AJ&iPNA+X+as7mTQa`1i*3al?^>g}p{epf`zocK*ujp6xYx;HlhJI7OrQg=? z=y&yd`hER@{!o9UKh~eQh%kt*5BxF^>_Mv{e%8d|D=D`zvy4}Z~Axr zhyGLlrT^9w^*{Pw{hyvBTAU%7k=#gOq%=|)sf{#7S|gp2-pF8NG%^{PjVwl1Bb$-k z$YJC(av8aeJVssvF;D|D@TjbhFi3+kXoE3WgEM$TFhm0wk^zmFAsdRJ8k(UShG80( zVH=L&8lK@Bfe{+3WZY1A@m8+DAjMm?jx(ZFbEG%^|+O^l{SGo!iD!f0u1!dPjnGFBUFjJ3u(W4*D#*l27rHXB=vt;RNEyRpOAY3wp~8+(idW3RE#*l!## z4jPAy!^RQgsBz3VZk#Yq8mElY#u?+Ran3kzTre&gmyFBC72~RL&A4vdFm4*RjN8T? zW}d@w#5pN!AO7vrn(&G>Ho zFn$`pjNeA0@yGaU{4S zn^nxJW;L_AS;MSp)-r3Gbqz-(wXG8>ys%%)~Dv$@&AY-zSKTbpgnwq`rC zz1hL+Xm&C?n_bMVW;e6D*~9E<_A+~$eayaQKeN9%z#M1}G6$PO%%SEmbGSLe9BGa+ zN1J2JvF12)yg9*~XihRGn^VlG<}`Dy%**B#^Qw8xyl&nwZ<@Ev+vXkf zu6fVAZ$2;|nvcxK<`eU&`OJK7zA#^!ugurx8}qIC&U|lvFh81~%+KZ*^Q-yI{BHg* zf11C{-)5ru$NX#lGm}IMvm~>UTPduRRw^sCmBvbIrL)po8LW&}CM&a*#mZ`Bv$9(` ztejRZE4P)$%4;DOYGD>0mGlx8X;Bt!F&1la7HnrItxi^FtBcju>SlGfdRRTJURH0bkJZ=eXZ5!RSOcv=)?jOhHPjkr4Yx*EBdt-^ zXlsl$)*5Gxw_<=S=MZ8jy2bsXU(@3SPQL1)?#akwbWW> zEw@%!E3H-5YHN+P)>>z+w>DTCtxeWuYm2qj+GcIHc33;DUDj@EkCkBUwf0&2tpnCU z>yUNWI$|BQj#tq0aa>yh=?dSX4bo>|YW7uHMbmG#->o0k zPwSWU+e)&Q5PZwt0)16#789kXRyu~l2Mb=$B_+p=xj zv0dA>ds*fs51c5S*S8zk4edsDW4npn)NW=sw_DgP?N)YcyN%t}ZfCc* zJJ=oVPIhOzi`~`kW_P!H*gfrDc5l0n-Pi7C_qPYw1MNZfV0(x?)E;IJw@26`?NRn< zdyGBS9%qlYC)gA1N%mxWiaphyW>2?g*fZ@}_H28OJ=dOR&$k!Y3++YrVta|b)Lv#U zw^!IJ?N#<_dyT!;UT3ejH`p8PP4;Gci@nv}W^cE5*gNfA_HKKRonY^^_u2dH1NK4t zkbT%bVjs1S*~je@_DTDcecC=_pS91~=j{vjMf;L{*}h_5wXfON?Hl$@`<8v%zGL6D z@7ee52lhkzk^R_yVn4N?+0X44_DlPf{n~zGzqQ}l@9huvNBfig+5TdGwZGZl?H~3} z`=bc|I>nsgP6?-^Q_3mrlyS;B<(%?P1*f7@$*JsA zajH7ioa#;ur>0ZOsqNHp>N@qD`c4C@;zjI?bHsP79}{)5>Y>v~k)x?VR>b z2dAUc$?5ELak@I)obFB!r>E1)>FxA!`a1ob{>}hrpfkuB>+I>Vgd&Io6uGs+q5 zjB&;~@0DXI?J5p z&I)Ixv&vcRtZ~*l>zwt@24|zQ$=U2|ake_!obApIXQ#8v+3oCc5}duxK4-skz&Yp~ zat=F3oTJV$=eTpiIq95oPCI9uv(7o^ymP_1=v;CxJ6D{m&Nb({bHlmm+;VO^cbvP< zJ?FmjzD>%&MmLk2+0Ei+b+ftI-5hRC zHT0g;8m{SDuI)Om z>w2#525#uayZPMwZUMKTTgWZ!7IBNZ#oXd<3AdzM$}R1dam%{p-12S(x1w9gt?X8D ztGd

TV6Urd!Lc?bdPYy7k=pZUeWW+sJL~HgTJ}&D`d03%8})%5Ckoaof7>-1cq< zx1-z1?d*1OySm-n?rsmar`yZz?e=l|y8Yb#?f`e7JIEdE4snON!`$KS2zR7A${p>F zamTvj-0|)NccMGVo$O9=r@GVJ>Fx}7raQ}>?ap!My7S!m?gDqAyU1PaE^(K-%iQJe z3U{Tu%3bZQao4)*-1Y7TccZ(>-Ry30x4PTh?d}eDr@PDD?e1|C+`aBTcfWhUJ?I{C z54%U)qwX>HxO>7q>7H^=yJy_9?m73od%?ZvUUDzHSKO=aHTSxE!@cR=a&NnL+`H~Q z_rCkUeds=NAG=T7r|vWNx%>ArGbyKmgL?mPFr`@#L_esVv%U)-Vypmoiue4XjE9;f>%6k>Oie4qJvRB2c z>Q(cqdo{e8UM;V-SI4XC)${6m4ZMb4Bd@X7#B1s`^O}1typ~=oueI04YwNZ1+ItUHzFdp*3KUN5h=*T?JY_4E3B1H6IWAaAfY#2e}j^M-pPypi50Z?reY z8|#hp#(NXIiQXh{vNy$>>P_>edo#S5-YjpnH^-an&GY7a3%rHiB5$#`#9Qhu^Ok!n zyp`T6Z?(6^TkEa!)_WVgjov12v$w_D>TUD3dpo?H-Y##qx5rEH_Imrg{oVoZpm)eS z>>crrddIxu-U;udcgj2Mo$=0k=e+aY1@EGF$-C@b@veH;yzAZ#@1}RlyY1ca?t1sU z``!cZq4&sp>^|>kMjwi^eLbA8K3nzpZ5h{^now=(2x1DulTC3`MPiTrf>PS@A$6o z`Mw|cp&#$(^Yi-!{DOWVzp!7#FX|Wbi~A+~l71<_v|q+A>zDJ(`xX3(ekH%MU&XKL zSM#g;HT;@>Ex)#3$FJ+x^XvN!{Dyubzp>xMZ|XPmoBJ*NmVPV0wco~X>$mgU`yKp_ zekZ@P-^K6hck{dZJ^Y@2FTc0n$M5U+^ZWY){DJ-;f3QEqALyPut`xE?${v?00KgFNwPxGhyGyIwUEPu8?$DixZ^XK~u{DuA^f3d&BU+OROm-{RH zmHsM!wZFz+>#y_I`y2d?{w9C3zs29`Z}YeNJN%vgE`PVb$4~J0`uqI-{sI4>f5<=V zAMua+$Nb~|3IC*j%0KO&@z46_{PX?=|Du1%zwBS}ulm>g>;4V@rhm)7?cee5`uF_% z{saG^|HyyrKk=XX&-~~93;(76%75*@@!$II{P+F`|D*rO|LlM9zxv<&@BR<}r~k|U z?I-$w{J;J`KS_`@NERdyQUoc3R6*(>O^`N77o-m|1Q~-&LFOP!kTu8_WDjx#IfGn5 z?jTQ)H$Vb3zydsK<0AqxpaMEz0yf|RJ`e&i0D%<1AQs4h5~zU|=z$TKffd++6S#pF z_(2eaL41%e$R8943I>IO!a(<%76yxg#lezbX|OC<9;^sf z2CIVA!J1%gur631YzQ_6n}W^3mSAhJE!ZCH2zCa$g5ANMAR*Wr>2ZDpaq2O?E zBsdxz3yudTf|J3i;B;^%I2)V`&IcEQi@~Mfa&RTM8e9vm2RDM7!L8tSa3{DM+zajp z4}yomqu_DyBzPJ;3!Vorf|tRo;C1jOcpJP6-UlCokHM$lbMPhj8hi`B2S0+J!LQ(V zkQn?4{s#YoBw^ApS(rRb5vB}Ng{i|dVcIZVm_E!9W(+fhnZqn$)-YR`J ztRB_~YlgML+F_lrZdfm@A2tXZhK<6;VUw_F*eq-wwg_8>t-{t}o3L%zE^Hrm2s?(I z!p>oruxr>Y>>lI4m3At_W9# ztHRacns9BnE?ggO2sehC!p-59aBH|N+#c=-cZR#d-Qk`vA>1483-^Zy!h_+V@Njq} zJQ^MgkB2A1li{iGba*B_8=ec#hZn+&;id3$cqP0VUJI{>H^Q6Yt?+huC%hZp3-5;y z!iV9b@NxJgd>TFrpNB8Pm*K1Mb@(QH8@>zQhabX^;ivF(_$B-reha^cKf<5kukd%6 z82$>sf zU&5OY%a0Yn3Sxz@!dMZkC{_$Bj+MYlVx_RsSQ)G=Rt_tVRlq7@m9WZK6|5>&4XcjT zz-nT(Fbu;n0wXaBqcH|!F%AP5j|rHFNtlc&n2Kqbjv1JVS(uGEn2ULsk3lTJLM*}% zmW0*D>R@%TdRTp|0oD*}gf+&RU`?@RSaYle))H%lwZ__DZLxM(d#nT25$l9?#=2l# zv2Iv*tOwQ;>xK2k`e1#repr8O05%XCgbl`qU_-HC*l=tFHWC|!jmE}cW3h4Acx(bT z5u1cf#-?CXv1!5!-}q#;`rdyM^7x?qGMZd)R&K0rn7kggwTd zU{A4U*mLX!_7Z!Ay~f^PZ?SjSd+Y=D5&MLF#=c-*v2WOS><9J}`-T0+{$PKxWO#Bs z1)dU5g{Q{T;A!!6czQeoo)OQ4XU4POS@CRmc02};#dF{}@mzRrJP)21kHh2f1UwP{ z56_3^#|z*E@j`fEya-+tFNPP#OW-B(Qg~^+3|T*eh##Wh^V4cx>n+{PW;#Xa1|As*l%9^nX2 z!fWGo@Va z_&R(&z5(BeZ^Ad@Tkx&;Hheq21K)}7!gu3)@V)pxd_R5wKZqZ~593GhqxdoWIDP^@ ziJ!tx<7e=*_&NMMegVITU&1frSMaO&HT*h$1HXyi!f)eu@Vodu{678we~3TAALCE( zr}#7cIsO8FiNC^M<8Sb{_&fYP{sI4pf5JcGU+}N^H~c&P1OJKt!hhp`@V|I6A~}(Q zNJ*q3QWI&2v_v{0J&}RPNMs^16IqC?L^dKj5ktfhIf$G@E+RLPhsaCB5%EL6^TkjWugjEm8eEkCu$Hi ziCP3k-~>UC1VzvUL$Cx#0D>n3LL?+YCKN&?G(sl~!XzxhCLF>gJi;d+5fC8}5r{}4 zY7=#cxKJkEfNIW7Q6Hkbz z#53YK@q&0sydqu`Z-}?VJK{a@f%r&#B0dveh_A#q;ydw!_(}XCeiMI)zeF-JIhle? zNv0xGlWEAbWI8fEnSsnmW+F3_S;(wpHZnUIL&lOh$ed&@GB=rr%uB|R@niy-Nd8CW zBlD95$bw`cvM^bMEJ_w5i<2eDl4L2eG+Bl$OO_+clNHE{WF@jPS%s`hRwJvEHOQJ| zEfOPfk|0TvB59H#S&}0G$&&&pk`gJC3aOGBsgnk2k``%`4(XB}>64HQ$dHUkL?)57 z$vR|RvL0EVY(O?7896$~v2a$uxA>>eU7&)9AL5?Ixk)z2m2za@@Fja&qN)@AuQzfX9R4J-7RfZ}{m7~g26{w0-C8{!2g{n$bqpDLisG3wQ z3Zrm}ph$|MXo{g&ilYFOu9SdQrWpK2%?-AJv~4Kn|HJlnjjig3Vqp2~}SZW+Ko|-^Sq$W|5 zsVUS{Y8o}2nnBH^W>K@LIn-Qg9yOm@KrN&eQH!Z1)KY30wVYZ(t)x~_tEn~AT527& zp4vcdq&88TsV&r2Y8$nk+ClB4c2T>jJ=9)mAGM!4KpmtGQHQA`)KTgfb(}guoup1t zr>Qg4S?U~hp1MF?q%KjHsVme~>Kb*OxKpZ)`a%7qeo?=vKh$3;8J(O?L8qis z(W&V)bXqzcou1A>XQVUHndvNaRyrGl{?x)5EMEL|7=-PB0 zx-MOhu1`0h8`6#F#&i?9Dcy{2PPd?2(yi#$bQ`)Y-HvWgcc44co#@VV7rHCmjqXnO zpnKB2=-zZ6x-Z?2?oSV(2hxM+!SoP%C_RiGPLH5R(xd3n^cZ?9J&qnvPoO8#ljzCx z6nZK>jh;@=pl8yv=-KofdM-VWo=-2J7t)L9#q<(-DZPwdPOqR>(yQpz^cs3Cy^dZ_ zZ=g5Qo9NB-7J4hajowc0pm)-{=-u=ldM~|?-cKK(57LL|!}JmQD1D4RPM@Gp(x>Rt z^cngreU3g)U!X72m*~s%75XZDjlNFbpl{N*=-c!i`YwHszE3}(AJUKL$Mh5WDgBIo zPQRdE(y!>(^c(su{f>T5f1p3opXkr@7y2vxjs8ympnuZ8=->1o`Y)Y~NzSBTQZlKS z)Jz&CEt8H(&tzaSGMSjnOco|9la0yF#4xc;4kjm)i^rQ2@-g|D z0!%@s5L1{b!W3nSF~yk@Oi88`Q<^Emlx4~><(UdhMWzx{nW@55WvVgNnHo$@rWS)S zI72WbLoqbNFf79{fZ-W|5gCb*8HG_9jnNr{F&T@o8HaHhkMSAE1Wd?83}TX)+Dsj$ zE>n-G&op2fGL4wVOcSOl(~N1(v|w5?t(ewK8>TJOj%m+yU^+6Ln9fWWrYqBp>CW_E zdNRG3-b^2+FVm0d&kSG&GJ}}G%n)WMGmII|j9^AGqnOdm7-lRpjv3EPU?wt?n90l( zW-2p{na<2$W-_yw*~}bfE;Emr&n#dTGK-kS%o1iPvy55JtYB6$tC-cy8fGoCj#b~3w|-OL_lFSC!?&m3S5GKZMM%n{}&bBsC8oM28erhA zY#KH#n~qJ-W?(b2nb^#17B(xJjm^%+u(50oHYb~l&CTXv^RjVlJe$BKvj4I9*!*k( zwjf)GEzA~Si?YSo;%o`FBwLCt&6Z)yvgO$FYz4L=TZygAR$;5M)!6E64Ynp*i^W)+ zC0LTBSej*6mgQK$@~ps$ti;N!!m6ys>a4+oY3EPxy#x`eLur1kEY-_d++m>y|wr4xA9obH7XSNI5mF>oMXM3}YljJC+^Cj%O#Z6WK}ZWOfQW zm7T^;XJ@c8*;(vtb`Cq2oyX2+7qAQ2MeJgB3A>bC#x7@9uq)YB>}qxmyOv$Yu4gx} z8`(|lW_Am^mEFc}XLqnW*L+oMp2z!)0#vW%+uqWA5>}mE4 zdzL-No@Xzx7uiefW%detmA%GZXK%1K*<0*w_6~cOy~o~XAFvPEN9<$v3Hy|N#y)3X zurJwH>}&Q7`<8vjzGpwMAK6drXZ8#GmHozkXMeCi*cmfTnVluSBfjmmEp>A<+$=(1+F4jiL1<2;i_`gxawRDt|nKD!#JEH zIFh3{nqxSY<2b&A8GdT>3t zUR-ak57(FL$Mxq1a09tP++c19H7=O%Cyxk=n)ZVES* zo5oG&W^gmPS=?-H4mX#Z$Ia&!a0|Ib++uDCx0GAPE$3EnE4fwNYHkg;mRrZI=QeN~ zxlP<=ZVR`S+s19@c5pknUEFSN54V@w$L;41a0j_V++pqrca%HE9p_GPC%IGHY3>Yn zmOICt=Pqy;xl7z-?h1F6yT)DTZg4lbTik8#4tJNk$KB^1a1Xgh++*$u_mq3aJ?CC< zFS%FTYwivAmV3v&=RR;Bxli0@?hE&o`^J6eesDjzU)*o*5BHZ#29kpmASFlzQiC)g zEl3B_gA5=e$OJNjEFde$2C{<~5DRjEoFEs-4f24zAP&TX1ds^+1NlIHPyiGJg+O6Y z1QZ3uKygq4lmw+fX;21~1?50_Pyti~l|W@s1ylvqKy^?9)C9Ev25>+C5>S8!3}68V z0N{ZDL?8hfC_n`o(18I=U;!IAzy%)g0R#aEK?D#;0<}RMP#4q#^+5yB5HtdfK@-pv zGy}~+3(yj@0!bOYT%56~0z0=+>W&=>Rr{lNe*5DWr? z!4NPM3%j)F5o`jR!4|L;Yy;cD4zLsK0=vN;uovtD z`@sQl5F7%B!4Ys290SL}32+je0;j8l@@E0WGlk+L~lzb{aHJ^r0%ctYh^BMSzd?r3KpM}rLXXCT;F?=kagU`w5;&bzP z_`G}^AI~T7iT}91e0+Ys0AG+V#24m^@J0Dzd~v=6Uy?7ym*&gxW%+V^dAd-r-%| z<9#0T0Uz=akN70MHeZLY%h%)U^9}fhd?UUw--K_O!hzBAv2@5*=MyYoHxo_sI9H{XZv%lG5^^8@&S{2+cXKZGC3595dPBlwa0D1J0Q zh9Aq1W_>KG~elx#?-^y>}xAQyro%}9-H@}D9%kSg&^9T5Y{2~4@ ze}q5EALEbnC-{^6DgHEnhCj=n24{{xW}szsg_Zuk$zfoBS>QHh+h|%irVg z^AGrk{3HG`|Ac?aKjWYCFZh@IEB-bAhJVYycT2{xkoD|H^;kzw zz5sIwCQ20}xjkC@S?D5k6}k!Cg&smrp_kBG=p*zM`U(Ao0m49GkT6&nA`BIV3B!dE!boA1Fj^QR zj1|TSxB)%Mq!h%S=b_M6}Ac6g&o39VVAI5*dy!}_6hri1HwV!kZ@Qy zA{-Tt3CD#K!b#zja9TJcoE6Rq=Ye}B0LqI3D1QW!b{J8iRr}*Vn#8Om|4ssW)-uE*~J(!R?H#h6myBW#XMqO zF;0vZ6U4-SRA)XhzgR#lC>9b6i$%nuVllC}SVAl*mJ&;gWyG>#IkCK0L98fN5-W>U z#HwO7vAS48tSQzKF%cIDkrXMB78#KhIT47wD2SpciL$7Os;G&&Xo#k0iMHs7uIP!r z2*p4Q#YjYAl2}`;Bi0q`iS@+>VneZ!*jQ{LHWizR&BYdCOR<&MT5Kb>72ApJ#SUUe zv6I+Y>>_p*yNTV!9%4_im)KkEBlZ>hiT%X^;y`hbI9MDa4i$%q!^IKeNO6=nS{x&e z6~~F=#R=j>agsP$oFYyYr-{?W8RATFmN;9SBhD4)iSxw;;zDtexL8~wE)|!F%f%Jq zN^zCAT3jQp71xRD#SP*{ag(@N+#+rjw~5=u9pX-Lm$+NpBkmRViTlL^;z99{cvw6l z9u<#?$Hf!kN%53;T0A4370-$1#S7v^@sfC1ydqu|uZh>i8{$pzmUvsdBiP#Sh{~@ss#j{33o8zlq<)AL38(m-t)! zBmNbWNy()YQc5Y6lv+w7rIpf2>7@)(Mk$k&S;``1m9k0Mr5Gtz$|2>Ha!I+RJW^gM zPKuWjq(tdIDW8;IDj*e<3Q2{fB2rPQm{eRUA(fO$Nu{MSQdy~-R9>neRg@}8m8B|D zRjHa(U8*6~lxj(sgiC}(N|Z!PjKoTu1SDP(BvFziSyCib(j;9nBvY~^TXG~<@+4n^ zQXqv=Bq1qDsx8%#>Pq#b`cea_q0~rfEH#muO3kF^QVXf2)JkeCwUOFN?WFcn2dSgf zN$MMiw=`bzzz{?Y(xpfpGtEDe!{O2ee#(g(h6y% zv`Shnt&!GB>!kJ425F85l`x-H$2?n?Kh`_cpH zq4Y?4EIpB)O3$R{(hKRO^h$ayy^-EZ@1*zA2kE2qN%|~(k-kdbr0>!X>8JEd`YrvD z{z}Q@as#=c+(>RLH<6pl&E)2C3%RA-N^UK;k=x4cGBMDraViYEzgnX%Jby;@&b9GyhvUwFOiqZ%jD(q3VEfx zN?t9mk=M%WPk3HhXaN+%ixrhH4jE#Hyv%J<~^@&oyy z{78N*Karox&*bOw3;Ct|N`5WBk>ASiVl1fRfq*2l;>6G+J1|_4CNy)5aQL-x8lL_)UdP;qzfznWEq%>BVC{2}SN^_-!(o$)qv{u?EZIyOPd!>WYQR$>~ zR=Ox%m2OIRrH9f}>812m`Y3&seoB93fHF`SqzqPuC_|ND%5Y_bGEy0(j8?`dW0i5r zcx8ezQJJJnR;DOZm1)X!Wri|SnWfBD<|uQOdCGicfwE9pq%2mJC`*-P%5r6evQk;4 ztX9@2Yn64%dS!#MQQ4$yR<QZ&MPS=DT6b~Q$gRdc90)m&* z1U2y=(Vb7tuNF`Xs)f|TY7w=lT1+jjmQYKorPR`D8MUlhPA#uiP%EmH)XHiVwW?Z8 zt*+KkYpS(WOvP0~B~?nLRYql1P6aBj3aY3|s;nxis%omP8mg&Us;xSzt9q)hLN!oB zHByn9q}EpJsCCtPYJIhV+E8tzHddRcP1R;!Dg)p6>0 zb%Hukoup1yr>IlaY3g)!hB{N7rOsC8sB_hM>U?#9x=>xDE>@SQOVwrSa&?8eQeCC4 zR@bO&)phE6b%VN5-K1_-x2RjyZR&P)hq_bUrS4YusC(6Y>VEZrdQd&29#)U2N7ZBM zarK0HQaz=fR?nzs)pP23^@4g)y`)}Nuc%kmYwC6NhI&)IrQTNWsCU(S>V5Tr`cQqO zK31QoPt|AYbM=M#QhlYqR^O;^)pzQ9^@I9R{iJ?Yzo=i;Z|ZmThx$|frT$j`sDIUD zT5>IgmQqWlrPk7DX|;4(dM$&NQOl%d*0N|>wQO2;Ek=vga%efVTv~1|kCs=9)8e%R zEm8YV%cten3TOqjLRw+1h*nf9rWMypXeG5$T4}9}R#q#gmDeh06}3uQWvz-nG&D1Q-)*Q{%Jk8gj7HFXs zX-G@bYHM}0x>`N0zScl%s5R0WYfZGKS~IP=)(mHEh zw60n=t-IDk>#6n9dTV{OzFI%6zcxS{s14EvYeTf5+AwXnHbNVzjnYPIW3;i_IBmQ( zL7S*e(k5$Dw5i%OZMrr?o2kvxW@~e_x!OE!zP3PHs4dbKYfH4H+A?jqwnAH}tbw5{4UZM(KZ+o|o+c58dIz1lu)zji=7s2$P{Ye%%B+A;08 zc0xO;ozhNgXSB20Iqkf5LA$73(k^RPw5!@R?YeeDyQ$sMZfke6yV^bNzV<+Ss6Emi zYfrSN+B5CB_CkB9z0zK5Z?w1CJMF#pLHnqE(mrcnw6EGX?Ys6v`>FlXertcUzgjXq zxt>B#si)FY>uL0~dOAJ5obq$r{~uT=mqscdSShYUQ{op7uQSZCG}EzX}yeIRxhWQ*DL51^-6kWy^3B{uclYm zYv?ugS~{lVI-!#~rPDg2vpS~(o!13j)FoZk6viwWaTdOy9tK0qI+57GzgL-e8gFnzc_LLaG*(nsrK^s)LleY`$F zpQumLC+k!6srod1x;{gnsn619>vQzE`aFHUzCd57FVYw5OZ27sGJUzeLSLz`(pT$i z^tJjreZ9Ux->7fWH|tyUt@<{7yS_u;sqfNv>wEOQ`aXTXen3B{AJPx&NA#omG5xrH zLO-dW(ogGW^t1Xo{k(obzo=i*FY8zItNJzlx_(2yso&CX>v#0K`aS)={y=}IKhhuT zPxPnyGyS>#LVu~h(qHRu^tbvu{k{G{|EPb`KkHxgulhIryZ%G}ssGY{>womWdNL!q zk-|u6q%u+)X^gZ+IwQT2!N_Q2GBO)kjI2gBBfAk}#2Pt_oJKAqw~@!lYs4AxMuL%O z{Ac7d@*4$=f<_^uuu;S)Y7{ey8zqdAMk%ATQN}21lrzd36^x2TC8M%Y#i(jjGpZXk zjG9I*12b@gFi3+kXoE3WgEN4^8-gJkk|7(4p&FW@8-`&TmSG!?;ToRd8_)=h(1;9V zBpJ1hI!0Zio>AXuU^Fxu8I6r5MpL7i(cEZZv@}{7t&KKDTce%P-soU-G&&ibjV?x4 zqnpv)=wb9UdKtZqK1N@opV8kKU<@<{8H0@>#!zFJG29qoj5J0Wqm41fSYwJlG&UKVjV;DjW1F$v*kSB6b{V^kJ;q*RpRwOKU>r0K8HbG{#!=&#aojjz zoHR}ur;RhlS>v2>-nd{~G%gvJjVs1g5K`H9gZep&6K=8JWmT zGHaW4%(`Yhv%cBDY-lzz8=Fncre-s<~bH2I2Txc#b7n@7WrRFkoxw*nzX|6I?n`_Lq z<~nn|xxw6MZZbEUTgZYE`qUTQ#hj zRxJy&aEq`=i?V2ou~>_I8BttM7etC`i@YGJjsT3M~FHdb4!oz>pzV0E-QS)HveR#&T= z)!pi0^|X3fy{$f0U#p+h-x^>Iv<6v&ts&M>YnV0M8exsJMp>h+G1gdXoHgE>U`@0p zS(B|P)>LbnHQkzF&9r7&v#mMSTx*^+-&$ZTv=&*5ttHk{Ynip&T4AlUR#~g9HP%{d zoweTDU~RNES(~jb)>dnqwcXlb?X-4TyRALeUTdGV-#TC&v<_K^ts~Y^>zH-iI$@o( zPFbg|GuBz_oORy1U|qB>S(mLV)>Z48b=|sQ-L!65x2-$YUF)88-+Ev@v>sWHttZw~ z>zVc3dSSh^URkfLH`ZJ0o%P=OV12YcS)Z*h)>rGB_1*em{j`2rzpX#kUn`lN+)iPq zv{Tus?KE~;JDr{0&R}P>GufH#EOu5qo1NW`v19EVc1}B&o!ic1=e6VPcss#P{I})F zXXm#I*ahuEc451SUDPgS7q?5;CGApnX}gSF)-Gq4w=38c?MilKyNX@au4Y%aYuGjI zS~h0mHer)CWz#levo>b~o3{m9v?W`%6_B?yOy}({*FR~ZgOYEigGJCnb!d_{wvRB({?6vkf zd%eBE-e_;KH``n6t@bv1yS>BSY45Uk+k5Q2_C9;ReZW3wAF>bIN9?2aG5ffE!aixA zvQOJ*?6dYc`@DU@zGz>vFWXn_tM)bfx_!gGY2UJM+js1{_C5Q){lI=`Ke8X&Pwc1m zGyA#y!hUJLvR~V8?6>wi`@Q|a{%C))KigmIul6_lyZyudY5%f++kfo8b}}cqlfp^q zq;gU_X`Hl9Iw!r8!O7@kaxyzvoUBeZC%Y5l#5y^goK7w$x0A=o>%=+nPJ)x@{O9Cz z@;e2bf=(f)uv5e->J)Q|J0+ZwPAR9fQ^qOllyk~E6`YDrC8x4e#i{C4bE-QvoSIH8 z2XkJJ1Q7(1{%6BssO6 zI!;}uo>Sjx;52j^IgOnrPE)6u)7)v{v~*fIt(`VbTc@4V-s#|UbUHbmoi0vSr<>E= z>EZNrdO5wFK2Be!pVQwN;0$yIIfI=c&QNEVGu#>BjC4jhqn$C%SZACw-kIP`bS62I zohi;#XPPtJnc>WIW;wH+InG>Xo-^NB;4E|&Ig6bo&QfQYv)ozXtaMg6tDQB@T4$ZJ z-r3-6bT&Dgoh{B*XPdL#+2QPTb~(G9JbKE)MoODh( zr=2s-S?8Q{-nrmhbS^oUoh!~&=bCffx#8S&ZaKG|JI-C_o^#)M;5>95Iggzu&Qs@^ z^W1siymVeUubnr}Tj!ng-ud8sbUrzsoiEN;=bQ80`QiL@emTFLKh9q#nVZ~A;ihy` zxvAYWZdx~;o8HafW^^;TncXaIRyUiQ-HmZ$-5hRCHR!A<Ze_QMTh*=RR(ET-HQib+ z=Hf2lk}l=aF5|K;=K_~^1y^(>S9TRwbv0La4cBxn*LEG(bv@U2p&PiN8@b3$a%;PF z+`4W(x4zrJZRj>~8@o;1rfxI0x!b~R>9%rPyKUUIZacTV+rjPVc5*wrUEHp2H@Can z!|mzza(lad+`eu5g(oyJOt3?l^b6JHegkPI4!^ zQ{1WUG8^5DyKCIF?mBn9 zyTRS)ZgMxfTimVgHg~(b!`HxO>7q>7H^= zyJy_9?m73od%?ZvUUDzHSKO=aHTSxE!@cR=a&NnL+`H~Q_rCkUeds=NAG=T7r|vWN zx%>ArGbyKmgL?mPFr`@#L_esVv%U)-Vypmoiue4XjE9;f>%6k>Oie4qJvRB2c>Q(cqdo{e8UM&yv zaF6gvkMd}b@mP=ZfX91+Cwh`6dy1!enx}h)XL^=rdyeONp67ee3%t;aJme*LwY@rC zU9X;3-)rDC^cs1My(V5$ubJ1}YvHx@T6wL#HeOq=o!8#$;C1vmd7Zs3URST1*WK&k z_4Imqy}dqOU$39n-y7f!^ago@y&>LEZeb-#g$P^bUE4y(8XH@0fSoJK>%5PI;%j zGu~P6oOj;4;9c}Cd6&H_-c|3Kcip?;-SlpGx4k>wUGJWE-+SOa^d5PSy(ivN@0s`9 zd*QwGUU{#*H{M(Co%i1R;C=Kyd7r&6-dFFN_uc#9{q%l$zr8=+UoV-T+)v@B^i%n% z{WN}BKb@c6&){eDGx?eQEPhr$o1fi}@niiQeojA^pWDyl=k??Kct62U{I}!F=jZne z_yzq!eqq0eU(_$=7xzo}CH+!R6<_r=U-u2)^ex}^9pCjm-}j*(_@N*9$WQWX`*r-f zem%dw-@tF^H}V_%P5h>QGrzgt!f)xf@>~0D{I-5OzrEkV@91~(JNsSyu6{SayWhj_ z>G$$``+fYrem}pzKfoX85Ap~5L;RusFn_o|!XN36@<;n){IUKxf4o1zpXg8WC;LCf_K`*Zxc{ycxazrbJUFY*`rOZ=t&GJmlz7{I&i%f4#rK z-{^1hH~U-st^PKDyT8NV>F@G)`+NMo{yu-df51QJAMy|TNBpDyG5@%K!awPs@=yC` z{ImW!|Ga;}zvy4`FZ);gtNu0rx_`sJ>EH5i`*-}i{yqP`|GHqS7`+xkuelnOGrhqA7DwrCk zfoWknm>y<;8DS=v8D@c5VK$f@#=uyZ1LlOeU~ZTP=7n)E9wxv<_#ey%^TPtLAS?t6 z!y>RKEC!3i60jsJ1xv#+uq-SG%fkw=BCG@}!z!>UtOl#Y8n7m;1u=+20+Nt|G-MzP zIS3#R1t>xZ%20tS)SwOxXhI9x(19-WpbsGoU%h9O9;^==z=p69Yz&*g zrmz`o4qL#MuoY|#+rYN49c&Lfz>csJ>I4tv0!uovtN`@p`iAM6hYz=3cO z91MrRp>P-+4oAR|a1RPd+zhwCt#BLM4tKzva2MPS_rSey zAKVWQz=QA*JPeP(qwp9!4o|?7@Dw}^&%m?r96S#%z>Dw_ybQ0vtMD4U4sXDl@D{uc z@4&n89=s19z=!Y=d<>t!r|=nk4qw2R@D+Rw-@v!<9efWzz>n|~{0zUqukaiE4u8O( z@E80I|G>X6S&%$P5u^-K1*wBHLE0c)kUq!|WDGI|nS(4r)*xGuJ%|ZngB(H5AXkt( z$P?rZ;)3`fAxQkU;>;K14+;bYgF->!ph!?OC>9hCN(3c?QbFmUOi(r`7nBbw1Qmly zLFJ%IP&KF)R1azdHG^6K7T^I9kO39Y0TZwR7l42dgg^|WKn|2Z4YWWHjKB=6zz&?i z4ZOe)U=Rdh5Ctem3Tg*+g1SMypnlLGXc#mK8V5~+ra`lydC($g8MF#o2W^73LA#)R z&>`p;bP75LU4pJbx1f8_Bj_3Q3VH{9g1$k&pnotR7#Iu+1_wiep~0|VcrYRu8H@@> z2V;V*2ObR9kQ-Z0%v|xHLBbXV?3T6j$g1N!GV1BS5SQsn{76(g$rNOdb zd9Wf_8LSFc2Wx`0!Mb35up!tOYzj69TY{~@wqSd(BiI@23U&v3g1y1MV1IBRI2arX z4hKhqqrtJ@cyJ;(8Jr4E2WNt_!MWgka3Q!DTna7+SAwg-wcvViBe)sd3T_8?g1f=J z;C}ERco;ki9tTf?r@^z}dGI258N3Q!2XBJ6!Mosn@FDmZdB*S<_q(O1;T=1p|EgRBrF;h3yX&(!jfUBuyj}^EE|>!%ZC-hieaU& za#$s-8deLdhc&{QVXY7g@sJ3~kP7LL3E7YfLCA+fD27rfhf1i1TBwIcXogm3hfe5* zUg(D~48kysLKG&2wZl4L-LPI*KWq>-3>$@w!zN+VuvyqVY!S8$TZOH|HeuVaUD!VC z5OxeZg`LALVb`!**gfnK_6&Q4y~93X->_fUKO7Ja3Srq!zJO;a9OxK zToJAeSB0y?HR0NDUAR8n5N-@Ng`2}I;nr|lxINqv?hJQ@yTd)<-f&;IKRgf~3=f5e z!z1C*@K|^}JQ1D@Plcz$GvV3rTzEdb5MB%~g_pxC;nnb3cs;xk-VASrx5GQ(-SA#` zKYS2A3?GG$!zba>@LBjgd=b73Uxly3H{sjxUHCry5Pl3lg`dMO;n(n6_&xj){tSPG zzr#P_-!NH}JW3Izj8a9Zqcl<4C|#63$`ECYGDVrAEK$}dTa-PDiDIK1QO+n=lsn23 z<&EN^_$VPt{I}uF7v+x%L8MOpHYyjDk19kJqe@Zb zs7h2dsuop`YD6`oS`ilE5fPCQ710qBu@M)6h>wIwjHF18lt_)VNRN!jjI79xoXCy5 z$d6zYL}3&~C`yWIM|GmQQN5^s)F5gYHHsQXO`@hzv#5F0B5E16idsi)qP9`HsD0ES z>KJv3I!9fiu2HwBd(KM}4BcQNO5vG$0xn4T=UwL!zP4uxNNRA{rTuibh9c zqOsAqXnZswnix%rCP!1EsnN7(dNd=N8O@4jM{}aN(Y$DWv>;j-Es7RLOQNOGvS@j< zB3c=(idIK!qP5YwXnnLH+8Aw$Hb+~ctyBB6=CUie5)=qPNkz=za7d`WStRK1W}ouhF;Yd-Nmv8U2cW zM}MNfQ8JVqr9dfBDwGs)nkg z8mK0!g)oF80+EP9G-42oI0O)n1SBE}$w)ye(vXe}WFiaM$U!dhkdGh=P>3RgP!g(* z>Y%!)9;%NTpoXXsYK)qorl=Wej#{9Ws1<6B+Mu?m9cqs{ppK{$>WsReuBaR8j(VV; zs2A#u`k=n3AL@?=pn+%*8jOaZp=cNyjz*x7XcQWa#-Ooi92$=%powS_nvABPsc0IS zj%J{lXcn4{=AgM~9-5C9poM4=T8x&UrDz#ij#i+RXcbzG)}Xa$9a@hzpp9q~+KjfK zt!NwCj&`7(XcyXz_Mp9JAKH%&po8cTI*g8>qv#kqj!vMH=oC7Q&Y-jC96FCKpo{1d zx{R)%tLPfKj&7iv=oY$-?x4Hq9=eYnpoi!YdW@c+r|21aj$WXb=oNa6-k`VW9eR&G zppWPi`i#Dyujm{4j((t@=ok8p{-D1oSyJ+(6iF$QQYEEMN|Tf}DP2Qe`+tV+LD6m{003ZZ+ZVNM z+jbi}n~k+ePHo$^ZQHhO+j?()Wa6-RECEZz3S&jEqF6DkI938HiIu`iV`Z?iSUIdb zRspMsRl+J`Rj{g9HLN;T1FMPE!fIo6u)0`1tUlHNYlt<%8e>hcrdTtqIo1MeiM7I7 zV{NduSUape)&c8?b;3GhU9hfLH>^9>1M7+P!g^yEhGPUqViZPW48~#{#$y5|ViG1} z08=oCshEc8n1Pv?h1r;cxtNFf7{UT9#3C$)^}+gL{jmPn0Bj&O2pfzI!G>bPu;JJU zY$P@c8;y;@#$w~J@z?}xA~p$|j7`C&V$-nc*bHnYHVd1L&B5kk^RW5Y0&F3+2wRLT z!Iomnu;thaY$dh|TaB&3)?(|h_1Fe%Ben_KjBUZTV%xCo*bZzbwhP;h?ZNh9`>_4k z0qh`l2s?}&!H#0bu;bVX>?C#yJB^*e&SK}V^VkLKB6bP8j9tO5V%M?QUJdyT!p-eT{t_t*#QBlZdVjD5krV&Aau z*bnR{_6z%s{lWfX|F9%@Qal-+98ZC##8cs^@icf^JRP1M&wyvdGvS%>EO=Ht8=f7{ zf#<|?;kofVcwRgoo*yrO7sLzUadSf3aRMiC3a4=fXK@baaRC=`372tz zD>%eeT*GzTz)jr3ZQQ|K+{1kw;Q=1v5gx<);C=Cacz=8VJ`f*-55|Y!L-AqwaC`(l z5+8++#>e1e@p1Tgd;&fZpM+1wr{GiZY4~(}20jy?h0n(4;B)bL_Eh404q;Cu0X_8X_%`jz~{rATkn}h|EM5A}f)N$WG)S zauT_S+(aHCFOiSPPZS^u5`~C3BA!Sf5{be@5uzwjj3`c&AW9OYh|)wEqAXF4C{I)% zDiW25%0v~SDp8H7PShZ3619lhL>;0oQIDukG$0xhjfloX6QU{6jA%}@AX*Zwh}J|K zqAk&mXisz?Iuf0T&O{fYE76VUPV^vp61|At1V-QlL68JR&;&!U1V`|MK!}7y$OIr1 z0um~r5jtTICSega;Set25k7&4fC!0*h!K5=zC=HwKQVw9NDLwd6GMoh#4utwF@hLL zj3P!8V~DZDIAT08ftW~4A|?}4h^fRhVmdK{m`ThcW)pLWxx_qTKCysUNGu{26HADt z#4=(zv4U7htRhwuYlyYPI$}Msf!IiFA~q9Sh^@pnVmq;e*h%anb`yJuy~I9ZKXHIK zNE{*#6Gw=n#4+MHae_EWoFYyWXNa@JIpREVfw)LqA}$kGh^xdk;yQ7IxJle1ZWDKi zyTm=>KJkEfNIW7Q6Hkbz#53YK@q&0sydqu`Z-}?VJK{a@f%r&#B0dveh_A#q;ydw! z_(}XCeiMI)zr;Tx37M2kMkXgykSWPjWNI=EnU+jPrYAFy8Ocm!W-<$zmCQzFCv%WF z$y{V^G7p)T%tz)Y3y=lLLS!5nPbQFwWMQ%hS(GeB7AH%PCCO4`X|fDimMlk>Co7N@ z$x38pvI<$1tVUKRYmha`T4Zgq4q2D1N7g4BkPXR3WMi@k*_3QXHYZz_&DcdyqZJUSw|)BXN=-Ns=OIk|9}=BY9FFMN%SV5|9cB zNtM({ois?3v`CwDNSE|TpG0IphGay>$UbCWvLD%>96$~v2a$uxA>>eU7&)9AL5?Ix zk)z2mDvpY$5~xI~Fja&qN)@AuQzfX9R4Jq!&oN7U}q*_s}sWwzw zsvXsy>Ogg*I#HdeE>u^l8`YiaLG`41QN1aQ!YP6xDT<;ghGHp>;wga=DT$IPKq(ZY zR7#_C%AicjqHM~cT*{+-3Q++SQV|uS`cQqTepG*I05y;rL=C2fP(!I<)NpD9HIf=d zji$y>W2te}cxnPQk(xwJrlwF+scF=7Y6dlvnnlf~=1_B~dDMJr0kx1?L@lP4P)n(0 z)N*PCwUSyzt)|vcYpHeAdTIl;k=jIUrnXR9scqDDY6rEG+C}ZA_E3ANebj#H0CkW$ zL>;D%P)Dg_)N$$rb&@(oouIQX_x<%cl?ofBB zd(?gE0ril2L_MaSP*166)N|?u^^$r;y{6t!Z>e|Gd+G!Ak@`e^roK>Lsc+PG>Ie0c z`bGVw{!o9Ze^e4WDV>Z?PN$$#(y8dwbQ(G>osLdVXP`6Endr=P7CI}Pjm}QzpmWl> z=-hN3Ixn4%&QBMh3(|$?I69tApcCoBbP>8JU5qYHm!M11rRdUh8M-W8jxJAEpexdq z=*n~zx+-0bu1?pWYtpso+H@VdE?tkVPdA_&(v9fGbQ8KM-HdKdx1d|nt?1Tt8@ess zj&4tPpgYo?=+1N(x+~p{?oRihd(yq=-ZVzzG(nRzMbk7xvouHZv_OlrM9Vaw6&lhi ztp>H=)QD6x<5UD9!L+O2h&67q4Y3%I6Z4VrSvj- zIlY2jNw1<;(`)Fp^g4Pyy@B3HZ=yHTTj;IyHhMd~gWgH+qIc7K=)LqldOv-DK1d&; z57S5Jqx3QQIDLXXNuQ!m(`V?j^f~%GeSyA6U!pJ5SLmzsHTpVzgT6`MqHoi8=)3ei z`ab=Den>x}AJb3hr}Q)WIsJluNx!0B({Jdv^gH@J{ek{Sf1*FrU+Ay&H~KsMgZ@eX zqJPtW=)d$oIti1MNya2+QZOl*R7`3n4U?8h$E0U6Fd3OlOlBqvlamlxHe16`4v* zWu^*Km8r&5XKFAtnOaP3rVdk=smIi38ZZr+MoeR-3DcBm#x!SIFfEx@OlzhM)0Sz+ zv}Zan9hpu{XQm6&mFdQGXL>L_nO;n924irBU`U2yXog`}hGTd}U_?e@WCkz_0~wXk z7@aW~ld%|^aTu5J7@t8*z=TZ1#F#!zU#1_^pBcamWCk&VnIX(jW*9S^8NrNXMlqwA zG0a$I95bGoz)WN&F_W1o%v5F?Go6{i%w%RUvza-}TxK3KpIN{xWEL@tnI+6pW*M`b zS;4GiRxzuYHOyLO9kZU|}N^yO}-AUS=P&pE~z>PG3JCB{uE?^h3i`d2N5_T!Oj9t#I zU{|uM*wySBb}hS(UC(Y{H?o`9&FmI-E4z)|&hB7$vb)&b>>hS6yN}(^9$*i$huFjH z5%ws1j6KetU{A8A*wgG8_AGmjJ>c(ldyl=( zK42fRkJ!iT6ZR?ljD60&U|+JY*w^eE_AUF4eb0ViKeC_L&+HfWEBlT8&i-J3vcK5h z>>u_o`;Se+CFPQF$+;97=O%Cyxk=n)ZVES*o5oG&W^gmPS=?-H4mX#Z$Ia&!a0|Ib++uDCx0GAPE$3En zE4fwNYHkg;mRrZI=QeN~xlP<=ZVR`S+s19@c5pknUEFSN54V@w$L;41a0j_V++pqr zca%HE9p_GPC%IGHY3>YnmOICt=Pqy;xl7z-?h1F6yT)DTZg4lbTik8#4tJNk$KB^1 za1Xgh++*$u_mq3aJ?CCGiZ9KV;mh*n`0{)Oz9L_Vugq8B ztMb+O>U<5pCSQxM&DY`U^7Z)od;`8A--vI_H{qM|&G_bg3%(`aif_%g;oI`<`1X7U zz9Zj>@631MyYk)m?tBlvC*Oy6FkXNJk2va%X2)>3%tlnyvze$;UTZ`8n5#P zZ}Jvz^A7Lw9`Eyr5BQLe_!!@Z@5}e&`||_%f&3tTFh7JJ$`9j*^CS3?{3w1jKZYO6 zkK@Pl6ZnbzBz`hKg`dh#Fn@$U z${*v8^C$R|{3-r4e}+HHpX1N-7x;_(CH^vhg}=&Q^r%0J_u^Dp?9{44%7|Av3dzvJKYANY^_C;l`4h5yQbIij(dP04nfzVKBBs3P92u+1%LUW;o&{Ak6v=-V3ZH0D1d!d8S zQRpOe7P<&sg>FK3p@+~@=q2&< z1xv66M{osC@C76ULMTK+Oz0!@75WMNg#p4qVURFb7$OW6h6%%k5yD7elrUNtBa9Ws z3FCzc!bD+`Fj<%)OckaH(}fwrOktKVTbLuv73K-^g$2SwVUe&{SRyPHmI=#+6~ank zm9Sb^BditH3G0Oo!bV|}uvyq5Y!$W%+l3v%PGOg@Ti7G)74`}Hg#*Gt;gE1xI3gSs zjtR$w6T(U1lyF)&Bb*h^3Fn0i!bRbda9Ow_TotYf*M%FxP2rYsTeu_K748Z5g$Kez z;gRrIcp^L%o(a!|7s5;7mGD}4BfJ&f3Gamu!bjng@LBjGd=6jy_iAFC}t8fi&@01Vm2|mm_y7d<`Q#@dBnV8 zJ~6*oKrAR0663^pF+ofe3yVd>qGBtRhww ztBKXc8e&bcmRMV?Bi0q`iS@+>VneZ!*jQ{LHWizR&BYdCOR<&MT5Kb>72ApJ#SUUe zv6I+Y>>_p*yNTV!9%4_im)KjxL|i09Qlvy$WJFfvL|zm`QItek1fn8BQ57{&7Y)%A zEzuSo(G@+>7m*l?igY2Z#g3LE>O>h&WUnCJq-zh$F>O;%IS;zt`|3m8^ulHW^s$SRoo_S7k7v|#a-fVagVrH+$ZiA4~PfFL*ilahy zCLR}0h$qEU;%V`Wcvd_oo)<5O7sX5BW$}u5RlFu%7jK9+#arTS@s4;`yeHllABYdd zN8)4giTG4}CO#Kmh%d!g;%o7Z_*Q%;z861;AH`4NXYq^pRs1G?7k`L9#b4rY@sIdd z{3j-nl1j;>m66Iy<)rdb1*xJ`NvbSWk*Z47 zr0P-)siss*sx8%#>Pq#b`cea_q0~rfEH#muO3kF^QVXf2)JkeCwUOFN?WFcn2dSgf zN$MMdasE)fzbQ4%dN5-V{MFA0(;Ns=r9Ns*wWN}8lghGa^X zWJ`|ZN}l9PND8D-ilms-N9rr}lln^oq=C{PX|Oaz8Y&HwhD#%)kv@}K9BM}Iw~EL zj!P$`lhP^av~)%~E1i?hOBbYz(k1D#bVa%8`=E$Oy&N4hKBlkQ6oq=(WY z>9O=gdMZ7Wo=Y#Jm(nZgwe&`ME4`E6OCO|<(kJP&^hNqAeUrXRKct`1FX^}RNBS%M zlak0u+7)5vM%baHw*gPc*$Bxjbh$XVrVa&|d~oKwyv=a%!xdF6a^ zez|~LP%b3L$?T9E7z0j%MIj)awEC1+(d3FH@QpXAT-7x}CFP5v(bkbla* zP6CpGWFR?60aAigAT>w>(t>m#J;(quf=nPY$O5v0Y#=+x0dj&|AUDVZ@`8LIKPUhS zfas)HJ!Ca48! zgF2uts0ZqU2B0Bm1R8@Tpebkunu8XgC1?d&gEpWoXb0MZ4xl6G1UiE*peyJGx`Q5| zC+G!w0}SAR03@IQ4H&=z4)8z#B9MR#08jt~D$sxq3}6Ba*uViU@PH2x2tWuT5CeTc zU(gTq2Lr%BFbE6=L%>il3=9V&z(_C(j0R)CSTGKZ2NS?VFbPZsQ@~U(4NM0!z)Ua; z%m#D7TrdyJ2MfSLum~&$OTbdF3@isLz)G+RtOjeqTCfhR2OGdfunBAiTfkPZ4QvNH zz)r9W>;`+lUa$}B2M54Ga0na*N5D~V3>*h1z)5floCasWS#S=V2N%Faa0y%nSHM+p z4O|B|z)f%q+y-~RU2qTF2M@qQ@CZBxPry^~3_J%fz)SE7yasQ;TksCN2Oq#k@Cked zU%*%J4SWYbz)$cC{04u(U+@nkQIaajl;lbZC8d%|Nv)(&(kkhc^hyRLqmoI{YGDXbJxiYmpF;z|jnq*6*L{eQq- zRw<{HS1KqKl}buwrHWEjsiss{YA7|8T1suDj#5{tr_@&(C=HcHN@Jyo(o|`tG*?85m7dMG`WUP^BTQ*eb)NQF{pg;7|AQ+P#C zL`70$1t^LF6;;s`T`?3>u@qZz6j$*SUqMQsgi55uls-ydrJvGY8K4YQ1}TG;A<9r? zm@-@$p^Q{UDWjD!%2;KbGG3XWOjIT*la(pTRArhnU74ZGRAwo&l{v~>Wu7u$S)eRb z7AcFBCCXA|nX+72p{!I^DXWz=%35WevR>JsY*aQWo0TofR%M&AUD=`RRCX!5l|9N{ zWuLNNIiMU=4k?F~Bg#?bm~vb>p`27sDW{b)%30-{a$dQhTvRS8mz68ZRppv;UAdv$ zRBkD^l{?B^<(_h1d7wO09x0ENC(2XhnetqDp}bUHDX*0`%3I}~@?QC%d{jOupOr7l zSLK`XUHPH>RDLPHl|RZ~<)4xSCWXmha+m_9gsEU^m0o-80cM1mU}l&FW`)^c zc9;X^gt=gDmuBx2`~{BhDBgeSPT}2C16Qd3YLatU|CoWmWLH! zMOX<|hE-rySPfQ(HDFCx3)Y5pU|m=b)`tyXL)Zv5hD~5o*bFv@EnrL73buxAU|ZM@ zwuc>HN7xB=hFxG+*bR1vJz!7R3-*Q>#32DmNI@DhkcAxNp#ViFK^X$5KnPW+K^+>< zgch`+16}ArA0imQ5JoTt`@p`iAM6hYz=3cO91MrRp>P-+4oAR|a1RPd+zhwCt#BLM4tKzva2MPS_rSeyAKVWQz=QA*JPeP(qwp9!4o|?7@Dw}^ z&%m?r96S#%z>Dw_ybQ0vtMD4U4sXDl@D{uc@4&n89=s19z=!Y=d<>t!r|=nk4qw2R z@D+Rw-@v!<9efWzz>n|~{0zUqukaiE4u8O(@E80I|G>ZSA55YqRgbxc5^71clv-LXqn1_6spZuQYDKk@T3M~4R#mI1)zunmO|_OTGq6I#->i&Q}+x3)MyHVs(kSR9&VnS68Sj)m7?hb&a}KU8k;BH>excP3mTK zi@H_arfyevs5{kN>TY$9x>wz&?pF_}2h~IBVfBc5R6V91S5K%X)l=$e^^AH}J*S>m zFQ^yQOX_9yih5POre0TXs5jMH>TUIodRM)t-d7)}57kHNWA%ypRDGsCS6`?v)mQ3k z^^N*geW$)xKd2woPwHp&i~3dlrhZp{s6W+T>TmUr`d9s@Cee~=$+YBJ3N59UN=vP! z(b8(^wDejAEu)r6%dBP5vTE71>{<>jrw}3YWcMMS^=$~R!ED};&J0qE<<(tX0vfYSpyrS`DqHR!gg`)zRu|^|bn0 z1FfOfNNcP$(VA+_wB}k1t)+G_2z_F4z6qt;35taZ`4YTdN%S`V$K)=TTH zVH&Ox8mUnltuY#_aT>1)ny5*dtN~5Ypr&e?rfY^~YL;eej^=8f=4(g`v`~w*nAS(@ ztM$|RYXh`_+8}MPHbfh$4bz5eBeap)C~dShMjNY*)5dEPw29gzZL&5+o2pIIrfV~_ znc6IEwl+tbtIgBqYYVi6+9GYSwnSU1Ez_23E3}o`Ds8p4Mq8_`)7EPnw2j&(ZL_vT z+p2BTwre}Io!TyKx3)*ytL@YFYX`K0+9B<*c0@a>9n+3$C$y8=Debg&MmwvW)6Q!b zw2Rs$?Xq@7yQ*E&u4^~6o7yeywsuFmtKHM?YY()C+9U0;_C$NCJ=30RFSM81EA6%R zMtiHh)81K7@zH2|UpV}|&xAsT-tNqiG=t=ctdU8F5o>EVxr`FTx zY4vn^dOd@lQO~4j*0bnY^=x`}J%^rC&!y+q^XPf?e0qMpfL>59q{r#;dV-#)7uJjD zMfGBOalM3IQZJ>K*30N+^>TW7y@Fm*ucTMjtLRnrYI=3OhF(*zrPtQ$=ymmadVRft z-cWC(H`bfzP4#AabG?P$Qg5ZV*4yZ9^>%uDy@TFS@1%FuyXal@ZhCjUhu%}~rT5k` z9oGq+)G3|T8J*QRo!13j)FoZkfv)IKS9ML-bwf9GOSg4LcXdzqb)*M+s7HEC@1ytC z`|17l0s26FkUm%+q7T)F>BIFA`bd40K3X56kJZQNC5#M`bvG3zFJ?SuhrM->-7!#MtzgMS>K{> z)wk)}^&R?7eV4vl-=pu<_v!of1NuSzkbYP{q94_d>BsdG`bqtiep)}HpViOl=k*Kv zMg5X~S-+xR)vxK-^&9$4{g!@PzoXyP@9FpT2l_+(k^WeJqCeH2>Cg2S`b+(l{#t*d zzt!LA@AVJ*NBxujS^uJc)xYWA^&k3A{g?h*|D*ra|LIALq((9$xsk$1X{0hz8)=NR zMmi(Ck-^AlWHK@vS&XbkHY2-{!^mmmGIASvjJ!rZBfn9=C}O+Ml++i(ZXnHv@%*7ZH%@?JEOhP!RTmoGCCVwjIKsEqr1_==xOvadK;L5 z8-zg`ltCMe!5W;w8-gJkk|7(wPz-3OhGyu7VVH(x*oI@chG+N&G6EwsA|qz>G5Q+) zjQ+*|W1um}7;FqNh8n|+;l>DKq%q1EZHzI-8sm)d#sp)cG0B*0OfjY!(~RlH3}dD- z%b0Dk!jQz#|zzsncd7`<}`Dexy?LgUNfJW-z;DjGz*z=X1tkTCYpuKB4$yu zm|5H`VU{#YnWfD#W?8eGS>CK*Rx~S_mCY(W?QqJ+1~76b~HPgoy{(0SF@Yh-RxoZG<%u7P0Yki z!X!<~q)oUnAHiwu)&0*$nbA&n49A%C+$CzWyaprh)f;rKgWKK4xm{ZMZ=5%w0In$hF z&Nk@0=gSpY%WNtRMm|M+l z=5}+3xzpTb?l$+Bd(D03e)E8N&^%-wHjkJ`&12?q^MrZQJY}9X&zNV;bLM&Tf_c%r zWL`F}m{-kf=5_OidDFaQ-Zt-;cg=g|ee;3&(0pV*HlLVJ&1dFw^M(1+d}Y2i-wXE7!9jmTY&#G@Vuo_y8 ztj1OotEtt@YHqc#T3W5F)>a#+GuUEHd|Y)t=2Yc zyS2mGY3;IhTYId%);?>$b-+4k9kLEvN35gPG3&T>!a8Z4vQArPth3fR>%4Wrx@cXp zE?ZZutJXE^x^=_4Y2C7JTX(Fx);;UK^}u>)J+dBKPpqfbGwZqa!g^`FvR+$nthd%X z>%H~C`e=Q!K3iX`uhuu~yY<8RY5lT(TYs#-);}wWozzZdC%04BDeY8tYCDac)=p=q zw=>uo?M!xNJByvw&Sqz~bJ#iUTy}0dkDb@fXXm#I*ahuEcAOn=C)kO0VY`T3)GlTh zw@cV1?NWAWyNq4dE@zjwE7%q7N_J(tie1&NW>>ds*fs51c5S*S8zk4edsD zW4npn)NW=sw_DgP?N)YcyN%t}ZfCc*JJ=oVPIhOzi`~`kW_P!H*gfrDc5fTAahtG7 zo3d$}v00n5d0VhWTe4*v*oqBp)z)m?Hf+6*^BKZ_ELM9z1&`5ue4X$tL-)RT6>+n-rituv^UwC?Jf3Jdz-!8 z-eK>wciFq`J@#IEpS|BcU>~#(*@x{T_EGzoecV1_pR`Zer|mQLS^J!Q-o9X8v@hA0 z?JM?G`>LhcLJ1Lx$PAVt0lg3Hwq;t|c z8JvtxCMUC##mVYqbFw=*oSaTBC%2Qw$?N2E@;e2bf=(eP&WU#toJ6OvQ^YCi6myC@ zC7hB@DW|kk#wqKRbILmvoQh5*r?OMUsp?d7syj8DnocdJwo}Kc>(q1VI}MzMP9vwW z)5K}&G;^9eEu5B4E2p*7#%b%cbJ{x{oQ_T>r?b<=>FRWIx;s6bo=z{Pw}UyjLpY>E zIkdw#tiw6HBRHZXIkE#B#et6MXpZg}j_FvA?KqC>c#iKNCvZY1a$-&&r?1n`>F*41 z20DYB!Ojq8s58tN?u>9oI-{J?&KPH`GtL?BOmHSTlbp%U6lbb4&6)1ZaArEQoY~GC zXRb5PneQxc7CMWZ#m*9Esk6*k?yPWDI;))3&KhT}v(8!XY;ZO@o1D$g7H6xo&Drkk zaCSPooZZeIXRou*+3y^14myXN!_E=ssB_FY?woK=I;Wh|&Kc*dbIv*MTyQQrmz>Ma z73ZpR&AIN}aBe!coZHSF=dN?lx$iu19y*Vl$IcVysq@Tv?!0hbI#=8k_qFdN4;udv_xy9WQ zZb`S4TiPw-mUYXy<=qNyMYob$*{$MMb*s76-5PF9x0YMmt>e~p>$&ya25v*Qk=xj9 z;x=`gxy{`cZcDe7+uCj8wsqUN?cEM;N4JyP+3n(Xb-TIU-5zdFx0l=7#a!GaT+*dn z+GSkU9*9oKa|*LRT{xS<=lF}IJ~*X`%_cL%rw z-9hePcZfUG9p(;qN4O*1QSNAWj62pH=Z<$LxD(w;?qqk0JJp@$PIqUxGu>J4YjxEI|^?q&Ci zd)2+>UUzS}H{DzAZTF6Q*S+W7cOSS9-AC?Y_lf(|eda!QU$`&bSMF=~jr-Pp=e~D8 zxF6k5?q~Ol`_=vCes_PkKiyyMZ}*S;*Zt=v@sfJUyyRXAFQu2tOYNoc(t7E<^j-!p zqnF9c>}Bz?dfB|}UJfs(m&?oTtG%d73x@#=c@y!u`Puc6n-YwR`g zntIK==3Wc0rPs=9?X~gRdhNXSUI(wE*U9Vbb@94--MsEz53i@!%j@l79_|qy=}{i- zF&^u29`6aB=t-XJ0Z;Lur+S*FdxmFvmS=m8=X##!d&mpC(2Km7*T?JY_4E3B1H6IW zAaAfY#2e}j^M-pPypi50Z?reY8|#hp#(NXIiQXh{vNy$>>P_>edo#S5-YjpnH^-an z&GY7a3%rHiB5$#`#9Qhu^Ok!nyp`T6Z?(6^TkEa!)_WVgjov12v$w_D>TUD3dpo?H z-Y##qx5wM-?eq3~2fTycA@8tv#5?L8^NxEbyp!H3@3eQuJL{eE&U+WUi{2&gvUkP1 z>Rt1$dpEqB-YxI8cgMTy-Sh5y54?xoBk!^I#Cz&J^PYPzyqDf9@3r^Fd+WXP-g_Us zkKQNmv-idO>V5ORdq2FN-Y@UB_s9F|{qvIeN&RGgazBNi(of~5_S5)j{d9hMKZBpq z&*W$Jv-ny4Y<_k>ho95W<>&VE_<8+&ety4zU(he)$NBMof}iLY_KWyM{bGJ`zl2}X zFXfl^%lKvea(;Qgf?v_EJU*Y@l9b^UsNeZPU<&~M~7_M7-k z{bqi1zlGn@Z{@f4+xTt$c7A)mgWu8b!#91)w|&QVeb4uO%zv5r@ zuld*g8~#oImVev7} z|C9gO|Kfl3zxm(&AO27Om;c-Ua7P1QkWaP;pcOl|-dbX;cQ4 zMdeU=Q~^~)l~83=1yx1WP<2!T)kL*WZBz%WliJ{%8Oihz6m-Xb2jLhN0nT1R9A(q0wjz z8jHrE@n`~?h$f-QXbPH&rlIL*2AYXxq1k8-nv3S4`Dg)Jh!&y6XbD=1mZ9Zn1zL$# zq19*&T8q}9^=Jdyh&G|kXbakkwxR842il2tq1|W?+Kcv~{pbKXhz_B{=m3@QbcgDOGQpjuEps1ei*Y6Z1} zIzio_UQj=15Ht)L1&xCyLDQgF&^%}nvrTZ3)E_FzY_GuRdE4)z3lgMGpN;6QLNI20TXjs!=8W5My@L~t@V6`T&v z1ZRVD!TI1qa51)6h{7NY z!zhe}eZszBzp#HeARHJD3I~Tn!lB`?aCkT(92t%ZM~7p=vEjIId^jPT7)}Z&hf~6- z;k0miI3t`H&I)ITbHcgdyl{TFAY2$O3KxeOt9Ux#nPx8b|+efS~#7=8*rhhM_4;kWR6_#^xo{tADGf5N}vzc5LZG)fjFk5WV_ zqf}AqC{2_$N*AS%GDI1pOi|`2OO!Rr7G;leL^-2eQSK;DlsC#3<&O$P1*1YyTofNA zM2S)1s7O>aDi#%wN<<~2Qc>xsOjI^17nP4HL=~e-QRS#gR5hv=RgY>!HKSTl?Wj&v zH>wxaj~YY`qefBVs7cf`Y8Ew*T0||QR#EGyP1H7O7qyQ%L>;3}QRk>j)HUiBb&q;P zJ)>Sx?+A^?jf>p(;Vb!r3SWT=JRvW8>)y3*z^|1z6L#z?j7;Azx#hPKw zu@+c7mVhNxOm5dSE@VURZCe57rm!hxNw> zU<0v1*kEi3HWV9%4aY`cBe7A~Xlx8N78{3+$0lGCu}RouYzj6Nn}$utW?(b1S=ek0 z!*GniNQ}a0jKNq8U>wF{0w!V-CSwp&Fcs4AI8MYi-fvv<=VXLt<*jj8IwjSGnZNxTVo3Sm}R%{!#9ovEJ z#CBo3u|3#cY#+8CJAfU;4q=C}BiK>w7xft|!oVW+V(*jelxb{@NcUBoV7m$56@ zRqPse9lL?u#BO1?u{+pZ>>hR>dw@N}9$}BMC)iW$8TK4|fxX0DVXv__*jwx!_8$9y zeZ)RtpRq64SL_@19s7a(#C~DFu|L>f>>ri{Pl_kQljAAylz1vUHJ%1fi>JfW;~DUb zcqTkE9*1Yav*OwC?0615C!Pz>jpxDh;`#9Wcmcd1UI;IY7r~3-#qi>I3A`j;3NMY9 z!OP<1@bY*Cydqu+uZ&m0tK!x0>Ua&jCSD7#jn~2J;`Q+Qcmup4-Ux4uH^H0Y&G6=U z3p^fAz!UM7cq_a$-Ue@rx5L}x9q^8LC%iM>1@DS?!@J`>@Sb=tyf@wl?~C`t`{M)f zf%qVNFg^qyiVwqw<0J5q_$YidJ_a9)kHg2~6Yz=nBz!VH1)qvf!>8jj@R|55d^V2Z zI8NXsPT@4p;4BVs4(D+J7jX%fafmCpifcH+b=<&B+`?_#!ClJW8_dPIGq0nw0XL^LLv5KW0@M027A z5lo4^R1 zAPAD62%2CBmH-4t@Pt5!gha>$Bosm=Gy)MiVGt%^5jNovF5wYA5fC8}5iw#8F_)M} z%qJEQ3yDR?aNo2Z=+(Vd4mJlsHBlCr%J2iBrUB;tX+?I7gf(E)W-qOT=a33UQUV zMqDRu5I2ci#BJgZahJG9+$SCo4~a*_W8w+%lz2uwCteUQiC4sH;tlbZct^Y^J`f*? zPsC^93-OisMtmoJ5I>1u#Bbsc@t62VBq5WM$;jkn3Nj^`icC$WA=8rS$n<0eG9#IZ z%uL3SS;(wpHZnVzgUm_hB6E{@$h>4eGCx^>EJzk23zJ32qGU0$I9Y-$NtPl@lV!-V zWI3`tS%IubRw65tRmiGjHL^NcgRDu`B5RX%$hu@bvOd{>Y)CdD8G&awIv598HcP$CBg7@#F+@A~}hiOim%ElGDiPvO)?})0+J(nQXoZAB4rYi3aOGBiAbF^NRzZkn{-H*^hlo!$dHW47&(WWOU@(b zlMBd&gp zuah^(o8&F>HhG7m6A$DrKZwQX{mHndMX2zk;+76 zrsAk9R8}e*m7U5#<)m^^xv4xQb$GE`Zr z995pGKvkqFQI)AGR8^`PRh_Cq)ud`swW&H(U8){cpK3rgq#99;sU}oYsu|UsYC*+Q z2~;B0l4?b@rrJ<#sdiL*ssq)L>O^&>x=>xIZd7-w2i246MfIloP<^R>RDWs!HIN!a z4W@=rL#biZaB2iKk{U&grp8cXsd3bJY63NpnnX>erchIcC;#Zf#ZP$DH!G6gAxQYno>luj9xNm-OlIh0FzlurdzNJUhPnnTT{=27#h z1=K=n5w)0FLM^41QOl_n)Jkd!}UYMrsqanc6~arM6MqsU6f#Y8SPe z+C%N7_EGz(1Jpt45OtV3LLH@!QOBth)Jf_Tb(%Uuou$rE=cxK1jIxCA5%rjQLOrFPQO~It)Jy6W^_qG^y`|n!@2L;eN9q&x znfgL~rM^+$sUOr&>KFB!`a}Jt{!vNjq;xVmIh}$|NvEPy(`o3mbUHdcoq^6sXQDIH zadZ|sE1iwbPUoO=(z)o|bRIe{osZ5>7oZE$h3LX`5xOW{j4n=>pi9!F=+blBmWE7Fzd%5)XFDqW4PPS>Do(zWQ?bRD`bU5~C$H=rBRjp)X76S^tgjBZZ1pyTNT zI+1Qkx1w9qZRoaiJGwpHf$m6mqC3-F=&p1(x;x#2?n(Eed((aBzH~pjKRtjRNDrb1 z(?jT?^e}ojJ%S!dkD^D@W9YH;IC?xifu2ZDq9@Z+=&AHHdOAIWo=MN5XVVys(*#Y@ z6iw3%&C-D8Xr2~mk(OwghO|Pfv_>OZrw!VqE!w6X+NC|(rvo~qBRWRUq36=`==t;l zdLg}tUQ92cm(t7V<@5@ACB2GXO|PNX((CB;^agq(y@}pTZ=tu++vx4|4tgiOi{4G| zq4(1J=>7Bo`XGIXK1?5>kJ88JC7Du8X{HQQmMO=S zXDToinMzD$rV3M)sm4@iYA`jKT1;)G4pWz@$JA#UFb$bTOk<`A)0An(G-p~c@k|1f z$h2fyF|C<4Ok1WM)1K+TbYwa)otZ97SEd`&o$0~!WO^~ZnLbQkrXSOv8Ndu=1~G$~ zAZRAw48oteSRWM(n58H~Xhf*~1- zp&5o@8NhH1&j^gjNQ}%tMqyM&V-TY=24gZ7V>1rpG9KeI0TVJ26JzEubD4R}d}aZ& zkXghmW|lBZnPtp!W(Bj7S;eeo)-Y?Cb}K{b zdzpRAe&zskkU7L0W{xmNnPbdx<^*$+ImMi2&M;@0bIf_>0&|hM#9U^sFjtvt%ys4l zbCbEn+-B}DcbR+4edYo4ka@&BW}YxlnP<#%<^}VTdBwbD-Y{>Ocg%a{1M`vj#C&GH zFkhK(%y;Go^OO0-{AT_zf0=(w5;iHDj7`p_U{kWG*wkzqHZ7ZuP0wavGqRc3%xoN+ zh0V%lW3#h4*qm%GHaDAx&CBLv^Rormf@~qSFk6Hz$`)gbvnAM)Y$>)hTZS#mmSfAa z71)YwCAKnKg{{g~W2>_@*qUrDwl-Ubt;^P9>$45mhHN9YG24V~$~I%0vn|+oHi1oK zTe7X#)@&QLE!&Q5&vsxtvYpt@Y!|jG+l}qc_F#Lmz1ZGtAGR;skL}M6U=bq?JB^*r&R}P^ycpyMSHD zE@Bt6OW39CGIlw;f?dh3Vpp?k*tP6Bc0Id+-N^^osdw@O29%2u(N7$q6G4?onf<4KeVo$SY*t6_8_B?xmy~ti-FSA$JtL!!QI(vh? z$=+gbvv=6L>^=5A`+$AOK4KrUPuQpIGxj_0XMND7jHpd088dVrpw7w8T8fWDv~=nn>ffnX3A42FQAU>FzcYXW`LPs7MKk%fCB=MfC4mN01E)%01pHp0tv_f0tKi* z0|@BA04A`24IJPC5BMMeA&5W>%mH)3JTMOTjX*9IOB;ZehKCmAg00+S#a2Ol`N5L_09Gn0r!6|SW zoB?OSIdC3a02jd}a2Z?ySHU%K9ozsn!7Xqb+yQsNJ#Zg901v?<@EAM+Pr)B&j`MCUC0j?ldh%3w$;fiv_ zxZ+$1t|V8AE6tVR%5vqn@>~V3B3Fs4%vIs4a@Dx%Tn(-!SBtC7)#2)L^|<<61Fj+0 zh-=I>;hJ*IxaM37E}l!^61kRKE3P%yhHJ~U&kWGx^q3ao?I`k zH`j;j%k|^>a|5`6+#qf+H-sC?4daG$Be;>=C~h=2h8xR`Eo6jxa7IKTY#oQ8ZDYuMU&aL29a;v!2+!}5zw~kxSZQwR?o4C!~ z7H%uIjoZ%c;C6DmxZT_yZZEfw+s_@~4swUM!`u<>D0hrI&Yj>+a;Lb{+!^jHcaA&H zUEnTqm$=K^749l`jl0g>;BIoaxZB(v?k;zayU#t~9&(Sk$J`U{Dff(f&b{DXa<918 z+#BvK_l|qdec(QFpSaK57w#+fjr-31;C^zyxZm6#?l1R`OTs7Rlkv&<6nsiP6`z_< z!>8rb@#*;td`3PKpP7&2v+!B@YXM?fDLTN4^u^neW1P<-76S`5t^vz8Bw{ z@5A@y`|k7!Vl$#@x%EM{78NjKbjxIkLAbl<)`t} z`5F97eilEQ$9SA4c#@}hnrC>H2Rz5~yugdR#LGP76<*~v9`QPF@Fs8ZHt+B*@9{n# z@F5@ZF@6p|m!HSa=NIq``9=I^g;$9qmW6+EW`;}gseg~A-j-6$SLF!atnEcyh1)9zfeFZC=?P33q^#YLNTGZ zP(mmvloCn{WrVUqIib8zL8vHH5-JN-gsMU{p}J5*s43JEY72FQx7=-GuH!522^fOXw~1 z5&8=Kg#N++VW2Qb7%U7Ch6=-k;lc=Eq%cYtEsPPy3gd+F!USQWFiDs!OcACE(}d~5 z3}L1)OPDQS0xl2&DNq6}Faj$8ffIN^5JW)|WC03_pbDCR1YIx$Q?LYEa0FNI1YZb* zP>6(>Fh`gx%oFAd3xtKjB4M$xL|7^;6P61rgq6Z7VYRSESSzd()(abijlw2jv#>?j zDr^(B3p<3J!Y*OAut(S{>=X722ZV#dA>puaL^vuO6OIcfgps@JIM7{1cLhNyTJhaxsONQcNYL7So7n z#dKnNF@u;<%p_(O72t`FyMNLGaE*hdKTB0pFqAPl$F9u>L zMq*5yBhD4)iSxw;;zDtexL8~wE)|!F%f%JqN^zCAT3jQp71xRD#SP*{ag(@N+#+rj zw~5=u9pX-Lm$+NpBkmRViTlL^;z99{cvw6l9u<#?$Hf!kN%53;T0A4370-$1#S7v^ z@sfC1ydqu|uZh>i8{$pzmUvsdBiP#Sh{~@ss#j{33o8zlq<)AL38(m-t)!BmNctiAkiSQZgyIltM}=rIJ!hX{5AL zIw`%BLCPp)k}^wiQWhzzlugPm<&bhpxuo1u9x1PsPs%S9kP1qLq{31Wsi;&;DlV0f zN=l`q(oz|ztW-`aFIA8#N|mI_QWdGHR86Wb)sSjRwWQio9jUHVPpU69kQz#jq{dPc zsj1XVYA&^q;-v&BQEDl*l3Gh`q_$E!slC)e>L_)RI!j%ou2MItyVOJKDfN(Y zDb12*OPGX9ghWb|L`#gsN+CLu|e49S!%$(9_+l|0Fp0x6Ut zDJIR4=1TLV`O*Sup|nU^EG?0iO3S3>(h6y%v`Shnt&!GB>!kJ425F85l`x-H$2?n?Kh`_cpHq4Y?4EIpB)O3$R{(hKRO^h$ayy^-EZ z@1*zA2kE2qN%|~(k-kdbr0>!X>8JEd`YrvD{!0I(Byv(YnVeisA*Ym6$*JWua#}f^ zoLrdyTe+RwUhW`wlsn0tnTjg!? zc6o=qQ{E--miNee<$dyg`G9;-J|rKOkH|;mWAbtNgnUvyC7+hh$YQ~o9YmjB3q<$rP#m=q?1$zckZ5~hNwVH%hgri1BW z2AC0Mf|+3)%mTB*Y%n{_0dvA!FgMHt^TK>EKP&(X!a}exECP$dVz4+Y0ZYPCurw?K z%ffQ7JgfjK!b-3*tOBdTYOp%20c*lqur{m%>%w}lK5PIR!bY$$Yyz9YX0SPI0pno; zOoT0AE7%&gfo)+s*dBI(9bqTf8FqnPVK>+v_JBQMFW4LQfqh{=*dGpn1K}Vz7!H9$ z;V?KHj({WKC^#C9fn(t~I37-b6X7H{8BT#y;WRiM&VV!FEI1ot5QhXLAq8p3Ko$bX zK^_WFgc6h?gbGxl1`*Vu0ZnK@8#>U19`s=VLm0sroCD{=d2l{l02jhVa4}p0m%?Rm zIa~o(!c}lJTm#p_b#Oi005`%-a5LNjx5903JKOpTcMGIeYM8Y=21-MvkSDb1A@O1zSwBq}YHR!VE7jnY@nfN@t~u z(pBlEbXR&PJ(XTcZ>5jYSLvtpR|Y5pl|jm2Wr#9V8Kw+ZMkphdQOam#j51akr;Jx7 zC=-=Q%4B7VGF6$TOjl+oGnHA&Yz0$rg-}R^QfP%ySOqAY!YhIzDv}~AP*D_B(G;ZU zilLZ_rPzw2xQeIvN}z;Fq{Ngt%3NihGGAGsEL0XLinnsQyaq1;q%DYun7%3bB2a$k9%JX9VjkCi9N zQ{|cRTzR3qR9-2sl{d;;<(=|g`JjAMJ}IA-FUnWtoAO=xq5M>SDZiCJ%3tN5l0;3a zCR3BEDb$o|DmAs5Mop`xQ`4&%)QoB-HM1J0W>K@M+0^W64mGEmOUk%c;%W)Cq*_WXt(H;Cs^!%3Y6Z2TT1l;}R#B^})zs>04Yj6PORcTe zQR}Mp)cR@zwV~QbZLBs?o2t#!=4uNyUQJLF)s|{2wYAztZL79Z+p8Vaj%p{hv)V=N zs&-Smt3A}7YA?07+DGlH_EY<-1Jr@)Aa$@hL>;OQQ-`Y~)RF2ab+kH09jlI0$Ey?6 ziRvVEvN}bbs!mgMV7(imA9tsH94%w92Tg3RF(zRY4V1NtIQoDyph#DpGaT zP)*fRZPig-)l+>nP(w9RW9l4rt~yVhuP#s*s*BXc>JoLSx=dZJu25I1tJKx%8g;F@ zPF=5VP&cZZ)XnM^b*s8f-LCFXcdEP8-Rd57uewj&uO3hjs)y9W>Jjy*dQ3g8o={J! zr_|Hx8TG7sPCc()P%o;N)XVA>^{RSJy{_I+Z>qP{+v*+lu6j?suRc&8s*lvi>J#;; z`b>SUzEEGPuhiG-8}+UFPJOR_P(P}l)X(Y{^{e_#{jUB{f2zOK-|8Rruli3-q9xUm zY00$|T1qXImRd`rrPb1D>9q`6MlF+;S&P%MXj!#vT6QgmmQ%~6<<|0Od9{36eyxC3 zP%ESr){1CFwPIRvt%O!mE2Wjz%4lV^a$0$u$hq*d0cXjQdpT6L|4R#U5`)z<20 zb+vk0eXW7kP-~<$)|zNdwPsp#t%Vk^C1{CSORbgGT5F@V)!J$8wGLWGt&`SS>!Nkl zx@q0D9$HVWm)2YBqxIGLY5lbU+CXiPHdq^?4b_He!?h9GNNtohS{tK{)y8S#wF%lp zZIU)wo1#tCrfJi)8QM&3mNr|%G+ZMzQlm6lV>DI+8mIA^poyBK$r{uYP1Q6FX}V@; zreN7`fUiS|@` zrajkQXfL%_+H38N_EvkRz1KcyAGJ@~XYGsjRr{uW*M4X}wO`tA?T_|X`==#ANl`MC z9Hl@hQ7V)gr9o*?I+Pw|Kp9aclo`dLEGR3=hO(m^C@0E=a-%#bFUp7VqXMWPDufE7 zBB&@ThKi#Ss3aqXwuU zYJ?i2Ca5WDhMJ=mC>|xCMAQqZMc+T7_1lHE1nbht{JFXd~K$Hlr4o(odQrWYUR*Dsm()w?rS&p;S-qTIUaz26)GO(g z^(uN*y_#NKuc6n}Yw5N1I(l8bo?c&Xpf}VT>5cU!dQ-ib-dt~?$Lk4tqTW((rMK4G z=xz0OdV9Tt-cj$Qch3bbW?CQ=g^J)-fH|37ym_oz@wh)q&3G zye{aXF6pukbwyWoO-H(}8@j1mx~)69t9!by2YRSSdQ6|A&(-JY^YsP#LVc0GSYM(q z)tBkZ^%eR`eU-jiU!$+p*Xir^4f;lXlfGHsqHoo=>D%=k`c8e9zFXg;@74F|`}G6* zLH&?^SU;j4)sN}N^%MF@{gi%MKck=3&*|s&3;IRdo>DToe`c3_oep|nz z-_`Hw_w@(*L;aEdSbw5F)t~9l^%wd}{gwV&f1|(E-|6r55Bf*_lm1!%qJP!D>EHDq z`cM6r{#*Z}|JDELNsOdMG9$T>!boYPGEy69jI>5NBfXKq$Y^9TG8=J579*>X&B$)# zFmf8XjNC>ZBd?Lq$Zr%d3L1rs!bTCJs8P%)Zj>-e8l{ZVMj4~5QO+oDR4^(Um5j

Ji|8vBQzo-X3R0>8uN_##sXuZvB+3#EHRcE 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 z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk 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

TV6Urd!Lc?bdPQ+<3RHThC2!6W#i5 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

&_ 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 z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R;X(_U=AN^6Ree z{ps1KS*>l2ZQ(4K;MS8fN!+gS!@X?r5L(vC-c|H4UaetB96VqlufehQ3Yje71{#8| zW>;%@4{y>$gI4VdLq67sum2d@^!nY`=2*I{Q71sTJ&-s4( z;q>n}+p{w}S}pJ2RQLJy@8O*9d7bln?4E7}5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z0D-Gj;01=i(E?X%za%aM5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** z5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0 z009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{ z1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL 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 z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXFT-ySji2wlt z1PBlyK!5-N0tCJy1g`C?Q>7z7fB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5Fqf!OQ16mAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+z*mI8uYLNDUeRqVs(QA}Zgl&$PL}YFw)ln;?&)4x{>OAf_oLklyN$Zd{ulPk z4%cNh!v0xVHY@YPI2)sN{buFm4<5VWl@V{NEm$Z2pWN7mjByo z{^yRD@aBk6rdt0O*CyI~LpRQUnD%f!wteSEe(JgdCH*H``e(|rQola^%`zX;MbqEG z@AC(qxam11{ms2Ktycc6mE|wFT}t_Ds$K~YAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNA}^#y+I(|`1eZex+}*)qG)?b|w8!aLgH8%nsRdu90_ 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 zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ 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∨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 z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0@qgHf^MM&uI=7tZ3GAqAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5)m zlfXNhL9-P9visPV?)lbWta2Bk%h62Fj7{Il;18DDrE2*<_E6Kj_RZJ6S;uEBb6inY4&cOx=Y4RT*R_V zHr!@zi@=KbZ;PWs2<%RQcQyx`zZ?IuyZ516|NHm>VLQ+N>tASn-q9w_caD7brb9pX z%Ar5}y>Gw#y~F#z-c8;}K3FquOqo3J!e5y@y-reY?EXWcQ#=Rx~k{oyxPBK^%r*9I?+ zZS-^TOenioNoy8w9dO+nl5#@nl{z1i|b(g;oc<*9Is<$tM$0~H}Ae~ZNhTTM?Lb{QSATh>$=Z0lB{KjtgEt|Ic14pl$xZgbSS2sVCt^3XRwv~depf|BSZKa@C*T*7KPjzi$ z`l=_l|LOV7nJ)qHpRah%S{w17RcyZUi~oGZbJp63|Eyy3m0$elE1t8~M*L?Lo3H%h zKVR{jwKn2EtJr+y7ytQ+=d866|5?T6E5G>9S3GB}jrh+hHedP0f4<^5Yi-1TRjS!*Nyvx?1Ee(|5Lc+OfI@t;*}zVeIze8qFt+KB(GV)K<>{O2p4v(`rZ zXBC^T{Ng`f@tn0b;y_(74Lp+#lJ7ISmWZqSn=-HR{Z-Si#0C(ixuyF zZN_(74Lp+#lJ7ISmWZqSn=-HR{Z-Si#0C(ixuyFZN_ z(74Lp+#lJ7ISmWZqSn=-HHsAj|DF1TKOK@9 z!QP1j>MyY={_XYDe2(_&QfT%69n#KmQpvU>%@ zfA_|2JGNZ>w?lFFmLdMTH+I{x<>J2`io3TA@!!3%+m0<4|LsuRy=931?v0%-CqRGz z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ 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 zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZ;F<|M^32nZK63W-bFspuW>8nV)ZF;b5B-ErkQRGUkG HHwgTHq5Pa5 literal 0 HcmV?d00001 diff --git a/tests/data/imageformat_mmls_1.vmdk b/tests/data/imageformat_mmls_1.vmdk new file mode 100644 index 0000000000000000000000000000000000000000..2c28f34236b4b83bd71fc499342d4ccfdbf4119d GIT binary patch literal 5832704 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

5p9Tg9xG3jMCGaSOnI)nP+lspl-J4| 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

rVxrIDJULl{5Unn3H6bcE2g(5;xp_ouy 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

6=3(=QdDJ{+ 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 z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&USWW_!fdByl1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs 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

TV6Urd!Lc?bdPY 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

6=3(=QdDJ{+9yd>zC(Tpl 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%0DX`?L?5P) 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

TV6Urd!Lc?bdPYy7k=pZUeWW+sJL~HgTJ}&D`d0 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�G%dKzRYPGsE_VT-| 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 z5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo z0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p z5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo z0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p z5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo z0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p z5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo z0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p z5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo z0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p z5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo z0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p z5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo z0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p z5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo z0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p z5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo z0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p z5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo z0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p z5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo z0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p z5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo z0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p5CIVo0TB=Z5fA|p z5CIVo0TB=Z5%~YxyZ2Z*uJbV9XYb`plx>L;&C-r5tt2K8;M$>OrFL64xqA2^Sr0~{ zTsje|D_f$dMzRQsvX!(=*G>Vy0)Y;KAccckfq^!01k?rWLWxsYPFh2)qrw3HNSdUD z0lb~vYW(Wzi(#F-M!1ZB$rQd_cz4Ona7!P&iuYPGqZEKy95XjAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C7W=WtJ2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+KnQ&6o3C6`dP9oG zW3pG)4c-^&?r!ncNEgbr@ycOq`E5Z*xHjB}B zpWS+G<{NYiPNe=X^p38-SvFS3iPZmwD?i#_$bIPyM(f|xwP}3+kMu5IwQr?N*#Bd+ zrz^TV@zl#VFXsMt^$(h+tQ+i#bU9u*wDrGh#ec2(e?4O|R$sey?AqA!QJ2r{d1Ax5 zth>!q4#wp1;(wy`kJd9fUE7uES3i09s`a`5UHx~r^&i?9>ANyR4DJ5EsSVNM)-qoI zXxXFFx$TEO|HaK4qWtH(@|R;->|ay+zWEm34#nMY_9NyfxB= za&5eF*jheaE-AfsoAsA8%eJ@6+6?Rav8*4{qj`E`>zd7C^xbE-UYq#_-GURT{|mjN z>u;8g)o~*Azv0S{_7`$rI)l;r_jGL<-~S`M%UA7NDHHbp813nbE>Ar5^3996|6Toq zrYY+NyCPkVR}O9c?^^L+tNvfln2goeZXLTewtUp(b9XQ?tfSR-EIAcc1HTH%n(Dn|8HtTw79j5*FReJ=yY!Tq0fJD^M)w@ z`L6usSQh)&l)n_yIUKkAWB9$a;qX-(qx_}CwyduGgNf~r+NNoLTdFYu0t5&UAV7cs z0RjY0U0_GKGv4Q4S8gje#`umH-&1aix%ZUYWA4^iwmar;k0objxOk-4rI^n5O*!QA zha7e^E!Z7xxv5-V?uypDJ6d>4%w@aJ{Lmk%VlXm&q#JgG)J@TzY}IYi)>~uhY!1~c z>%2Z*H+Gd@-@V`65wW|z+#IdCA-poSHAk263@1w?<&RFcZ{{<;cQ$RitBLUL^1*21 zjj`m;Xm7@RSF}2h#4|PQ8Yy@%GChp%2crI4;>gR$p8XgvkF;qirn|7NJg?eOR=4kL z_T6mS{v36~Qlzixrfa$*qM7HA>$>G zG%~$*`>u;4@s?=e4UOrUJTKR#JXt3q9gIv5+jo8R(%sFKVze)fWIdykUmhuaFfu)C z-yIR#UEy^{bEdf`rf-iH-*%Rw{LDz3M%!0|y(3z8U2|SOd)M5NCY5iG%q+$9rf$Bb zZTm(to#n~rC)O7aU1QkM^oRGB_l9HMyW|~0UXSyb%xg*BCFBv1SLQP^w9ROW9;~Wh zWW}oGW(W`=;m{IypF2pXJYxL z((U=kwz>QhrF6|5u1KQ4Zi*T%%c)%cN-67CFFjA@b{)lXo-|xDPm91#@joq&3L$WQ z3cS8-E`LA%<#6jg*Z$Yh6T<1d{tte-^|`c7%D1+E`>HJ;d|}IP{l>G;e`o8)r@F-} z$vbPtl_hIWe0kg2%j?pm*SAyO>(aXX)tuIQkM^#tZRx)7__eL2Jb#@1oo>H&ZJsW_ z+-FN*e;lt@pVnBf)$)tQe=U}|StkB-6Y4d0RQ%UunVW^;KR2OXb4SI0O_sS?DE@O3 z>NR&%{MTfen}y>4Y7O<$%HOkY=;iaE4KIHG8#^QYrTdqAPmeVE@pvYb!;A5JD4!A4 zVPoX~R5!EqD|P93x_12QbH7!&NB-be*VlAazOk9R%Z=s!^3n2O`EaCnm-m%>%YkxV z{CluGT7Ig0pgd9@DvypF5eyb z_Lf_sga?kAe{1KNB1$a)%|$eFWr2>@*3Mc8T*mXj_R>_F61^duKhoGg80q~H#hoYg?`=(ewcXcDX!o9Y);0RPYrNgr&K1jU`pmZbnpN$7 z#}yZ>dED>^qm*5hWhZB0QZFj})eolHSd*ZU(<4|jcIa@A}1|H=8SnJoeFpRIUK zyEo!Lt=Mek7ysFc=d^nx{?m%hR(|oHt$0qmH{w67*lgt&|JjP?w0k4|(~8Yje(|5J zcuu=F;ygK*^1}1dn5kSip^Gj@t>`DPP;eaKdsnogK*^1}1dn5kSip^Gj@t>`DPP;eaKdsnogK*^1}1dn5kSip^Gj@t>`DPP;eaKdsnoW|8{<*JP{Lg(1&SeY4|6J;y`?|&d+{fTtwm|&P zrT($%_WRF%|2dBjzyI9+ZnfWkKGxad=yiVo`DhbM#syse$3^CAUi{}P-s5{K{^KI^ zH81}274PxA75{OO`I;C1`HJ`W-irUY$b8L<|9r)Jd~d~nTx7oH#ecryJ-)Z%KQ1y~ z^Wr~W@gCn>@gEnNuX*vGuXvB|t@w|N%-6j5&sV(1_g4JJMdoW>{O2p)<9jRq<0A7l zFaGlt@A17A|8bG|niv21iud^5ivPICe9ephe8qcwZ^eIHWWMIbf4<^9zPI8(E;3*9 z;y+*U9^YH>9~YUgdGVjGc#rR`_>YUs*Sz@8SG>pfR{Y0B=4)R3=PTahdn^9qBJ(vb z{__>@@x2xQagq6&7ytQ+_xRq5|G3C}&5Qqh#d~~j#eZC6zUIY$zT!Q;x8gr8GGFuJ zKVR`4-&^q?7n!el@t?1FkMFJckBiLLy!g*oyvO%8fB(7H{L3}ZUGyivc&2{;`FmZ# zqvemc#{Ah9*e@JsoBUN)-%YpOxaaC}L3!?;_IGw_^RAAGr{m~&;i7iQLR~SIZZGXG zy6-HTnl+!>^TdXAv0Y6|x8cE9dsF-y&;Oy%e{u7M$Y0avyZp-&^1tEAkMY{COU_>b@jriK zcRE@w{-;Cn{4GQL&)?Xcj+Tr6=}%MkzbH+H9^<>G%j6wlu>#Q*$_ot6_IK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAVA>!5;zjW#usyZ3d7}RY@eS$g;q_y=^A^nQvVw3EFy3`fx+=I zSWkce0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5;&(dAwYlt0RjXF z5FkK+009C7UX=pxx#^a7?<|Yu-`#d`)4pEmm3PMLmwPe0ZrJ3F-Q+@-X71%?dV4c| zUyO6=x#xan-4FlS;ohWlLz8=Kly!{_J7a!dvn)$pEH}q^d$enPvuyow>nTf3#!}N- z@4Ceu<<|0^vb$S7h&0>YYckecrTkd8eyK}`7!{>WuUIMPRX+ohxZ|CaJdc_8iq9xM-)`HFu$I8Re`0H;SMoJ0W3<>CG?O`Q&xkorv390 z&zmv_UAb*}Yt_?aJI<&^^Elb8o>75e|NphF|F7%%|1)F#Ki|>j>7X7l+5hu;S&#PY zuX)5zdf#7{*M68==8)TE-)gr$iR=8KX5;eY&$nqUKkxIei~f5sdhw0X&-b>goAbz^ znQr^%eKDO=y|QkQ`%|9_Y>nxKa&5Q2Tg#`*C8ax0tzn?+So(QM z896-jFl^5OJDc6k+{fzw5B%saG|vIY)7n3qLSmGqEjKf5FT63PPw_h6>_~6%txc)B za@^csWcdr_f5f=<_uq@@KZsWjZGV5dY-;AVmm|H)kADAtVQyJ2KDu9TZS%MHG41)` z!YncJjxLK@zTUfZuikXWPz=O^N-Ot@+yBiUl#TFOqUWw&;Rp ze|E;yjyQAgiT8B(#M%D3n7%Ia#E{2qj&u8!GMZ&;kLnrm^qgPUuH)6SbluAHzfX1V z|2KqEzW?8qSR?&E9kcJ&V<5x19Iy7sXwL;1k$RnPy+W)h^o=pGG z?MD0gEloL7{GG2K8|2V$#?3h@r`9+9{E>L4f3R7xE5?Ins=bok7t=X)_V4?bnp$Jj z4E5Bv)XmrZ7*Dr!@bx@Xv!7a8qj_qj*!p}G7~cQ?m+tz%sq6ob=YctLnab;bUg+u( zll^}=UbX+{x!`2_e^W&51kFr4%JahhX0q+Ccf|B5zAtD>%jW{u$CdxSazpbB@X=;z zdv3^@+P!G^GUo^J%5z71pF3>mD{qX2F|_Bvn0WEuv@2`ctj+tM?FPgCo28$P zdb)ce}7N*=zK?&_x~4^r}Nfur2oIBS(iubE7xSc%)OiwO|PHo z{=eUBHZtnozm6;!eg2<|H%@>5zpAw6y-U9-Df<7N@jURu@%;Zlq=Q&E?B98YYlo#S zUFqK!w-~>&xH`?!Zj9Fz*S)rRE_W!l+mqWi@3$`;dB2_c+S2kpLIUOqBOR~qUc<9X zt2%mjp5-3O3{AP~Oa6VPAG2BiP4O>>ENisf<;at-9JV%3II^xTsImN8-;Dm>t2w9KI^k zr7i$jULDdnH-9o-yW-Ve7n=V97IVX4c-(Z$n&8BAm$t{v`^pu)dp2c`FUKp7gEqdK zN1lJQ$4xY+8HU%7Qr2qM==yGxV#7VeDcea-y#7@x%Z|CN@uEgpUUe^=aD+z|Hwk9Pe(W7WR@A2y_Z zrSVeJh8)#BU!890w+G1}a%4GWeYSU9>Bl(Zna{625`TSoB&KudH{()X^WYEs)W?4I zkN>bf-v9l-+pZYK?`+gl>*yLKnKOZ5|Np~XZU4Wp>HmvmS02`5{Xd^gFO&~8MwxrL znabmRs_TD~e{^*G>wmN-HaNxm|7HjC`QN+a3U)C1{zu|nz@cn=c7x`+x~^Ou)BTvO z&z*P1baPgStuxI+wnv_P(RbrNzT`8_-#;d$O}3FyoS(AjIPdR> z`-JV`;hNb*KlVm-6nyHg@s`0q6spsMNKjZf|dvagY z*X~hUUj{7?g?iqe6z{sc-D)^K*?NX0oXXU&|JPFTK0mMj{XE!5`hT7da$VCGBF+77 zu6Ny$voq%N7@G9lzb=pcT{Y~Axk0lew_aE|7LWH_?hC!6{~q5gYy0K;ew5aa>F(Up z{7r83?`F9!he5pBV?W33-sMz{XH3rUP@_4+yJ**rA<#SO`TuJp_oV)x>*^7s{~v?( zyjfMFdEPWwLr<%~(f$8*QU0XOn?9Z0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1lAC!-~auw?(=``_y51P?9cxnKl13y|^Qn=3Oy#Fz z>aZmzVu$m8OVt1O)PDA%lzxYFb^Gz1Ro~gwe8wO)>gV>|klQD1*85^EYwBGn-;T+C zys~w5$h@QVJ`=O~%3*6Gl%K(9gA~;?u!|d0GD_e)_!)WnCvd*8;=O|NM)w{y+Zx-}(8U{0v&gGKY-oa!z!^`PBb! zkIyjH&%GUr_V3Dl==$N#nC!=EwEtfk^P~MR*XL_=NRRXHIIqzh-4oOEBQWg$pBn4` z%XtA9x&CMW&(CnyBPNgc<#^TMO!WW#weYwa)$ji~)$9MH&y606x^`uKN1X@S&-Lc2 z**g!^Xy)D-=1*YQ|6jN(dvxCS<@bLqw%?^P*8lUf)eG(2@=0I+$3Op@bvEA_lM^Gu z&Y0f6G9SN364R%0{~z@>J2>g{+=sHh=A4)B1LFHeV!9tw$NC*w3^cZ%BYBgyh_Zr0cG|9rXqo`FeeSKLZc9o9wp zyJJ81miE_BE^Bfe-Tq1C*5xY&cN4YzZ2#^!R%-b*Uk2g)yHBdEpS5(@|9|fNP4|f2 zpZ$M*``t_<{Xf6|Cy()Z#mL;t@v6fV*Z;c7G1Hx~cHc^l;qQOc<9@e4?ItGm zt3j;Kwzu7QxWo1R@=~ljkzo*-vdv{8s=Y zaE)d($S{Wj!~Xx`s{8+q<@xLo!|u?0|5tw3O+8{xw*SZV;izHK_y6o)$$9Gc|Mj}G z_V??w&*OGwea-g(Ei`?(AG620{^$C9jSlIOMo-2o%WJz$a79RbT<%n zwo7ZhS6ux4hV09+d}prfzNaYb>Bp<)i^)~PiJf0+G*@kEW^M$A{r?U3;_%Ge`iehW489I>~l>I4W3L>DZe8uUpe%fao#uQHhdP@$moZ< z>Ge_b?zm&vAKz(}!xhbV_(p3uLybtPXl zp?%}W*ZBOIZr?R4d)`ju@sWqdiJgDPHa_dK!~XxDKaefYqo#fT|4bh2BmF-o^F3&H z*iU@_UytueY4pQE6tikLk^Z0Wdh`8%z5kz7eqFw*f|#lOzkT1E?@Qa^P$au@@-$ud zqlxYNmge_q7UR8Cd)>}ncdXy1N!KJl(c$zQUp1O1TC04sB{1y&AN%lV|L>JQ80-J} z{=Xludc+kK(Qx<#K4#_!i^0roFzo;T@dWyRK7*-8%%uKbpTE?8U(>q0zXtNj^#5Akq_p<0T3xO8boKxG+-DFK zoJ#+X`}ViworL}$2!^vPFzo+7Hun5~Uv~82+tK(RLHSHP`~TtQ#&=TxufO+w_~oD6 zkoW)NX*`EJYRKPY8XtDXf>sMa$nZL*DwqTXzB{2%5!%TLF% z_55v(hfBYFAfB~96u(pPaLo5teyis|^XtF|<5_k7?LLQW%R953&2z$D*&fsVm_63t z2{uKZeC5zSf9S>kh`FzsPs@C_QGNdBg?BezHLc5cHTg>S*M+vuT(qTW>wVGc$D60= zqxwW3R^Y_^o%5_h+ztdjRcKP96gB4rkZ$9MEZ^os( zuKa^|UXj0`b};_sv-}4_^Q}=^{w~IF$nEnGIydLFVLMD6OJLal|I>0C@%H(Dul;{* z>xSEA|IcITc-Q}W{M6&ArgeFLSmer7{?^*~urn4szOrzkIePQ{fA#TuxL3;^PggeW zCi-1^yyJHe`L1sA=F`kxbNuI2_Jfb^`1&vQFaO!*$M$C9xUSJ`cGzg{1cv?p_wHTY z|38&|a;*R7HLM;nnR_{2b;x_*>?ifQRj*?;t;_p$gOPMn{~xU6sn6wy{lAtsDP7sL zo9K7xiC#Ack$+#aO?w__|NciTkB{JS=$-W}7K`}&xANBlkT#z@~DbN{p{{oI~MYBZas7|or4_|IL)?JxlX1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72%Hgt@7!_dw%zZ!vmZlQ*wj_=y;6Rx94Uh*+xbBm zlq0|2t-GL27rNP(BkjfO&j;%s`pUY8{#7pi%eO!C#J7LD{FA@h_squ2FWa}beCt!& zURU;h{6`l{*7exyzjEEzzI4}fmmYY{$N%cCFFm&5yWi-Q#}@zezm>~=?tg9H_r~&- z_kAYvfA%l7UH;sqU--HIu>D`|x%|MN{JjkqmdF0+ix-t|y!E28?y{eF`yc&g>A(5e zy+<}|DT~`KDo^~*kqz6*3-2#)e)ePk`|0wv=ia#Ys%IX1%ifRw)$SX1UH90IkN>}g z-hs=u?c4aZZTs%nvTff5W$&Hw@2+jzw(WbmxA)%HZG7&HZ-3_Nn=k#%mtXVOfBvOE zeWiEk(B9?CHthY?EoJZGhBuYV_U_A_+q-MSo%?!a-^JxC*Jm@gUH;j>c<$1@AN0ynOGyzx%5%_g=W5{OVu!URW%D@tyB~_Qj{(RSsV8 zmDhc3V|ni4@BH82eeLG!`u9Ef=uh|Pu>%M0zpuP@^Yypi zzWdhq-qC;X(f)@Yd3gVU`yYL@S-vZ$`ZpXr@X(vDd+6YsZ@mAZ{=rA0j7JaNd*I+} VH)oTN9zN6i*S)Vt*zWq${|8DjL+$_o literal 0 HcmV?d00001 From 166157863dac871eb1c157b555b58f55fb6e12fc Mon Sep 17 00:00:00 2001 From: Shane McCulley Date: Wed, 15 Apr 2020 15:47:57 -0500 Subject: [PATCH 0087/1548] Use local test files, make sure mmls works If mmls was missing libs, it would silently fail and all tests would "skip" with the "Tools not compiled" message. --- tests/test_libraries.sh | 79 +++++++++++++++++------------------------ 1 file changed, 33 insertions(+), 46 deletions(-) diff --git a/tests/test_libraries.sh b/tests/test_libraries.sh index 6c19bb93f0..49b832fa80 100755 --- a/tests/test_libraries.sh +++ b/tests/test_libraries.sh @@ -1,72 +1,59 @@ #!/bin/bash +set -o pipefail + # Test script to run command line tools against disk images # # Currently, tests mmls on image files. Will need to be refactored as we add more tests. EXIT_FAILURE=1 +MMLS_CMD=$(realpath ../tools/vstools/mmls) +TESTS=("imageformat_mmls_1.vhd" "imageformat_mmls_1.vmdk" "imageformat_mmls_1.E01") + +# exits with FAILURE status if the command failed +_check_exit_status() { + if [ "$1" -eq 0 ]; then + echo "$2 test passed" + else + echo "$2 test failed" + exit $EXIT_FAILURE + fi +} -#create data directory -if [ ! -d "./data" ];then - mkdir data - if [ ! -d "./data" ];then - echo "error creating data directory" - exit $EXIT_FAILURE - fi +# save list of supported images +imgFormatList="$($MMLS_CMD -i list 2>&1 >/dev/null | sed '1d' | awk '{print $1}')" +# mmls returns 1 on successful list. How neat +if [ $? -ne 1 ]; then + echo "Failed to get image list" + exit $EXIT_FAILURE fi -#Download from images from google drive -ggID=("imageformat_mmls_1.vhd|15vEesL8xTMFSo-uLA5dsx3puVaKcGEyw" "imageformat_mmls_1.vmdk|1uLC0FjUWdl3uLCi1QaZ8O72q281jtzIu" "imageformat_mmls_1.E01|1YBCh3yP4Ny7eads4TC-dL3ycaNNrlzWo") -for i in "${ggID[@]}";do - name=${i%|*} +# Use local test files instead of downloading from google drive +for name in "${TESTS[@]}"; do if [ ! -f "./data/${name}" ]; then - id=${i#*|} - COOKIES=$(mktemp) - CODE=$(wget --save-cookies "$COOKIES" --keep-session-cookies --no-check-certificate "https://docs.google.com/uc?export=download&id=${id}" -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/Code: \1\n/p') - CODE=$(echo "$CODE" | rev | cut -d: -f1 | rev | xargs) - wget --load-cookies "$COOKIES" "https://docs.google.com/uc?export=download&confirm=${CODE}&id=${id}" -O ./data/"${name}" - rm -f "$COOKIES" - if [ ! -f "./data/${name}" ] || grep -q "DOCTYPE html" "./data/${name}"; then - echo "Error downloading data (${name})" - exit $EXIT_FAILURE - fi + echo "Missing test $name" + exit $EXIT_FAILURE fi done -#exits with FAILURE status if the command failed -checkExitStatus (){ - if [ "$1" -eq 0 ];then - echo "$2 test passed" - else - echo "$2 test failed" - exit $EXIT_FAILURE - fi -} - -#command to check on the images -mmls_cmd=../tools/vstools/mmls - -#saving the list of supported images to dev variable -imgFormatList=$($mmls_cmd -i list 2>&1 > /dev/null | sed '1d' |awk '{print $1}') - # Verify mmls does not return an error with various formats. if [[ "${imgFormatList}" =~ "vmdk" ]]; then - $mmls_cmd ./data/imageformat_mmls_1.vmdk > /dev/null - checkExitStatus $? "vmdk" + $MMLS_CMD ./data/imageformat_mmls_1.vmdk >/dev/null + _check_exit_status $? "vmdk" else - echo "Tools not compiled with libvmdk" + echo "Tools not compiled with libvmdk" fi if [[ "${imgFormatList}" =~ "vhd" ]]; then - $mmls_cmd ./data/imageformat_mmls_1.vhd > /dev/null - checkExitStatus $? "vhd" + $MMLS_CMD ./data/imageformat_mmls_1.vhd >/dev/null + _check_exit_status $? "vhd" else - echo "Tools not compiled with libvhdi" + echo "Tools not compiled with libvhdi" fi if [[ "${imgFormatList}" =~ "ewf" ]]; then - $mmls_cmd ./data/imageformat_mmls_1.E01 > /dev/null - checkExitStatus $? "ewf" + $MMLS_CMD ./data/imageformat_mmls_1.E01 >/dev/null + _check_exit_status $? "ewf" else - echo "Tools not compiled with libewf" + echo "Tools not compiled with libewf" fi From 77c67d10cb21d46110cbfeb886ef195e9c119b98 Mon Sep 17 00:00:00 2001 From: Shane McCulley Date: Thu, 16 Apr 2020 10:33:39 -0500 Subject: [PATCH 0088/1548] Check error status of mmls --- tests/test_libraries.sh | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tests/test_libraries.sh b/tests/test_libraries.sh index 49b832fa80..fa0cae06ae 100755 --- a/tests/test_libraries.sh +++ b/tests/test_libraries.sh @@ -1,6 +1,7 @@ #!/bin/bash set -o pipefail +echo "Testing libs" # Test script to run command line tools against disk images # @@ -23,8 +24,10 @@ _check_exit_status() { # save list of supported images imgFormatList="$($MMLS_CMD -i list 2>&1 >/dev/null | sed '1d' | awk '{print $1}')" # mmls returns 1 on successful list. How neat -if [ $? -ne 1 ]; then - echo "Failed to get image list" +err=$? +if [ $err -ne 1 ]; then + echo "Failed to get image list with error $err" + $MMLS_CMD -i list exit $EXIT_FAILURE fi From 61c8753702446469bedff1e7f12f7010854eefe1 Mon Sep 17 00:00:00 2001 From: Shane McCulley Date: Thu, 16 Apr 2020 10:54:20 -0500 Subject: [PATCH 0089/1548] Use our mmls --- tests/test_libraries.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/test_libraries.sh b/tests/test_libraries.sh index fa0cae06ae..b4a87eef7b 100755 --- a/tests/test_libraries.sh +++ b/tests/test_libraries.sh @@ -8,7 +8,9 @@ echo "Testing libs" # Currently, tests mmls on image files. Will need to be refactored as we add more tests. EXIT_FAILURE=1 -MMLS_CMD=$(realpath ../tools/vstools/mmls) +pwd +ls ../tools/vstools +MMLS_CMD=$INSTALL/bin/mmls TESTS=("imageformat_mmls_1.vhd" "imageformat_mmls_1.vmdk" "imageformat_mmls_1.E01") # exits with FAILURE status if the command failed From 6c40af3804780ba0dd9c6f403b5905a121b53cdf Mon Sep 17 00:00:00 2001 From: Shane McCulley Date: Thu, 16 Apr 2020 11:19:36 -0500 Subject: [PATCH 0090/1548] Use mmls.exe on windows --- tests/test_libraries.sh | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tests/test_libraries.sh b/tests/test_libraries.sh index b4a87eef7b..959ca6bdc3 100755 --- a/tests/test_libraries.sh +++ b/tests/test_libraries.sh @@ -8,11 +8,13 @@ echo "Testing libs" # Currently, tests mmls on image files. Will need to be refactored as we add more tests. EXIT_FAILURE=1 -pwd -ls ../tools/vstools -MMLS_CMD=$INSTALL/bin/mmls +MMLS_CMD=$(realpath ../tools/vstools/mmls) TESTS=("imageformat_mmls_1.vhd" "imageformat_mmls_1.vmdk" "imageformat_mmls_1.E01") +if [ "$Target" = 'windows' ]; then + MMLS_CMD+='.exe' +fi + # exits with FAILURE status if the command failed _check_exit_status() { if [ "$1" -eq 0 ]; then From 5d855b2cec82cd2253a0e2939c3316bd05cf0c35 Mon Sep 17 00:00:00 2001 From: Shane McCulley Date: Thu, 16 Apr 2020 11:21:30 -0500 Subject: [PATCH 0091/1548] Use EXE_EXT which is empty on non-windows --- tests/test_libraries.sh | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/tests/test_libraries.sh b/tests/test_libraries.sh index 959ca6bdc3..ba4ff8beec 100755 --- a/tests/test_libraries.sh +++ b/tests/test_libraries.sh @@ -8,13 +8,9 @@ echo "Testing libs" # Currently, tests mmls on image files. Will need to be refactored as we add more tests. EXIT_FAILURE=1 -MMLS_CMD=$(realpath ../tools/vstools/mmls) +MMLS_CMD=$(realpath ../tools/vstools/mmls"$EXE_EXT") TESTS=("imageformat_mmls_1.vhd" "imageformat_mmls_1.vmdk" "imageformat_mmls_1.E01") -if [ "$Target" = 'windows' ]; then - MMLS_CMD+='.exe' -fi - # exits with FAILURE status if the command failed _check_exit_status() { if [ "$1" -eq 0 ]; then From a69e7b32f9a402e2e9d745173ff9e3c014990a31 Mon Sep 17 00:00:00 2001 From: Shane McCulley Date: Thu, 16 Apr 2020 11:40:15 -0500 Subject: [PATCH 0092/1548] Print env vars --- tests/test_libraries.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_libraries.sh b/tests/test_libraries.sh index ba4ff8beec..eda97fe753 100755 --- a/tests/test_libraries.sh +++ b/tests/test_libraries.sh @@ -8,6 +8,7 @@ echo "Testing libs" # Currently, tests mmls on image files. Will need to be refactored as we add more tests. EXIT_FAILURE=1 +env MMLS_CMD=$(realpath ../tools/vstools/mmls"$EXE_EXT") TESTS=("imageformat_mmls_1.vhd" "imageformat_mmls_1.vmdk" "imageformat_mmls_1.E01") From 7214555dd4f927d1fc33c1a27d7b0e4b887ebfe7 Mon Sep 17 00:00:00 2001 From: Shane McCulley Date: Thu, 16 Apr 2020 12:08:24 -0500 Subject: [PATCH 0093/1548] Use WINEARCH since EXE_EXT is not exported --- tests/test_libraries.sh | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tests/test_libraries.sh b/tests/test_libraries.sh index eda97fe753..f4fac9b690 100755 --- a/tests/test_libraries.sh +++ b/tests/test_libraries.sh @@ -8,10 +8,13 @@ echo "Testing libs" # Currently, tests mmls on image files. Will need to be refactored as we add more tests. EXIT_FAILURE=1 -env -MMLS_CMD=$(realpath ../tools/vstools/mmls"$EXE_EXT") +MMLS_CMD=$(realpath ../tools/vstools/mmls) TESTS=("imageformat_mmls_1.vhd" "imageformat_mmls_1.vmdk" "imageformat_mmls_1.E01") +if [ -n "$WINEARCH" ]; then + MMLS_CMD+='.exe' +fi + # exits with FAILURE status if the command failed _check_exit_status() { if [ "$1" -eq 0 ]; then From 3674b2b1da400faec88ba35ff73a69d8c847d03a Mon Sep 17 00:00:00 2001 From: Shane McCulley Date: Thu, 16 Apr 2020 12:31:59 -0500 Subject: [PATCH 0094/1548] Try wine --- tests/test_libraries.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/test_libraries.sh b/tests/test_libraries.sh index f4fac9b690..877edd8051 100755 --- a/tests/test_libraries.sh +++ b/tests/test_libraries.sh @@ -7,12 +7,14 @@ echo "Testing libs" # # Currently, tests mmls on image files. Will need to be refactored as we add more tests. +ls "$bindir" EXIT_FAILURE=1 -MMLS_CMD=$(realpath ../tools/vstools/mmls) +MMLS_CMD=$bindir/mmls TESTS=("imageformat_mmls_1.vhd" "imageformat_mmls_1.vmdk" "imageformat_mmls_1.E01") -if [ -n "$WINEARCH" ]; then +if [ -n "$WINEARCH" ]; then MMLS_CMD+='.exe' + wine "$MMLS_CMD -i list" fi # exits with FAILURE status if the command failed From dc7020a8f7828fa7d79289cbdfb3b94cfe592c10 Mon Sep 17 00:00:00 2001 From: Shane McCulley Date: Thu, 16 Apr 2020 13:00:15 -0500 Subject: [PATCH 0095/1548] Use vstools/mmls --- tests/test_libraries.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/test_libraries.sh b/tests/test_libraries.sh index 877edd8051..032213957d 100755 --- a/tests/test_libraries.sh +++ b/tests/test_libraries.sh @@ -7,9 +7,8 @@ echo "Testing libs" # # Currently, tests mmls on image files. Will need to be refactored as we add more tests. -ls "$bindir" EXIT_FAILURE=1 -MMLS_CMD=$bindir/mmls +MMLS_CMD=$(realpath ../tools/vstools/mmls) TESTS=("imageformat_mmls_1.vhd" "imageformat_mmls_1.vmdk" "imageformat_mmls_1.E01") if [ -n "$WINEARCH" ]; then From 9319d95a9bd22bf2cd0a600976bd0b229f1a6cf8 Mon Sep 17 00:00:00 2001 From: Shane McCulley Date: Thu, 16 Apr 2020 14:29:18 -0500 Subject: [PATCH 0096/1548] Skip lib test on windows shared --- tests/test_libraries.sh | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tests/test_libraries.sh b/tests/test_libraries.sh index 032213957d..f5cb41fa2c 100755 --- a/tests/test_libraries.sh +++ b/tests/test_libraries.sh @@ -8,12 +8,19 @@ echo "Testing libs" # Currently, tests mmls on image files. Will need to be refactored as we add more tests. EXIT_FAILURE=1 +EXIT_SKIP=77 + MMLS_CMD=$(realpath ../tools/vstools/mmls) TESTS=("imageformat_mmls_1.vhd" "imageformat_mmls_1.vmdk" "imageformat_mmls_1.E01") if [ -n "$WINEARCH" ]; then + linkage=${STAGE_NAME#*/*/} + if [ $linkage = 'shared' ]; then + echo "Skipping test on windows $linkage" + exit $EXIT_SKIP + fi + MMLS_CMD+='.exe' - wine "$MMLS_CMD -i list" fi # exits with FAILURE status if the command failed From 10c2d38d9e202b5938cc706f83f135bb680d6b66 Mon Sep 17 00:00:00 2001 From: Shane McCulley Date: Fri, 17 Apr 2020 10:22:43 -0500 Subject: [PATCH 0097/1548] Add comment about why we're skipping the test on shared builds --- tests/test_libraries.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/test_libraries.sh b/tests/test_libraries.sh index f5cb41fa2c..b663192a6c 100755 --- a/tests/test_libraries.sh +++ b/tests/test_libraries.sh @@ -15,7 +15,10 @@ TESTS=("imageformat_mmls_1.vhd" "imageformat_mmls_1.vmdk" "imageformat_mmls_1.E0 if [ -n "$WINEARCH" ]; then linkage=${STAGE_NAME#*/*/} - if [ $linkage = 'shared' ]; then + if [ "$linkage" = 'shared' ]; then + # Required dlls for running this are missing on windows shared + # Since windows static tests work now where they were silently failing before, + # making this work is not worth the effort. echo "Skipping test on windows $linkage" exit $EXIT_SKIP fi From 521fe7cdb1efc48984a37286e2084ac36b3ffabc Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Fri, 14 Jan 2022 19:31:06 +0000 Subject: [PATCH 0098/1548] libewf, libvmdk, libvhdi really want backslashes now on Windows. Sigh. --- tests/test_libraries.sh | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tests/test_libraries.sh b/tests/test_libraries.sh index b663192a6c..81b3f1fd4d 100755 --- a/tests/test_libraries.sh +++ b/tests/test_libraries.sh @@ -13,6 +13,8 @@ EXIT_SKIP=77 MMLS_CMD=$(realpath ../tools/vstools/mmls) TESTS=("imageformat_mmls_1.vhd" "imageformat_mmls_1.vmdk" "imageformat_mmls_1.E01") +IMGBASE="data/imageformat_mmls_1" + if [ -n "$WINEARCH" ]; then linkage=${STAGE_NAME#*/*/} if [ "$linkage" = 'shared' ]; then @@ -24,6 +26,7 @@ if [ -n "$WINEARCH" ]; then fi MMLS_CMD+='.exe' + IMGBASE=$(echo "$IMGBASE" | tr '/' '\\') fi # exits with FAILURE status if the command failed @@ -56,21 +59,21 @@ done # Verify mmls does not return an error with various formats. if [[ "${imgFormatList}" =~ "vmdk" ]]; then - $MMLS_CMD ./data/imageformat_mmls_1.vmdk >/dev/null + $MMLS_CMD ${IMGBASE}.vmdk >/dev/null _check_exit_status $? "vmdk" else echo "Tools not compiled with libvmdk" fi if [[ "${imgFormatList}" =~ "vhd" ]]; then - $MMLS_CMD ./data/imageformat_mmls_1.vhd >/dev/null + $MMLS_CMD ${IMGBASE}.vhd >/dev/null _check_exit_status $? "vhd" else echo "Tools not compiled with libvhdi" fi if [[ "${imgFormatList}" =~ "ewf" ]]; then - $MMLS_CMD ./data/imageformat_mmls_1.E01 >/dev/null + $MMLS_CMD ${IMGBASE}.E01 >/dev/null _check_exit_status $? "ewf" else echo "Tools not compiled with libewf" From 9cc808866592a3a658cb1d6f63c9403e622ca8e2 Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Tue, 20 Aug 2024 17:00:38 +0100 Subject: [PATCH 0099/1548] Set test runner to wine for mingw builds. --- tests/Makefile.am | 3 +++ tests/test_libraries.sh | 11 +---------- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/tests/Makefile.am b/tests/Makefile.am index b0590939fe..2fb03db660 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -9,6 +9,9 @@ check_SCRIPTS = runtests.sh test_libraries.sh TESTS = runtests.sh test_libraries.sh +TEST_EXTENSIONS = .sh +SH_LOG_COMPILER = + check_PROGRAMS = read_apis fs_fname_apis fs_attrlist_apis fs_thread_test read_apis_SOURCES = read_apis.cpp diff --git a/tests/test_libraries.sh b/tests/test_libraries.sh index 81b3f1fd4d..ce83ccad94 100755 --- a/tests/test_libraries.sh +++ b/tests/test_libraries.sh @@ -16,16 +16,7 @@ TESTS=("imageformat_mmls_1.vhd" "imageformat_mmls_1.vmdk" "imageformat_mmls_1.E0 IMGBASE="data/imageformat_mmls_1" if [ -n "$WINEARCH" ]; then - linkage=${STAGE_NAME#*/*/} - if [ "$linkage" = 'shared' ]; then - # Required dlls for running this are missing on windows shared - # Since windows static tests work now where they were silently failing before, - # making this work is not worth the effort. - echo "Skipping test on windows $linkage" - exit $EXIT_SKIP - fi - - MMLS_CMD+='.exe' + MMLS_CMD="wine ${MMLS_CMD}.exe" IMGBASE=$(echo "$IMGBASE" | tr '/' '\\') fi From 206e0f691401277496106383d2514081b4d833a5 Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Wed, 4 Sep 2024 18:20:41 +0100 Subject: [PATCH 0100/1548] Added image dump acceptance tests for dd, iso, E01, VHD, VMDK. --- .gitignore | 12 +- configure.ac | 9 + tests/Makefile.am | 7 +- tests/data/dump/image.E01.json | 29 ++ tests/data/dump/image.dd.json | 29 ++ tests/data/dump/image.iso.json | 25 ++ tests/data/dump/image.vhd.json | 29 ++ tests/data/dump/image.vmdk.json | 29 ++ tests/data/img/image.E01 | Bin 0 -> 105838 bytes tests/data/img/image.dd | Bin 0 -> 102400 bytes tests/data/img/image.iso | Bin 0 -> 366592 bytes tests/data/img/image.vhd | Bin 0 -> 2100224 bytes tests/data/img/image.vmdk | Bin 0 -> 131072 bytes tests/img_dump.cpp | 456 ++++++++++++++++++++++++++++++++ tests/imgs_to_dump.in | 3 + tests/test_imgs.sh | 9 + 16 files changed, 625 insertions(+), 12 deletions(-) create mode 100644 tests/data/dump/image.E01.json create mode 100644 tests/data/dump/image.dd.json create mode 100644 tests/data/dump/image.iso.json create mode 100644 tests/data/dump/image.vhd.json create mode 100644 tests/data/dump/image.vmdk.json create mode 100644 tests/data/img/image.E01 create mode 100644 tests/data/img/image.dd create mode 100644 tests/data/img/image.iso create mode 100644 tests/data/img/image.vhd create mode 100644 tests/data/img/image.vmdk create mode 100644 tests/img_dump.cpp create mode 100644 tests/imgs_to_dump.in create mode 100755 tests/test_imgs.sh diff --git a/.gitignore b/.gitignore index 9c1e10e935..96acbf0e99 100755 --- a/.gitignore +++ b/.gitignore @@ -150,6 +150,9 @@ tests/*.trs tests/fs_attrlist_apis tests/fs_fname_apis tests/fs_thread_test +tests/img_dump +tests/imgs_to_dump +!tests/imgs_to_dump.in tests/read_apis tools/autotools/tsk_comparedir tools/autotools/tsk_gettimes @@ -195,13 +198,4 @@ unit_tests/base/test_base # Mac Junk .DS_Store -# Test images -*.img -*.vhd -*.E01 -*.vmdk - sleuthkit-*.tar.gz - -# Whitelist test data folder -!tests/data/* diff --git a/configure.ac b/configure.ac index 8682447ecf..98a410433e 100644 --- a/configure.ac +++ b/configure.ac @@ -299,6 +299,14 @@ WARNINGS='-Wall -Wextra -Wno-unused-parameter' AC_SUBST(AM_CFLAGS, $WARNINGS) AC_SUBST(AM_CXXFLAGS, $WARNINGS) +check_imgs= +AS_IF([test "x$ax_afflib" != "xno"], [check_imgs="$check_imgs"]) +AS_IF([test "x$ax_libewf" != "xno"], [check_imgs="$check_imgs image.E01"]) +AS_IF([test "x$ax_libvhdi" != "xno"], [check_imgs="$check_imgs image.vhd"]) +AS_IF([test "x$ax_libvmdk" != "xno"], [check_imgs="$check_imgs image.vmdk"]) + +AC_SUBST(CHECK_IMGS, $check_imgs) + AC_CONFIG_FILES([ Makefile tsk/Makefile @@ -325,6 +333,7 @@ AC_CONFIG_FILES([ tools/fiwalk/src/Makefile tools/fiwalk/plugins/Makefile tests/Makefile + tests/imgs_to_dump samples/Makefile man/Makefile bindings/java/Makefile diff --git a/tests/Makefile.am b/tests/Makefile.am index 2fb03db660..7a4741b2fe 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -5,15 +5,16 @@ LDADD = ../tsk/libtsk.la LDFLAGS += -static $(PTHREAD_LIBS) EXTRA_DIST = .indent.pro runtests.sh test_libraries.sh -check_SCRIPTS = runtests.sh test_libraries.sh +check_SCRIPTS = runtests.sh test_libraries.sh test_imgs.sh -TESTS = runtests.sh test_libraries.sh +TESTS = runtests.sh test_libraries.sh test_imgs.sh TEST_EXTENSIONS = .sh SH_LOG_COMPILER = -check_PROGRAMS = read_apis fs_fname_apis fs_attrlist_apis fs_thread_test +check_PROGRAMS = img_dump fs_fname_apis fs_attrlist_apis fs_thread_test read_apis +img_dump_SOURCES = img_dump.cpp read_apis_SOURCES = read_apis.cpp fs_fname_apis_SOURCES = fs_fname_apis.cpp fs_attrlist_apis_SOURCES = fs_attrlist_apis.cpp diff --git a/tests/data/dump/image.E01.json b/tests/data/dump/image.E01.json new file mode 100644 index 0000000000..1e710090fc --- /dev/null +++ b/tests/data/dump/image.E01.json @@ -0,0 +1,29 @@ +{"files": ["data/img/image.E01"], "itype": "ewf", "desc": "Expert Witness Format (EnCase)", "size": 102400, "sector_size": 512, "filesystem": {"block_count": 100, "block_size": 1024, "dev_bsize": 512, "duname": "Fragment", "endian": 1, "first_block": 0, "first_inum": 1, "flags": 0, "fs_id": "f1f8dab857ef49db9cf5b409570736ed", "ftype": "ext2", "journ_inum": 0, "inum_count": 17, "last_block": 99, "last_block_act": 99, "last_inum": 17, "offset": 0, "root_inum": 2, "files": [ +{"name": {"flags": 1, "meta_addr": 2, "meta_seq": 0, "name": ".", "par_addr": 2, "par_seq": 0, "shrt_name": "", "type": 3}, "meta": {"addr": 2, "atime": 1458572581, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1393145686, "ctime_nano": 0, "flags": 5, "gid": 5000, "dtime": 0, "dtime_nano": 0, "mode": 493, "mtime": 1393145686, "mtime_nano": 0, "nlink": 4, "seq": 0, "size": 1024, "type": 2, "uid": 151107, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 1024, "rd_buf_size": 0, "nrd_allocsize": 1024, "nrd_compsize": 0, "nrd_initsize": 1024, "nrd_skiplen": 0, "nrd_runs": [{"addr": 7, "flags": 0, "len": 1, "offset": 0}, {"addr": 0, "flags": 2, "len": 11, "offset": 1}]} +]}}, +{"name": {"flags": 1, "meta_addr": 2, "meta_seq": 0, "name": "..", "par_addr": 2, "par_seq": 0, "shrt_name": "", "type": 3}, "meta": {"addr": 2, "atime": 1458572581, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1393145686, "ctime_nano": 0, "flags": 5, "gid": 5000, "dtime": 0, "dtime_nano": 0, "mode": 493, "mtime": 1393145686, "mtime_nano": 0, "nlink": 4, "seq": 0, "size": 1024, "type": 2, "uid": 151107, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 1024, "rd_buf_size": 0, "nrd_allocsize": 1024, "nrd_compsize": 0, "nrd_initsize": 1024, "nrd_skiplen": 0, "nrd_runs": [{"addr": 7, "flags": 0, "len": 1, "offset": 0}, {"addr": 0, "flags": 2, "len": 11, "offset": 1}]} +]}}, +{"name": {"flags": 1, "meta_addr": 11, "meta_seq": 0, "name": "lost+found", "par_addr": 2, "par_seq": 0, "shrt_name": "", "type": 3}, "meta": {"addr": 11, "atime": 1337961350, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1337961350, "ctime_nano": 0, "flags": 5, "gid": 0, "dtime": 0, "dtime_nano": 0, "mode": 448, "mtime": 1337961350, "mtime_nano": 0, "nlink": 2, "seq": 0, "size": 12288, "type": 2, "uid": 0, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 12288, "rd_buf_size": 0, "nrd_allocsize": 12288, "nrd_compsize": 0, "nrd_initsize": 12288, "nrd_skiplen": 0, "nrd_runs": [{"addr": 8, "flags": 0, "len": 12, "offset": 0}]} +]}}, +{"name": {"flags": 1, "meta_addr": 11, "meta_seq": 0, "name": ".", "par_addr": 11, "par_seq": 0, "shrt_name": "", "type": 3}, "meta": {"addr": 11, "atime": 1337961350, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1337961350, "ctime_nano": 0, "flags": 5, "gid": 0, "dtime": 0, "dtime_nano": 0, "mode": 448, "mtime": 1337961350, "mtime_nano": 0, "nlink": 2, "seq": 0, "size": 12288, "type": 2, "uid": 0, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 12288, "rd_buf_size": 0, "nrd_allocsize": 12288, "nrd_compsize": 0, "nrd_initsize": 12288, "nrd_skiplen": 0, "nrd_runs": [{"addr": 8, "flags": 0, "len": 12, "offset": 0}]} +]}}, +{"name": {"flags": 1, "meta_addr": 2, "meta_seq": 0, "name": "..", "par_addr": 11, "par_seq": 0, "shrt_name": "", "type": 3}, "meta": {"addr": 2, "atime": 1458572581, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1393145686, "ctime_nano": 0, "flags": 5, "gid": 5000, "dtime": 0, "dtime_nano": 0, "mode": 493, "mtime": 1393145686, "mtime_nano": 0, "nlink": 4, "seq": 0, "size": 1024, "type": 2, "uid": 151107, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 1024, "rd_buf_size": 0, "nrd_allocsize": 1024, "nrd_compsize": 0, "nrd_initsize": 1024, "nrd_skiplen": 0, "nrd_runs": [{"addr": 7, "flags": 0, "len": 1, "offset": 0}, {"addr": 0, "flags": 2, "len": 11, "offset": 1}]} +]}}, +{"name": {"flags": 1, "meta_addr": 12, "meta_seq": 0, "name": "a_directory", "par_addr": 2, "par_seq": 0, "shrt_name": "", "type": 3}, "meta": {"addr": 12, "atime": 1458572599, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1337961563, "ctime_nano": 0, "flags": 5, "gid": 5000, "dtime": 0, "dtime_nano": 0, "mode": 493, "mtime": 1337961563, "mtime_nano": 0, "nlink": 2, "seq": 0, "size": 1024, "type": 2, "uid": 151107, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 1024, "rd_buf_size": 0, "nrd_allocsize": 1024, "nrd_compsize": 0, "nrd_initsize": 1024, "nrd_skiplen": 0, "nrd_runs": [{"addr": 21, "flags": 0, "len": 1, "offset": 0}, {"addr": 0, "flags": 2, "len": 11, "offset": 1}]} +]}}, +{"name": {"flags": 1, "meta_addr": 12, "meta_seq": 0, "name": ".", "par_addr": 12, "par_seq": 0, "shrt_name": "", "type": 3}, "meta": {"addr": 12, "atime": 1458572599, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1337961563, "ctime_nano": 0, "flags": 5, "gid": 5000, "dtime": 0, "dtime_nano": 0, "mode": 493, "mtime": 1337961563, "mtime_nano": 0, "nlink": 2, "seq": 0, "size": 1024, "type": 2, "uid": 151107, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 1024, "rd_buf_size": 0, "nrd_allocsize": 1024, "nrd_compsize": 0, "nrd_initsize": 1024, "nrd_skiplen": 0, "nrd_runs": [{"addr": 21, "flags": 0, "len": 1, "offset": 0}, {"addr": 0, "flags": 2, "len": 11, "offset": 1}]} +]}}, +{"name": {"flags": 1, "meta_addr": 2, "meta_seq": 0, "name": "..", "par_addr": 12, "par_seq": 0, "shrt_name": "", "type": 3}, "meta": {"addr": 2, "atime": 1458572581, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1393145686, "ctime_nano": 0, "flags": 5, "gid": 5000, "dtime": 0, "dtime_nano": 0, "mode": 493, "mtime": 1393145686, "mtime_nano": 0, "nlink": 4, "seq": 0, "size": 1024, "type": 2, "uid": 151107, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 1024, "rd_buf_size": 0, "nrd_allocsize": 1024, "nrd_compsize": 0, "nrd_initsize": 1024, "nrd_skiplen": 0, "nrd_runs": [{"addr": 7, "flags": 0, "len": 1, "offset": 0}, {"addr": 0, "flags": 2, "len": 11, "offset": 1}]} +]}}, +{"name": {"flags": 1, "meta_addr": 16, "meta_seq": 0, "name": "another_file", "par_addr": 12, "par_seq": 0, "shrt_name": "", "type": 5}, "meta": {"addr": 16, "atime": 1337961563, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1337961563, "ctime_nano": 0, "flags": 5, "gid": 5000, "dtime": 0, "dtime_nano": 0, "mode": 384, "mtime": 1337961563, "mtime_nano": 0, "nlink": 1, "seq": 0, "size": 22, "type": 1, "uid": 151107, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 22, "rd_buf_size": 0, "nrd_allocsize": 1024, "nrd_compsize": 0, "nrd_initsize": 22, "nrd_skiplen": 0, "nrd_runs": [{"addr": 31, "flags": 0, "len": 1, "offset": 0}, {"addr": 0, "flags": 2, "len": 11, "offset": 1}]} +]}}, +{"name": {"flags": 1, "meta_addr": 14, "meta_seq": 0, "name": "a_file", "par_addr": 12, "par_seq": 0, "shrt_name": "", "type": 5}, "meta": {"addr": 14, "atime": 1458572661, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1337961554, "ctime_nano": 0, "flags": 5, "gid": 5000, "dtime": 0, "dtime_nano": 0, "mode": 384, "mtime": 1337961554, "mtime_nano": 0, "nlink": 1, "seq": 0, "size": 53, "type": 1, "uid": 151107, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 53, "rd_buf_size": 0, "nrd_allocsize": 1024, "nrd_compsize": 0, "nrd_initsize": 53, "nrd_skiplen": 0, "nrd_runs": [{"addr": 30, "flags": 0, "len": 1, "offset": 0}, {"addr": 0, "flags": 2, "len": 11, "offset": 1}]} +]}}, +{"name": {"flags": 2, "meta_addr": 0, "meta_seq": 0, "name": ".another_file.swp", "par_addr": 12, "par_seq": 0, "shrt_name": "", "type": 5}}, +{"name": {"flags": 2, "meta_addr": 0, "meta_seq": 0, "name": "another_file~", "par_addr": 12, "par_seq": 0, "shrt_name": "", "type": 5}}, +{"name": {"flags": 1, "meta_addr": 15, "meta_seq": 0, "name": "passwords.txt", "par_addr": 2, "par_seq": 0, "shrt_name": "", "type": 5}, "meta": {"addr": 15, "atime": 1337961653, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1337961663, "ctime_nano": 0, "flags": 5, "gid": 5000, "dtime": 0, "dtime_nano": 0, "mode": 256, "mtime": 1337961653, "mtime_nano": 0, "nlink": 1, "seq": 0, "size": 116, "type": 1, "uid": 151107, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 116, "rd_buf_size": 0, "nrd_allocsize": 1024, "nrd_compsize": 0, "nrd_initsize": 116, "nrd_skiplen": 0, "nrd_runs": [{"addr": 22, "flags": 0, "len": 1, "offset": 0}, {"addr": 0, "flags": 2, "len": 11, "offset": 1}]} +]}}, +{"name": {"flags": 1, "meta_addr": 13, "meta_seq": 0, "name": "a_link", "par_addr": 2, "par_seq": 0, "shrt_name": "", "type": 6}, "meta": {"addr": 13, "atime": 1458572581, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1393145686, "ctime_nano": 0, "flags": 5, "gid": 0, "dtime": 0, "dtime_nano": 0, "mode": 511, "mtime": 1393145686, "mtime_nano": 0, "nlink": 1, "seq": 0, "size": 24, "type": 6, "uid": 0, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 24, "rd_buf_size": 0, "nrd_allocsize": 1024, "nrd_compsize": 0, "nrd_initsize": 24, "nrd_skiplen": 0, "nrd_runs": [{"addr": 0, "flags": 2, "len": 12, "offset": 0}]} +]}}, +{"name": {"flags": 1, "meta_addr": 17, "meta_seq": 0, "name": "$OrphanFiles", "par_addr": 2, "par_seq": 0, "shrt_name": "", "type": 11}, "meta": {"addr": 17, "atime": 0, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 0, "ctime_nano": 0, "flags": 5, "gid": 0, "dtime": 0, "dtime_nano": 0, "mode": 0, "mtime": 0, "mtime_nano": 0, "nlink": 1, "seq": 0, "size": 0, "type": 11, "uid": 0, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 0, "rd_buf_size": 0, "nrd_allocsize": 0, "nrd_compsize": 0, "nrd_initsize": 0, "nrd_skiplen": 0, "nrd_runs": [{"addr": 0, "flags": 2, "len": 12, "offset": 0}]} +]}}]}} \ No newline at end of file diff --git a/tests/data/dump/image.dd.json b/tests/data/dump/image.dd.json new file mode 100644 index 0000000000..62dde2a317 --- /dev/null +++ b/tests/data/dump/image.dd.json @@ -0,0 +1,29 @@ +{"files": ["data/img/image.dd"], "itype": "raw", "desc": "Single or split raw file (dd)", "size": 102400, "sector_size": 512, "filesystem": {"block_count": 100, "block_size": 1024, "dev_bsize": 512, "duname": "Fragment", "endian": 1, "first_block": 0, "first_inum": 1, "flags": 0, "fs_id": "f1f8dab857ef49db9cf5b409570736ed", "ftype": "ext2", "journ_inum": 0, "inum_count": 17, "last_block": 99, "last_block_act": 99, "last_inum": 17, "offset": 0, "root_inum": 2, "files": [ +{"name": {"flags": 1, "meta_addr": 2, "meta_seq": 0, "name": ".", "par_addr": 2, "par_seq": 0, "shrt_name": "", "type": 3}, "meta": {"addr": 2, "atime": 1458572581, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1393145686, "ctime_nano": 0, "flags": 5, "gid": 5000, "dtime": 0, "dtime_nano": 0, "mode": 493, "mtime": 1393145686, "mtime_nano": 0, "nlink": 4, "seq": 0, "size": 1024, "type": 2, "uid": 151107, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 1024, "rd_buf_size": 0, "nrd_allocsize": 1024, "nrd_compsize": 0, "nrd_initsize": 1024, "nrd_skiplen": 0, "nrd_runs": [{"addr": 7, "flags": 0, "len": 1, "offset": 0}, {"addr": 0, "flags": 2, "len": 11, "offset": 1}]} +]}}, +{"name": {"flags": 1, "meta_addr": 2, "meta_seq": 0, "name": "..", "par_addr": 2, "par_seq": 0, "shrt_name": "", "type": 3}, "meta": {"addr": 2, "atime": 1458572581, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1393145686, "ctime_nano": 0, "flags": 5, "gid": 5000, "dtime": 0, "dtime_nano": 0, "mode": 493, "mtime": 1393145686, "mtime_nano": 0, "nlink": 4, "seq": 0, "size": 1024, "type": 2, "uid": 151107, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 1024, "rd_buf_size": 0, "nrd_allocsize": 1024, "nrd_compsize": 0, "nrd_initsize": 1024, "nrd_skiplen": 0, "nrd_runs": [{"addr": 7, "flags": 0, "len": 1, "offset": 0}, {"addr": 0, "flags": 2, "len": 11, "offset": 1}]} +]}}, +{"name": {"flags": 1, "meta_addr": 11, "meta_seq": 0, "name": "lost+found", "par_addr": 2, "par_seq": 0, "shrt_name": "", "type": 3}, "meta": {"addr": 11, "atime": 1337961350, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1337961350, "ctime_nano": 0, "flags": 5, "gid": 0, "dtime": 0, "dtime_nano": 0, "mode": 448, "mtime": 1337961350, "mtime_nano": 0, "nlink": 2, "seq": 0, "size": 12288, "type": 2, "uid": 0, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 12288, "rd_buf_size": 0, "nrd_allocsize": 12288, "nrd_compsize": 0, "nrd_initsize": 12288, "nrd_skiplen": 0, "nrd_runs": [{"addr": 8, "flags": 0, "len": 12, "offset": 0}]} +]}}, +{"name": {"flags": 1, "meta_addr": 11, "meta_seq": 0, "name": ".", "par_addr": 11, "par_seq": 0, "shrt_name": "", "type": 3}, "meta": {"addr": 11, "atime": 1337961350, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1337961350, "ctime_nano": 0, "flags": 5, "gid": 0, "dtime": 0, "dtime_nano": 0, "mode": 448, "mtime": 1337961350, "mtime_nano": 0, "nlink": 2, "seq": 0, "size": 12288, "type": 2, "uid": 0, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 12288, "rd_buf_size": 0, "nrd_allocsize": 12288, "nrd_compsize": 0, "nrd_initsize": 12288, "nrd_skiplen": 0, "nrd_runs": [{"addr": 8, "flags": 0, "len": 12, "offset": 0}]} +]}}, +{"name": {"flags": 1, "meta_addr": 2, "meta_seq": 0, "name": "..", "par_addr": 11, "par_seq": 0, "shrt_name": "", "type": 3}, "meta": {"addr": 2, "atime": 1458572581, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1393145686, "ctime_nano": 0, "flags": 5, "gid": 5000, "dtime": 0, "dtime_nano": 0, "mode": 493, "mtime": 1393145686, "mtime_nano": 0, "nlink": 4, "seq": 0, "size": 1024, "type": 2, "uid": 151107, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 1024, "rd_buf_size": 0, "nrd_allocsize": 1024, "nrd_compsize": 0, "nrd_initsize": 1024, "nrd_skiplen": 0, "nrd_runs": [{"addr": 7, "flags": 0, "len": 1, "offset": 0}, {"addr": 0, "flags": 2, "len": 11, "offset": 1}]} +]}}, +{"name": {"flags": 1, "meta_addr": 12, "meta_seq": 0, "name": "a_directory", "par_addr": 2, "par_seq": 0, "shrt_name": "", "type": 3}, "meta": {"addr": 12, "atime": 1458572599, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1337961563, "ctime_nano": 0, "flags": 5, "gid": 5000, "dtime": 0, "dtime_nano": 0, "mode": 493, "mtime": 1337961563, "mtime_nano": 0, "nlink": 2, "seq": 0, "size": 1024, "type": 2, "uid": 151107, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 1024, "rd_buf_size": 0, "nrd_allocsize": 1024, "nrd_compsize": 0, "nrd_initsize": 1024, "nrd_skiplen": 0, "nrd_runs": [{"addr": 21, "flags": 0, "len": 1, "offset": 0}, {"addr": 0, "flags": 2, "len": 11, "offset": 1}]} +]}}, +{"name": {"flags": 1, "meta_addr": 12, "meta_seq": 0, "name": ".", "par_addr": 12, "par_seq": 0, "shrt_name": "", "type": 3}, "meta": {"addr": 12, "atime": 1458572599, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1337961563, "ctime_nano": 0, "flags": 5, "gid": 5000, "dtime": 0, "dtime_nano": 0, "mode": 493, "mtime": 1337961563, "mtime_nano": 0, "nlink": 2, "seq": 0, "size": 1024, "type": 2, "uid": 151107, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 1024, "rd_buf_size": 0, "nrd_allocsize": 1024, "nrd_compsize": 0, "nrd_initsize": 1024, "nrd_skiplen": 0, "nrd_runs": [{"addr": 21, "flags": 0, "len": 1, "offset": 0}, {"addr": 0, "flags": 2, "len": 11, "offset": 1}]} +]}}, +{"name": {"flags": 1, "meta_addr": 2, "meta_seq": 0, "name": "..", "par_addr": 12, "par_seq": 0, "shrt_name": "", "type": 3}, "meta": {"addr": 2, "atime": 1458572581, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1393145686, "ctime_nano": 0, "flags": 5, "gid": 5000, "dtime": 0, "dtime_nano": 0, "mode": 493, "mtime": 1393145686, "mtime_nano": 0, "nlink": 4, "seq": 0, "size": 1024, "type": 2, "uid": 151107, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 1024, "rd_buf_size": 0, "nrd_allocsize": 1024, "nrd_compsize": 0, "nrd_initsize": 1024, "nrd_skiplen": 0, "nrd_runs": [{"addr": 7, "flags": 0, "len": 1, "offset": 0}, {"addr": 0, "flags": 2, "len": 11, "offset": 1}]} +]}}, +{"name": {"flags": 1, "meta_addr": 16, "meta_seq": 0, "name": "another_file", "par_addr": 12, "par_seq": 0, "shrt_name": "", "type": 5}, "meta": {"addr": 16, "atime": 1337961563, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1337961563, "ctime_nano": 0, "flags": 5, "gid": 5000, "dtime": 0, "dtime_nano": 0, "mode": 384, "mtime": 1337961563, "mtime_nano": 0, "nlink": 1, "seq": 0, "size": 22, "type": 1, "uid": 151107, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 22, "rd_buf_size": 0, "nrd_allocsize": 1024, "nrd_compsize": 0, "nrd_initsize": 22, "nrd_skiplen": 0, "nrd_runs": [{"addr": 31, "flags": 0, "len": 1, "offset": 0}, {"addr": 0, "flags": 2, "len": 11, "offset": 1}]} +]}}, +{"name": {"flags": 1, "meta_addr": 14, "meta_seq": 0, "name": "a_file", "par_addr": 12, "par_seq": 0, "shrt_name": "", "type": 5}, "meta": {"addr": 14, "atime": 1458572661, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1337961554, "ctime_nano": 0, "flags": 5, "gid": 5000, "dtime": 0, "dtime_nano": 0, "mode": 384, "mtime": 1337961554, "mtime_nano": 0, "nlink": 1, "seq": 0, "size": 53, "type": 1, "uid": 151107, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 53, "rd_buf_size": 0, "nrd_allocsize": 1024, "nrd_compsize": 0, "nrd_initsize": 53, "nrd_skiplen": 0, "nrd_runs": [{"addr": 30, "flags": 0, "len": 1, "offset": 0}, {"addr": 0, "flags": 2, "len": 11, "offset": 1}]} +]}}, +{"name": {"flags": 2, "meta_addr": 0, "meta_seq": 0, "name": ".another_file.swp", "par_addr": 12, "par_seq": 0, "shrt_name": "", "type": 5}}, +{"name": {"flags": 2, "meta_addr": 0, "meta_seq": 0, "name": "another_file~", "par_addr": 12, "par_seq": 0, "shrt_name": "", "type": 5}}, +{"name": {"flags": 1, "meta_addr": 15, "meta_seq": 0, "name": "passwords.txt", "par_addr": 2, "par_seq": 0, "shrt_name": "", "type": 5}, "meta": {"addr": 15, "atime": 1337961653, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1337961663, "ctime_nano": 0, "flags": 5, "gid": 5000, "dtime": 0, "dtime_nano": 0, "mode": 256, "mtime": 1337961653, "mtime_nano": 0, "nlink": 1, "seq": 0, "size": 116, "type": 1, "uid": 151107, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 116, "rd_buf_size": 0, "nrd_allocsize": 1024, "nrd_compsize": 0, "nrd_initsize": 116, "nrd_skiplen": 0, "nrd_runs": [{"addr": 22, "flags": 0, "len": 1, "offset": 0}, {"addr": 0, "flags": 2, "len": 11, "offset": 1}]} +]}}, +{"name": {"flags": 1, "meta_addr": 13, "meta_seq": 0, "name": "a_link", "par_addr": 2, "par_seq": 0, "shrt_name": "", "type": 6}, "meta": {"addr": 13, "atime": 1458572581, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1393145686, "ctime_nano": 0, "flags": 5, "gid": 0, "dtime": 0, "dtime_nano": 0, "mode": 511, "mtime": 1393145686, "mtime_nano": 0, "nlink": 1, "seq": 0, "size": 24, "type": 6, "uid": 0, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 24, "rd_buf_size": 0, "nrd_allocsize": 1024, "nrd_compsize": 0, "nrd_initsize": 24, "nrd_skiplen": 0, "nrd_runs": [{"addr": 0, "flags": 2, "len": 12, "offset": 0}]} +]}}, +{"name": {"flags": 1, "meta_addr": 17, "meta_seq": 0, "name": "$OrphanFiles", "par_addr": 2, "par_seq": 0, "shrt_name": "", "type": 11}, "meta": {"addr": 17, "atime": 0, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 0, "ctime_nano": 0, "flags": 5, "gid": 0, "dtime": 0, "dtime_nano": 0, "mode": 0, "mtime": 0, "mtime_nano": 0, "nlink": 1, "seq": 0, "size": 0, "type": 11, "uid": 0, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 0, "rd_buf_size": 0, "nrd_allocsize": 0, "nrd_compsize": 0, "nrd_initsize": 0, "nrd_skiplen": 0, "nrd_runs": [{"addr": 0, "flags": 2, "len": 12, "offset": 0}]} +]}}]}} \ No newline at end of file diff --git a/tests/data/dump/image.iso.json b/tests/data/dump/image.iso.json new file mode 100644 index 0000000000..ecf198ab39 --- /dev/null +++ b/tests/data/dump/image.iso.json @@ -0,0 +1,25 @@ +{"files": ["data/img/image.iso"], "itype": "raw", "desc": "Single or split raw file (dd)", "size": 366592, "sector_size": 512, "filesystem": {"block_count": 179, "block_size": 2048, "dev_bsize": 512, "duname": "Block", "endian": 2, "first_block": 0, "first_inum": 0, "flags": 0, "fs_id": "4344524f4d202020202020202020202020202020202020202020202020202020", "ftype": "iso9660", "journ_inum": 0, "inum_count": 7, "last_block": 178, "last_block_act": 178, "last_inum": 6, "offset": 0, "root_inum": 0, "files": [ +{"name": {"flags": 1, "meta_addr": 0, "meta_seq": 0, "name": ".", "par_addr": 0, "par_seq": 0, "shrt_name": "", "type": 3}, "meta": {"addr": 0, "atime": 0, "atime_nano": 0, "crtime": 1393163686, "crtime_nano": 0, "ctime": 0, "ctime_nano": 0, "flags": 5, "gid": 0, "mode": 0, "mtime": 0, "mtime_nano": 0, "nlink": 1, "seq": 0, "size": 2048, "type": 2, "uid": 0, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 2048, "rd_buf_size": 0, "nrd_allocsize": 2048, "nrd_compsize": 0, "nrd_initsize": 2048, "nrd_skiplen": 0, "nrd_runs": [{"addr": 23, "flags": 0, "len": 1, "offset": 0}]} +]}}, +{"name": {"flags": 1, "meta_addr": 0, "meta_seq": 0, "name": "..", "par_addr": 0, "par_seq": 0, "shrt_name": "", "type": 3}, "meta": {"addr": 0, "atime": 0, "atime_nano": 0, "crtime": 1393163686, "crtime_nano": 0, "ctime": 0, "ctime_nano": 0, "flags": 5, "gid": 0, "mode": 0, "mtime": 0, "mtime_nano": 0, "nlink": 1, "seq": 0, "size": 2048, "type": 2, "uid": 0, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 2048, "rd_buf_size": 0, "nrd_allocsize": 2048, "nrd_compsize": 0, "nrd_initsize": 2048, "nrd_skiplen": 0, "nrd_runs": [{"addr": 23, "flags": 0, "len": 1, "offset": 0}]} +]}}, +{"name": {"flags": 1, "meta_addr": 1, "meta_seq": 0, "name": "A_DIRECT", "par_addr": 0, "par_seq": 0, "shrt_name": "", "type": 3}, "meta": {"addr": 1, "atime": 0, "atime_nano": 0, "crtime": 1337983163, "crtime_nano": 0, "ctime": 0, "ctime_nano": 0, "flags": 5, "gid": 0, "mode": 0, "mtime": 0, "mtime_nano": 0, "nlink": 1, "seq": 0, "size": 2048, "type": 2, "uid": 0, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 2048, "rd_buf_size": 0, "nrd_allocsize": 2048, "nrd_compsize": 0, "nrd_initsize": 2048, "nrd_skiplen": 0, "nrd_runs": [{"addr": 25, "flags": 0, "len": 1, "offset": 0}]} +]}}, +{"name": {"flags": 1, "meta_addr": 1, "meta_seq": 0, "name": ".", "par_addr": 1, "par_seq": 0, "shrt_name": "", "type": 3}, "meta": {"addr": 1, "atime": 0, "atime_nano": 0, "crtime": 1337983163, "crtime_nano": 0, "ctime": 0, "ctime_nano": 0, "flags": 5, "gid": 0, "mode": 0, "mtime": 0, "mtime_nano": 0, "nlink": 1, "seq": 0, "size": 2048, "type": 2, "uid": 0, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 2048, "rd_buf_size": 0, "nrd_allocsize": 2048, "nrd_compsize": 0, "nrd_initsize": 2048, "nrd_skiplen": 0, "nrd_runs": [{"addr": 25, "flags": 0, "len": 1, "offset": 0}]} +]}}, +{"name": {"flags": 1, "meta_addr": 0, "meta_seq": 0, "name": "..", "par_addr": 1, "par_seq": 0, "shrt_name": "", "type": 3}, "meta": {"addr": 0, "atime": 0, "atime_nano": 0, "crtime": 1393163686, "crtime_nano": 0, "ctime": 0, "ctime_nano": 0, "flags": 5, "gid": 0, "mode": 0, "mtime": 0, "mtime_nano": 0, "nlink": 1, "seq": 0, "size": 2048, "type": 2, "uid": 0, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 2048, "rd_buf_size": 0, "nrd_allocsize": 2048, "nrd_compsize": 0, "nrd_initsize": 2048, "nrd_skiplen": 0, "nrd_runs": [{"addr": 23, "flags": 0, "len": 1, "offset": 0}]} +]}}, +{"name": {"flags": 1, "meta_addr": 4, "meta_seq": 0, "name": "ANOTHER_", "par_addr": 1, "par_seq": 0, "shrt_name": "", "type": 5}, "meta": {"addr": 4, "atime": 0, "atime_nano": 0, "crtime": 1337983163, "crtime_nano": 0, "ctime": 0, "ctime_nano": 0, "flags": 5, "gid": 0, "mode": 0, "mtime": 0, "mtime_nano": 0, "nlink": 1, "seq": 0, "size": 22, "type": 1, "uid": 0, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 22, "rd_buf_size": 0, "nrd_allocsize": 2048, "nrd_compsize": 0, "nrd_initsize": 22, "nrd_skiplen": 0, "nrd_runs": [{"addr": 27, "flags": 0, "len": 1, "offset": 0}]} +]}}, +{"name": {"flags": 1, "meta_addr": 5, "meta_seq": 0, "name": "A_FILE", "par_addr": 1, "par_seq": 0, "shrt_name": "", "type": 5}, "meta": {"addr": 5, "atime": 0, "atime_nano": 0, "crtime": 1337983154, "crtime_nano": 0, "ctime": 0, "ctime_nano": 0, "flags": 5, "gid": 0, "mode": 0, "mtime": 0, "mtime_nano": 0, "nlink": 1, "seq": 0, "size": 53, "type": 1, "uid": 0, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 53, "rd_buf_size": 0, "nrd_allocsize": 2048, "nrd_compsize": 0, "nrd_initsize": 53, "nrd_skiplen": 0, "nrd_runs": [{"addr": 28, "flags": 0, "len": 1, "offset": 0}]} +]}}, +{"name": {"flags": 1, "meta_addr": 2, "meta_seq": 0, "name": "LOST_FOU", "par_addr": 0, "par_seq": 0, "shrt_name": "", "type": 3}, "meta": {"addr": 2, "atime": 0, "atime_nano": 0, "crtime": 1337982950, "crtime_nano": 0, "ctime": 0, "ctime_nano": 0, "flags": 5, "gid": 0, "mode": 0, "mtime": 0, "mtime_nano": 0, "nlink": 1, "seq": 0, "size": 2048, "type": 2, "uid": 0, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 2048, "rd_buf_size": 0, "nrd_allocsize": 2048, "nrd_compsize": 0, "nrd_initsize": 2048, "nrd_skiplen": 0, "nrd_runs": [{"addr": 24, "flags": 0, "len": 1, "offset": 0}]} +]}}, +{"name": {"flags": 1, "meta_addr": 2, "meta_seq": 0, "name": ".", "par_addr": 2, "par_seq": 0, "shrt_name": "", "type": 3}, "meta": {"addr": 2, "atime": 0, "atime_nano": 0, "crtime": 1337982950, "crtime_nano": 0, "ctime": 0, "ctime_nano": 0, "flags": 5, "gid": 0, "mode": 0, "mtime": 0, "mtime_nano": 0, "nlink": 1, "seq": 0, "size": 2048, "type": 2, "uid": 0, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 2048, "rd_buf_size": 0, "nrd_allocsize": 2048, "nrd_compsize": 0, "nrd_initsize": 2048, "nrd_skiplen": 0, "nrd_runs": [{"addr": 24, "flags": 0, "len": 1, "offset": 0}]} +]}}, +{"name": {"flags": 1, "meta_addr": 0, "meta_seq": 0, "name": "..", "par_addr": 2, "par_seq": 0, "shrt_name": "", "type": 3}, "meta": {"addr": 0, "atime": 0, "atime_nano": 0, "crtime": 1393163686, "crtime_nano": 0, "ctime": 0, "ctime_nano": 0, "flags": 5, "gid": 0, "mode": 0, "mtime": 0, "mtime_nano": 0, "nlink": 1, "seq": 0, "size": 2048, "type": 2, "uid": 0, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 2048, "rd_buf_size": 0, "nrd_allocsize": 2048, "nrd_compsize": 0, "nrd_initsize": 2048, "nrd_skiplen": 0, "nrd_runs": [{"addr": 23, "flags": 0, "len": 1, "offset": 0}]} +]}}, +{"name": {"flags": 1, "meta_addr": 3, "meta_seq": 0, "name": "PASSWORD.TXT", "par_addr": 0, "par_seq": 0, "shrt_name": "", "type": 5}, "meta": {"addr": 3, "atime": 0, "atime_nano": 0, "crtime": 1337983253, "crtime_nano": 0, "ctime": 0, "ctime_nano": 0, "flags": 5, "gid": 0, "mode": 0, "mtime": 0, "mtime_nano": 0, "nlink": 1, "seq": 0, "size": 116, "type": 1, "uid": 0, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 116, "rd_buf_size": 0, "nrd_allocsize": 2048, "nrd_compsize": 0, "nrd_initsize": 116, "nrd_skiplen": 0, "nrd_runs": [{"addr": 26, "flags": 0, "len": 1, "offset": 0}]} +]}}, +{"name": {"flags": 1, "meta_addr": 6, "meta_seq": 0, "name": "$OrphanFiles", "par_addr": 0, "par_seq": 0, "shrt_name": "", "type": 11}, "meta": {"addr": 6, "atime": 0, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 0, "ctime_nano": 0, "flags": 5, "gid": 0, "mode": 0, "mtime": 0, "mtime_nano": 0, "nlink": 1, "seq": 0, "size": 0, "type": 11, "uid": 0, "default_attr": -1, "attrs": [ +]}}]}} \ No newline at end of file diff --git a/tests/data/dump/image.vhd.json b/tests/data/dump/image.vhd.json new file mode 100644 index 0000000000..a3937b5f1a --- /dev/null +++ b/tests/data/dump/image.vhd.json @@ -0,0 +1,29 @@ +{"files": ["data/img/image.vhd"], "itype": "vhd", "desc": "Virtual Hard Drive (Microsoft)", "size": 104448, "sector_size": 512, "filesystem": {"block_count": 100, "block_size": 1024, "dev_bsize": 512, "duname": "Fragment", "endian": 1, "first_block": 0, "first_inum": 1, "flags": 0, "fs_id": "f1f8dab857ef49db9cf5b409570736ed", "ftype": "ext2", "journ_inum": 0, "inum_count": 17, "last_block": 99, "last_block_act": 99, "last_inum": 17, "offset": 0, "root_inum": 2, "files": [ +{"name": {"flags": 1, "meta_addr": 2, "meta_seq": 0, "name": ".", "par_addr": 2, "par_seq": 0, "shrt_name": "", "type": 3}, "meta": {"addr": 2, "atime": 1393145691, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1393145686, "ctime_nano": 0, "flags": 5, "gid": 5000, "dtime": 0, "dtime_nano": 0, "mode": 493, "mtime": 1393145686, "mtime_nano": 0, "nlink": 4, "seq": 0, "size": 1024, "type": 2, "uid": 151107, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 1024, "rd_buf_size": 0, "nrd_allocsize": 1024, "nrd_compsize": 0, "nrd_initsize": 1024, "nrd_skiplen": 0, "nrd_runs": [{"addr": 7, "flags": 0, "len": 1, "offset": 0}, {"addr": 0, "flags": 2, "len": 11, "offset": 1}]} +]}}, +{"name": {"flags": 1, "meta_addr": 2, "meta_seq": 0, "name": "..", "par_addr": 2, "par_seq": 0, "shrt_name": "", "type": 3}, "meta": {"addr": 2, "atime": 1393145691, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1393145686, "ctime_nano": 0, "flags": 5, "gid": 5000, "dtime": 0, "dtime_nano": 0, "mode": 493, "mtime": 1393145686, "mtime_nano": 0, "nlink": 4, "seq": 0, "size": 1024, "type": 2, "uid": 151107, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 1024, "rd_buf_size": 0, "nrd_allocsize": 1024, "nrd_compsize": 0, "nrd_initsize": 1024, "nrd_skiplen": 0, "nrd_runs": [{"addr": 7, "flags": 0, "len": 1, "offset": 0}, {"addr": 0, "flags": 2, "len": 11, "offset": 1}]} +]}}, +{"name": {"flags": 1, "meta_addr": 11, "meta_seq": 0, "name": "lost+found", "par_addr": 2, "par_seq": 0, "shrt_name": "", "type": 3}, "meta": {"addr": 11, "atime": 1337961350, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1337961350, "ctime_nano": 0, "flags": 5, "gid": 0, "dtime": 0, "dtime_nano": 0, "mode": 448, "mtime": 1337961350, "mtime_nano": 0, "nlink": 2, "seq": 0, "size": 12288, "type": 2, "uid": 0, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 12288, "rd_buf_size": 0, "nrd_allocsize": 12288, "nrd_compsize": 0, "nrd_initsize": 12288, "nrd_skiplen": 0, "nrd_runs": [{"addr": 8, "flags": 0, "len": 12, "offset": 0}]} +]}}, +{"name": {"flags": 1, "meta_addr": 11, "meta_seq": 0, "name": ".", "par_addr": 11, "par_seq": 0, "shrt_name": "", "type": 3}, "meta": {"addr": 11, "atime": 1337961350, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1337961350, "ctime_nano": 0, "flags": 5, "gid": 0, "dtime": 0, "dtime_nano": 0, "mode": 448, "mtime": 1337961350, "mtime_nano": 0, "nlink": 2, "seq": 0, "size": 12288, "type": 2, "uid": 0, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 12288, "rd_buf_size": 0, "nrd_allocsize": 12288, "nrd_compsize": 0, "nrd_initsize": 12288, "nrd_skiplen": 0, "nrd_runs": [{"addr": 8, "flags": 0, "len": 12, "offset": 0}]} +]}}, +{"name": {"flags": 1, "meta_addr": 2, "meta_seq": 0, "name": "..", "par_addr": 11, "par_seq": 0, "shrt_name": "", "type": 3}, "meta": {"addr": 2, "atime": 1393145691, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1393145686, "ctime_nano": 0, "flags": 5, "gid": 5000, "dtime": 0, "dtime_nano": 0, "mode": 493, "mtime": 1393145686, "mtime_nano": 0, "nlink": 4, "seq": 0, "size": 1024, "type": 2, "uid": 151107, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 1024, "rd_buf_size": 0, "nrd_allocsize": 1024, "nrd_compsize": 0, "nrd_initsize": 1024, "nrd_skiplen": 0, "nrd_runs": [{"addr": 7, "flags": 0, "len": 1, "offset": 0}, {"addr": 0, "flags": 2, "len": 11, "offset": 1}]} +]}}, +{"name": {"flags": 1, "meta_addr": 12, "meta_seq": 0, "name": "a_directory", "par_addr": 2, "par_seq": 0, "shrt_name": "", "type": 3}, "meta": {"addr": 12, "atime": 1393145675, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1337961563, "ctime_nano": 0, "flags": 5, "gid": 5000, "dtime": 0, "dtime_nano": 0, "mode": 493, "mtime": 1337961563, "mtime_nano": 0, "nlink": 2, "seq": 0, "size": 1024, "type": 2, "uid": 151107, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 1024, "rd_buf_size": 0, "nrd_allocsize": 1024, "nrd_compsize": 0, "nrd_initsize": 1024, "nrd_skiplen": 0, "nrd_runs": [{"addr": 21, "flags": 0, "len": 1, "offset": 0}, {"addr": 0, "flags": 2, "len": 11, "offset": 1}]} +]}}, +{"name": {"flags": 1, "meta_addr": 12, "meta_seq": 0, "name": ".", "par_addr": 12, "par_seq": 0, "shrt_name": "", "type": 3}, "meta": {"addr": 12, "atime": 1393145675, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1337961563, "ctime_nano": 0, "flags": 5, "gid": 5000, "dtime": 0, "dtime_nano": 0, "mode": 493, "mtime": 1337961563, "mtime_nano": 0, "nlink": 2, "seq": 0, "size": 1024, "type": 2, "uid": 151107, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 1024, "rd_buf_size": 0, "nrd_allocsize": 1024, "nrd_compsize": 0, "nrd_initsize": 1024, "nrd_skiplen": 0, "nrd_runs": [{"addr": 21, "flags": 0, "len": 1, "offset": 0}, {"addr": 0, "flags": 2, "len": 11, "offset": 1}]} +]}}, +{"name": {"flags": 1, "meta_addr": 2, "meta_seq": 0, "name": "..", "par_addr": 12, "par_seq": 0, "shrt_name": "", "type": 3}, "meta": {"addr": 2, "atime": 1393145691, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1393145686, "ctime_nano": 0, "flags": 5, "gid": 5000, "dtime": 0, "dtime_nano": 0, "mode": 493, "mtime": 1393145686, "mtime_nano": 0, "nlink": 4, "seq": 0, "size": 1024, "type": 2, "uid": 151107, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 1024, "rd_buf_size": 0, "nrd_allocsize": 1024, "nrd_compsize": 0, "nrd_initsize": 1024, "nrd_skiplen": 0, "nrd_runs": [{"addr": 7, "flags": 0, "len": 1, "offset": 0}, {"addr": 0, "flags": 2, "len": 11, "offset": 1}]} +]}}, +{"name": {"flags": 1, "meta_addr": 16, "meta_seq": 0, "name": "another_file", "par_addr": 12, "par_seq": 0, "shrt_name": "", "type": 5}, "meta": {"addr": 16, "atime": 1337961563, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1337961563, "ctime_nano": 0, "flags": 5, "gid": 5000, "dtime": 0, "dtime_nano": 0, "mode": 384, "mtime": 1337961563, "mtime_nano": 0, "nlink": 1, "seq": 0, "size": 22, "type": 1, "uid": 151107, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 22, "rd_buf_size": 0, "nrd_allocsize": 1024, "nrd_compsize": 0, "nrd_initsize": 22, "nrd_skiplen": 0, "nrd_runs": [{"addr": 31, "flags": 0, "len": 1, "offset": 0}, {"addr": 0, "flags": 2, "len": 11, "offset": 1}]} +]}}, +{"name": {"flags": 1, "meta_addr": 14, "meta_seq": 0, "name": "a_file", "par_addr": 12, "par_seq": 0, "shrt_name": "", "type": 5}, "meta": {"addr": 14, "atime": 1337961554, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1337961554, "ctime_nano": 0, "flags": 5, "gid": 5000, "dtime": 0, "dtime_nano": 0, "mode": 384, "mtime": 1337961554, "mtime_nano": 0, "nlink": 1, "seq": 0, "size": 53, "type": 1, "uid": 151107, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 53, "rd_buf_size": 0, "nrd_allocsize": 1024, "nrd_compsize": 0, "nrd_initsize": 53, "nrd_skiplen": 0, "nrd_runs": [{"addr": 30, "flags": 0, "len": 1, "offset": 0}, {"addr": 0, "flags": 2, "len": 11, "offset": 1}]} +]}}, +{"name": {"flags": 2, "meta_addr": 0, "meta_seq": 0, "name": ".another_file.swp", "par_addr": 12, "par_seq": 0, "shrt_name": "", "type": 5}}, +{"name": {"flags": 2, "meta_addr": 0, "meta_seq": 0, "name": "another_file~", "par_addr": 12, "par_seq": 0, "shrt_name": "", "type": 5}}, +{"name": {"flags": 1, "meta_addr": 15, "meta_seq": 0, "name": "passwords.txt", "par_addr": 2, "par_seq": 0, "shrt_name": "", "type": 5}, "meta": {"addr": 15, "atime": 1337961653, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1337961663, "ctime_nano": 0, "flags": 5, "gid": 5000, "dtime": 0, "dtime_nano": 0, "mode": 256, "mtime": 1337961653, "mtime_nano": 0, "nlink": 1, "seq": 0, "size": 116, "type": 1, "uid": 151107, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 116, "rd_buf_size": 0, "nrd_allocsize": 1024, "nrd_compsize": 0, "nrd_initsize": 116, "nrd_skiplen": 0, "nrd_runs": [{"addr": 22, "flags": 0, "len": 1, "offset": 0}, {"addr": 0, "flags": 2, "len": 11, "offset": 1}]} +]}}, +{"name": {"flags": 1, "meta_addr": 13, "meta_seq": 0, "name": "a_link", "par_addr": 2, "par_seq": 0, "shrt_name": "", "type": 6}, "meta": {"addr": 13, "atime": 1393145691, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1393145686, "ctime_nano": 0, "flags": 5, "gid": 0, "dtime": 0, "dtime_nano": 0, "mode": 511, "mtime": 1393145686, "mtime_nano": 0, "nlink": 1, "seq": 0, "size": 24, "type": 6, "uid": 0, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 24, "rd_buf_size": 0, "nrd_allocsize": 1024, "nrd_compsize": 0, "nrd_initsize": 24, "nrd_skiplen": 0, "nrd_runs": [{"addr": 0, "flags": 2, "len": 12, "offset": 0}]} +]}}, +{"name": {"flags": 1, "meta_addr": 17, "meta_seq": 0, "name": "$OrphanFiles", "par_addr": 2, "par_seq": 0, "shrt_name": "", "type": 11}, "meta": {"addr": 17, "atime": 0, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 0, "ctime_nano": 0, "flags": 5, "gid": 0, "dtime": 0, "dtime_nano": 0, "mode": 0, "mtime": 0, "mtime_nano": 0, "nlink": 1, "seq": 0, "size": 0, "type": 11, "uid": 0, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 0, "rd_buf_size": 0, "nrd_allocsize": 0, "nrd_compsize": 0, "nrd_initsize": 0, "nrd_skiplen": 0, "nrd_runs": [{"addr": 0, "flags": 2, "len": 12, "offset": 0}]} +]}}]}} \ No newline at end of file diff --git a/tests/data/dump/image.vmdk.json b/tests/data/dump/image.vmdk.json new file mode 100644 index 0000000000..058c5a71f2 --- /dev/null +++ b/tests/data/dump/image.vmdk.json @@ -0,0 +1,29 @@ +{"files": ["data/img/image.vmdk"], "itype": "vmdk", "desc": "Virtual Machine Disk (VmWare, Virtual Box)", "size": 102400, "sector_size": 512, "filesystem": {"block_count": 100, "block_size": 1024, "dev_bsize": 512, "duname": "Fragment", "endian": 1, "first_block": 0, "first_inum": 1, "flags": 0, "fs_id": "f1f8dab857ef49db9cf5b409570736ed", "ftype": "ext2", "journ_inum": 0, "inum_count": 17, "last_block": 99, "last_block_act": 99, "last_inum": 17, "offset": 0, "root_inum": 2, "files": [ +{"name": {"flags": 1, "meta_addr": 2, "meta_seq": 0, "name": ".", "par_addr": 2, "par_seq": 0, "shrt_name": "", "type": 3}, "meta": {"addr": 2, "atime": 1393145691, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1393145686, "ctime_nano": 0, "flags": 5, "gid": 5000, "dtime": 0, "dtime_nano": 0, "mode": 493, "mtime": 1393145686, "mtime_nano": 0, "nlink": 4, "seq": 0, "size": 1024, "type": 2, "uid": 151107, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 1024, "rd_buf_size": 0, "nrd_allocsize": 1024, "nrd_compsize": 0, "nrd_initsize": 1024, "nrd_skiplen": 0, "nrd_runs": [{"addr": 7, "flags": 0, "len": 1, "offset": 0}, {"addr": 0, "flags": 2, "len": 11, "offset": 1}]} +]}}, +{"name": {"flags": 1, "meta_addr": 2, "meta_seq": 0, "name": "..", "par_addr": 2, "par_seq": 0, "shrt_name": "", "type": 3}, "meta": {"addr": 2, "atime": 1393145691, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1393145686, "ctime_nano": 0, "flags": 5, "gid": 5000, "dtime": 0, "dtime_nano": 0, "mode": 493, "mtime": 1393145686, "mtime_nano": 0, "nlink": 4, "seq": 0, "size": 1024, "type": 2, "uid": 151107, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 1024, "rd_buf_size": 0, "nrd_allocsize": 1024, "nrd_compsize": 0, "nrd_initsize": 1024, "nrd_skiplen": 0, "nrd_runs": [{"addr": 7, "flags": 0, "len": 1, "offset": 0}, {"addr": 0, "flags": 2, "len": 11, "offset": 1}]} +]}}, +{"name": {"flags": 1, "meta_addr": 11, "meta_seq": 0, "name": "lost+found", "par_addr": 2, "par_seq": 0, "shrt_name": "", "type": 3}, "meta": {"addr": 11, "atime": 1337961350, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1337961350, "ctime_nano": 0, "flags": 5, "gid": 0, "dtime": 0, "dtime_nano": 0, "mode": 448, "mtime": 1337961350, "mtime_nano": 0, "nlink": 2, "seq": 0, "size": 12288, "type": 2, "uid": 0, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 12288, "rd_buf_size": 0, "nrd_allocsize": 12288, "nrd_compsize": 0, "nrd_initsize": 12288, "nrd_skiplen": 0, "nrd_runs": [{"addr": 8, "flags": 0, "len": 12, "offset": 0}]} +]}}, +{"name": {"flags": 1, "meta_addr": 11, "meta_seq": 0, "name": ".", "par_addr": 11, "par_seq": 0, "shrt_name": "", "type": 3}, "meta": {"addr": 11, "atime": 1337961350, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1337961350, "ctime_nano": 0, "flags": 5, "gid": 0, "dtime": 0, "dtime_nano": 0, "mode": 448, "mtime": 1337961350, "mtime_nano": 0, "nlink": 2, "seq": 0, "size": 12288, "type": 2, "uid": 0, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 12288, "rd_buf_size": 0, "nrd_allocsize": 12288, "nrd_compsize": 0, "nrd_initsize": 12288, "nrd_skiplen": 0, "nrd_runs": [{"addr": 8, "flags": 0, "len": 12, "offset": 0}]} +]}}, +{"name": {"flags": 1, "meta_addr": 2, "meta_seq": 0, "name": "..", "par_addr": 11, "par_seq": 0, "shrt_name": "", "type": 3}, "meta": {"addr": 2, "atime": 1393145691, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1393145686, "ctime_nano": 0, "flags": 5, "gid": 5000, "dtime": 0, "dtime_nano": 0, "mode": 493, "mtime": 1393145686, "mtime_nano": 0, "nlink": 4, "seq": 0, "size": 1024, "type": 2, "uid": 151107, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 1024, "rd_buf_size": 0, "nrd_allocsize": 1024, "nrd_compsize": 0, "nrd_initsize": 1024, "nrd_skiplen": 0, "nrd_runs": [{"addr": 7, "flags": 0, "len": 1, "offset": 0}, {"addr": 0, "flags": 2, "len": 11, "offset": 1}]} +]}}, +{"name": {"flags": 1, "meta_addr": 12, "meta_seq": 0, "name": "a_directory", "par_addr": 2, "par_seq": 0, "shrt_name": "", "type": 3}, "meta": {"addr": 12, "atime": 1393145675, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1337961563, "ctime_nano": 0, "flags": 5, "gid": 5000, "dtime": 0, "dtime_nano": 0, "mode": 493, "mtime": 1337961563, "mtime_nano": 0, "nlink": 2, "seq": 0, "size": 1024, "type": 2, "uid": 151107, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 1024, "rd_buf_size": 0, "nrd_allocsize": 1024, "nrd_compsize": 0, "nrd_initsize": 1024, "nrd_skiplen": 0, "nrd_runs": [{"addr": 21, "flags": 0, "len": 1, "offset": 0}, {"addr": 0, "flags": 2, "len": 11, "offset": 1}]} +]}}, +{"name": {"flags": 1, "meta_addr": 12, "meta_seq": 0, "name": ".", "par_addr": 12, "par_seq": 0, "shrt_name": "", "type": 3}, "meta": {"addr": 12, "atime": 1393145675, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1337961563, "ctime_nano": 0, "flags": 5, "gid": 5000, "dtime": 0, "dtime_nano": 0, "mode": 493, "mtime": 1337961563, "mtime_nano": 0, "nlink": 2, "seq": 0, "size": 1024, "type": 2, "uid": 151107, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 1024, "rd_buf_size": 0, "nrd_allocsize": 1024, "nrd_compsize": 0, "nrd_initsize": 1024, "nrd_skiplen": 0, "nrd_runs": [{"addr": 21, "flags": 0, "len": 1, "offset": 0}, {"addr": 0, "flags": 2, "len": 11, "offset": 1}]} +]}}, +{"name": {"flags": 1, "meta_addr": 2, "meta_seq": 0, "name": "..", "par_addr": 12, "par_seq": 0, "shrt_name": "", "type": 3}, "meta": {"addr": 2, "atime": 1393145691, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1393145686, "ctime_nano": 0, "flags": 5, "gid": 5000, "dtime": 0, "dtime_nano": 0, "mode": 493, "mtime": 1393145686, "mtime_nano": 0, "nlink": 4, "seq": 0, "size": 1024, "type": 2, "uid": 151107, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 1024, "rd_buf_size": 0, "nrd_allocsize": 1024, "nrd_compsize": 0, "nrd_initsize": 1024, "nrd_skiplen": 0, "nrd_runs": [{"addr": 7, "flags": 0, "len": 1, "offset": 0}, {"addr": 0, "flags": 2, "len": 11, "offset": 1}]} +]}}, +{"name": {"flags": 1, "meta_addr": 16, "meta_seq": 0, "name": "another_file", "par_addr": 12, "par_seq": 0, "shrt_name": "", "type": 5}, "meta": {"addr": 16, "atime": 1337961563, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1337961563, "ctime_nano": 0, "flags": 5, "gid": 5000, "dtime": 0, "dtime_nano": 0, "mode": 384, "mtime": 1337961563, "mtime_nano": 0, "nlink": 1, "seq": 0, "size": 22, "type": 1, "uid": 151107, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 22, "rd_buf_size": 0, "nrd_allocsize": 1024, "nrd_compsize": 0, "nrd_initsize": 22, "nrd_skiplen": 0, "nrd_runs": [{"addr": 31, "flags": 0, "len": 1, "offset": 0}, {"addr": 0, "flags": 2, "len": 11, "offset": 1}]} +]}}, +{"name": {"flags": 1, "meta_addr": 14, "meta_seq": 0, "name": "a_file", "par_addr": 12, "par_seq": 0, "shrt_name": "", "type": 5}, "meta": {"addr": 14, "atime": 1337961554, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1337961554, "ctime_nano": 0, "flags": 5, "gid": 5000, "dtime": 0, "dtime_nano": 0, "mode": 384, "mtime": 1337961554, "mtime_nano": 0, "nlink": 1, "seq": 0, "size": 53, "type": 1, "uid": 151107, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 53, "rd_buf_size": 0, "nrd_allocsize": 1024, "nrd_compsize": 0, "nrd_initsize": 53, "nrd_skiplen": 0, "nrd_runs": [{"addr": 30, "flags": 0, "len": 1, "offset": 0}, {"addr": 0, "flags": 2, "len": 11, "offset": 1}]} +]}}, +{"name": {"flags": 2, "meta_addr": 0, "meta_seq": 0, "name": ".another_file.swp", "par_addr": 12, "par_seq": 0, "shrt_name": "", "type": 5}}, +{"name": {"flags": 2, "meta_addr": 0, "meta_seq": 0, "name": "another_file~", "par_addr": 12, "par_seq": 0, "shrt_name": "", "type": 5}}, +{"name": {"flags": 1, "meta_addr": 15, "meta_seq": 0, "name": "passwords.txt", "par_addr": 2, "par_seq": 0, "shrt_name": "", "type": 5}, "meta": {"addr": 15, "atime": 1337961653, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1337961663, "ctime_nano": 0, "flags": 5, "gid": 5000, "dtime": 0, "dtime_nano": 0, "mode": 256, "mtime": 1337961653, "mtime_nano": 0, "nlink": 1, "seq": 0, "size": 116, "type": 1, "uid": 151107, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 116, "rd_buf_size": 0, "nrd_allocsize": 1024, "nrd_compsize": 0, "nrd_initsize": 116, "nrd_skiplen": 0, "nrd_runs": [{"addr": 22, "flags": 0, "len": 1, "offset": 0}, {"addr": 0, "flags": 2, "len": 11, "offset": 1}]} +]}}, +{"name": {"flags": 1, "meta_addr": 13, "meta_seq": 0, "name": "a_link", "par_addr": 2, "par_seq": 0, "shrt_name": "", "type": 6}, "meta": {"addr": 13, "atime": 1393145691, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 1393145686, "ctime_nano": 0, "flags": 5, "gid": 0, "dtime": 0, "dtime_nano": 0, "mode": 511, "mtime": 1393145686, "mtime_nano": 0, "nlink": 1, "seq": 0, "size": 24, "type": 6, "uid": 0, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 24, "rd_buf_size": 0, "nrd_allocsize": 1024, "nrd_compsize": 0, "nrd_initsize": 24, "nrd_skiplen": 0, "nrd_runs": [{"addr": 0, "flags": 2, "len": 12, "offset": 0}]} +]}}, +{"name": {"flags": 1, "meta_addr": 17, "meta_seq": 0, "name": "$OrphanFiles", "par_addr": 2, "par_seq": 0, "shrt_name": "", "type": 11}, "meta": {"addr": 17, "atime": 0, "atime_nano": 0, "crtime": 0, "crtime_nano": 0, "ctime": 0, "ctime_nano": 0, "flags": 5, "gid": 0, "dtime": 0, "dtime_nano": 0, "mode": 0, "mtime": 0, "mtime_nano": 0, "nlink": 1, "seq": 0, "size": 0, "type": 11, "uid": 0, "default_attr": 0, "attrs": [{"flags": 3, "id": 0, "type": 1, "name": "", "size": 0, "rd_buf_size": 0, "nrd_allocsize": 0, "nrd_compsize": 0, "nrd_initsize": 0, "nrd_skiplen": 0, "nrd_runs": [{"addr": 0, "flags": 2, "len": 12, "offset": 0}]} +]}}]}} \ No newline at end of file diff --git a/tests/data/img/image.E01 b/tests/data/img/image.E01 new file mode 100644 index 0000000000000000000000000000000000000000..1f8f750ff61b7af4057123263b3c2d9aa8ee6988 GIT binary patch literal 105838 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 zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U MAV7csfx9p8H!7ngMgRZ+ literal 0 HcmV?d00001 diff --git a/tests/data/img/image.vhd b/tests/data/img/image.vhd new file mode 100644 index 0000000000000000000000000000000000000000..a07830427cc2c14671f869caf8517f2860b92db7 GIT binary patch literal 2100224 zcmeI*O=uid902gy-L$c3s@7ETV%@tj*7`{gmRdogQ1LSd4`H*JkTu!exU;LN2Wb%` zXHN=VgdPM%5R`fl+Jjz-sGx_U6g-PXgbJ+)>wCM|CXJ=U)YjJhJ@Vh#`Fd~OZ{C|Q zvw53xy_S}nmBl1U@<}edc2Yjs`T42Em(yx1*_0F}D!b=8i*s*xSI22#V0)M;wA-hL zkDoa5Q1#@a<4bc#Py8}6ajv_O*Xu!`yqGPN8d=(2PTgbPoGiD6TvAMucKggL*F#+# zBLM>cSYV*n_e}{9=r4hPe6_Fx0RsOUfty23rbBEB@x*ei&ff;c`C>QXc8?t0^6X5A zd~$p8?60}bEy9~09D6D`a5}8*-7+M}*6{vNh=)VuL&W@kJNv_D6TgoC`0nqYY?&B* zu)9N8el^pVZ@l%@ci%qt&PRU?KmFbF?XOqYvr~^Na4@UOxB}VBlE7sN6vEyEA$tA4 z(3!ieEbUByz;z_9qQTsy7f_80t5&UAkeo0z2E)u{}sE+G*(bT}C78W`xc{gvlHx%2IBqe?qAx}*KB zn!xdWp{QL+^7r!}pK`9G8^YTyA%;T4=bOVJwuQJc#7!aM^U?SRF}H*m39;VPyZ${H zu6-|lcWx%IuZi+k6(OD4jtZq;DIoGCe*tZanq%dmGa~K z&iJyywEq(IPeS?4kng9V{9_^FG#0bA{M$BIcHHg2CCZQWk9qgb{mS{ju>N;mM)~8H zC_kR#;Ut$I3)AlVe10s<#5TSo8OqPsv*ukh^;Ru>ND$lnj$~_oRa@w^{o9jmxrI`e zy;^TfXJgI9=o$OQ`-RPerOEk9ZEkt_>torg=btu&4I}~t{!@YO@3NKtf2Ppw|NrSh zDVzX-t0xdY0F($2=uZLtzdz5rS`&x@`oDHSpnnDQ|NcGqYED4^*9HjmuYmsFzvo`f z3F!aY0D=A$(Et1Q+^abO{a+g((7yuufB&9)H7B6|YXbxb5FkLHuLR3a2rSH( z%IRn;OBe?a(H~$p>MOab{5!YvF_&(p3 z5AmakMBrK%Xw}N~+DxUEPEWS>)TdqwU*SI4*b~3GeX_YH+m$>wTgi&yr&MgFi_KzO zF*Y8d+MbG{<~^f32T&$46j&0_XdG_kTJpUjWv( zudN6WAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV6T_0_A!wEjKHRA%}dD>*bSAc7A?p@#VDIN;V~hiOTM|&YIlY-3{Wj lFt9z$6x!|6!^ck?d8m5w(eb6ZqbGhDnK;+W#q`=2_zMgACm8?$ literal 0 HcmV?d00001 diff --git a/tests/data/img/image.vmdk b/tests/data/img/image.vmdk new file mode 100644 index 0000000000000000000000000000000000000000..ecc8bd6a027daa70ad8c12b1144f137288652dbe GIT binary patch literal 131072 zcmeI*PiP!f9Ki9}-PqV^qSmCPDC&?NUDxzaf)rwDvsG&`)uuLw9>Qejr8~{;&N4IG zCLUyqAU%5%ya*l&iXbR@s|N)SqC!3C#j{X~P@#wrf4|wCCS5|CrZ#P|-$#Bsv-94Y zH}5m=O~@>>IaYk*RK~KboWu_jnwrV0W$AWJgRO;SWi4w*d;O{QvYF=DPQRV5v)nKO zyPcvR%{fIAl|sKB2jMGz#n|Ue82LeMY>z#Dv^X}hZ)9Y@TN<_NZfI(;ZklZ;yA&EX zHYXSAW^AY$)Pjm1m;KVDl#I-fZSQuD%*Rs4@!Ac@UhNZ8&fei+XY$QMCnk?LLw?mg zV+!Z0-ds}QWZATj$&Fp-up1eBcd>ZbwmomAaLy0ohFf`U>Qw6poiS%<|4@>3#spOp zhYN+$LdCCnlCPP=9hqh0dP&Bf(T<$Rl%)Gf-srwop6j{w*o4|U-Iwo4mp06qH+&TJo zM}g)YOHcp-1Q0*~0R%Riz|)(pL-gma1e$kMn!*SmfB*srAb}EUKmY**x)+75y7E6Jy)QvRpm{+IhI@L_vA=X5D06fCtyO7otre-aZUWyPlBR}R z_c7Bk&}v-oaxSGuWp%5BEur@}`y~1$9+P-nLhp}mmv~ZQKw`Biz5X4OYv1Y5E+5y> zx)%qsw~W6XtKH!WhP>Gf|>azw^vW8M3W;VSHjlmM5g&X=u@l1554e`)BoKjcNQg{kNq3SoZss zw0~Jbm)cBc`#aazwpN?CP5at^-FJHKm(KsK{eSKr+CO@m_Vpb1S($7>maX+{wjghG zj1O9Nwh~0~^Rq#tCLa>$m>;yZWtWYGWbE&<`ZIMmip~e27Zu`p_0+j>DYvE9ov!$` zx%T#V3(@(TcN?St2>}Eis6gv?+0y*Ko@>qj2YOI6jsODdC!ikyk`O?kI|Z2k-Fe>W zH3BNY{AU~>(7gi8|L#5a^c(@^KVtxa?iFDEckj8U=Lj(W83PD(uK@GEd(S;RM}Yay z7(k$V1(^Tcd+zBu0?dEL00IagfB*trC7{prt@Qk#KF>O6^<|bn>#5JW{+ip8ag!%M zjXpAHeV5ywDJ(Cv>=D09x&B+~Cy)QlYb_E22s{h|^@>|E`9@^IeEJBlJ>%Bq@@E4R zRsFb}j~aCohJLARyA?OAI?+NDn`-`r{GPr0_SLc_d1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILxGw_P zKlS^aHGY2ei)v>Ry<7g!e-UOm5}F?w`99wUAL6SC34w=QpiwIYwOPMryy?b)VCJlR zh5K}PK)<grMo0R#|0009ILKmY**5I_I{1Q0*~0R#|0009IL zKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~ z0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~0R#|0009ILKmY** k5I_I{1Q0*~0R#|0009ILKmY**5I_I{1Q0*~fsHQkAK;!_RR910 literal 0 HcmV?d00001 diff --git a/tests/img_dump.cpp b/tests/img_dump.cpp new file mode 100644 index 0000000000..48a9b65d90 --- /dev/null +++ b/tests/img_dump.cpp @@ -0,0 +1,456 @@ +#include "tsk/libtsk.h" + +#include +#include +#include +#include +#include +#include +#include + +std::string replace( + const std::string& src, + const std::string& find, + const std::string& repl) +{ + std::string s(src); + + size_t pos = 0; + while ((pos = s.find(find, pos)) != std::string::npos) { + s.replace(pos, find.length(), repl); + pos += repl.length(); + } + + return s; +} + +// quotes and backslashes in JSON strings must be quoted with backslashes +std::string quote(const std::string& s) { + return replace(replace(s, "\\", "\\\\"), "\"", "\\\""); +} + +template +struct Hex { + Itr beg, end; +}; + +// Write out bytes as hexidecimal +template +std::ostream& operator<<(std::ostream& out, Hex h) { + out << '"' << std::hex << std::setfill('0'); + for (auto i = h.beg; i != h.end; ++i) { + out << std::setw(2) << static_cast(*i); + } + out << std::dec << '"'; + return out; +} + +std::string extractString(const char* buf, size_t len) { +// TODO: use string_view + // chop off trailing nulls + return buf ? std::string(buf, std::min(std::strlen(buf), len)) : ""; +} + +class JSON { +public: + JSON(std::ostream& out): out(out), state() {} + + ~JSON() { + while (!state.empty()) { + end(); + } + } + + JSON& obj() { + if (!state.empty() && state.top().first[0] == ']') { + sep(); + } + out << '{'; + state.emplace("}", true); + return *this; + } + + // Open object to appear on its own line, for readable diffs + JSON& obj_line() { + if (!state.empty() && state.top().first[0] == ']') { + sep(); + } + nl(); + out << '{'; + state.emplace("}", true); + return *this; + } + + JSON& arr() { + if (!state.empty() && state.top().first[0] == ']') { + sep(); + } + out << '['; + state.emplace("]", true); + return *this; + } + + // Open array of objects to appear on their own lines, for readable diffs + JSON& arr_lines() { + if (!state.empty() && state.top().first[0] == ']') { + sep(); + } + out << '['; + state.emplace("\n]", true); + return *this; + } + + JSON& end() { + out << state.top().first; + state.pop(); + return *this; + } + + JSON& nl() { + out << '\n'; + return *this; + } + + JSON& k(const char* k) { + sep(); + key(k); + return *this; + } + + template + JSON& kv(const char* k, V v) { + sep(); + key(k); + value(v); + return *this; + } + + template + JSON& v(V v) { + sep(); + value(v); + return *this; + } + +private: + void sep() { + if (state.top().second) { + state.top().second = false; + } + else { + out << ", "; + } + } + + void key(const char* k) { + value(k); + out << ": "; + } + + void value(const std::string& v) { + out << '"' << quote(v) << '"'; + } + + void value(const char* v) { + value(std::string(v)); + } + + template + void value(V v) { + out << v; + } + + std::ostream& out; + std::stack> state; +}; + +class Walker: public TskAuto { +public: + Walker(std::ostream& out): + TskAuto(), + json(out), + prev_vs_part(nullptr), + prev_fs(nullptr) {} + + virtual ~Walker() {} + + void run() { + auto img = m_img_info; + + json.obj(); + json.k("files"); + + json.arr(); + for (auto i = 0; i < img->num_img; ++i) { + json.v(static_cast(img->images[i])); + } + json.end(); + + json + .kv("itype", tsk_img_type_toname(img->itype)) + .kv("desc", tsk_img_type_todesc(img->itype)) + .kv("size", img->size) + .kv("sector_size", img->sector_size); + + findFilesInImg(); + } + + virtual TSK_FILTER_ENUM filterPool(const TSK_POOL_INFO* p) override { + return TSK_FILTER_CONT; + } + + virtual TSK_FILTER_ENUM filterPoolVol(const TSK_POOL_VOLUME_INFO* pv) override { + return TSK_FILTER_CONT; + } + + virtual TSK_FILTER_ENUM filterVs(const TSK_VS_INFO* vs) override { + json.k("volumesystem"); + json.obj(); + + json + .kv("vstype", tsk_vs_type_toname(vs->vstype)) + .kv("desc", tsk_vs_type_todesc(vs->vstype)) + .kv("block_size", vs->block_size) + .kv("part_count", vs->part_count) + .kv("offset", vs->offset); + + json.k("volumes"); + json.arr(); + + return TSK_FILTER_CONT; + } + + virtual TSK_FILTER_ENUM filterVol(const TSK_VS_PART_INFO* vs_part) override { + // We track the previous partition and fs so we know when they're finished + // because TskAuto presently has no end callbacks. + if (prev_vs_part) { + if (prev_fs) { + json.end().end(); + prev_fs = nullptr; + } + json.end(); + } + prev_vs_part = vs_part; + + json.obj(); + json + .kv("addr", vs_part->addr) + .kv("desc", vs_part->desc) + .kv("flags", vs_part->flags) + .kv("len", vs_part->len) + .kv("slot_num", vs_part->slot_num) + .kv("start", vs_part->start) + .kv("table_num", vs_part->table_num); + + return TSK_FILTER_CONT; + } + + virtual TSK_FILTER_ENUM filterFs(TSK_FS_INFO* fs) override { + // We track the previous fs so we know when it's finished + // because TskAuto presently has no end callbacks. + if (prev_fs) { + json.nl().end().end(); + } + prev_fs = fs; + + json.k("filesystem"); + json.obj(); + json + .kv("block_count", fs->block_count) + .kv("block_size", fs->block_size) + .kv("dev_bsize", fs->dev_bsize) + .kv("duname", fs->duname) + .kv("endian", fs->endian) + .kv("first_block", fs->first_block) + .kv("first_inum", fs->first_inum) + .kv("flags", fs->flags) + .kv("fs_id", Hex{fs->fs_id, fs->fs_id + fs->fs_id_used}) + .kv("ftype", tsk_fs_type_toname(fs->ftype)) + .kv("journ_inum", fs->journ_inum) + .kv("inum_count", fs->inum_count) + .kv("last_block", fs->last_block) + .kv("last_block_act", fs->last_block_act) + .kv("last_inum", fs->last_inum) + .kv("offset", fs->offset) + .kv("root_inum", fs->root_inum); + + json.k("files"); + json.arr(); + + return TSK_FILTER_CONT; + } + + void processAttrRun(const TSK_FS_ATTR_RUN* r) { + json.obj(); + json + .kv("addr", r->addr) + .kv("flags", r->flags) + .kv("len", r->len) + .kv("offset", r->offset); + json.end(); + } + + void processAttr(const TSK_FS_ATTR* a) { + json.obj(); + + json + .kv("flags", a->flags) + .kv("id", a->id) + .kv("type", a->type) + .kv("name", extractString(a->name, a->name_size)) + .kv("size", a->size) + .kv("rd_buf_size", a->rd.buf_size) + .kv("nrd_allocsize", a->nrd.allocsize) + .kv("nrd_compsize", a->nrd.compsize) + .kv("nrd_initsize", a->nrd.initsize) + .kv("nrd_skiplen", a->nrd.skiplen); + + if ((a->flags & TSK_FS_ATTR_RES) && a->rd.buf_size && a->rd.buf) { + const size_t len = std::min(a->rd.buf_size, static_cast(a->size)); + json.kv("rd_buf", Hex{a->rd.buf, a->rd.buf + len}); + } + + if (a->flags & TSK_FS_ATTR_NONRES) { + json.k("nrd_runs"); + json.arr(); + + for (TSK_FS_ATTR_RUN* r = a->nrd.run; r; r = r->next) { + if (r->flags == TSK_FS_ATTR_RUN_FLAG_FILLER) { + continue; + } + processAttrRun(r); + } + + json.end(); + } + + json.end(); + } + + void processName(const TSK_FS_NAME* name) { + json.k("name"); + json.obj(); + + json + .kv("flags", name->flags) + .kv("meta_addr", name->meta_addr) + .kv("meta_seq", name->meta_seq) + .kv("name", extractString(name->name, name->name_size)) + .kv("par_addr", name->par_addr) + .kv("par_seq", name->par_seq) + .kv("shrt_name", extractString(name->shrt_name, name->shrt_name_size)) + .kv("type", name->type); + + json.end(); + } + + void processMeta(const TSK_FS_META* meta, TSK_FS_FILE* file) { + json.k("meta"); + json.obj(); + + json + .kv("addr", meta->addr) + .kv("atime", meta->atime) + .kv("atime_nano", meta->atime_nano) + .kv("crtime", meta->crtime) + .kv("crtime_nano", meta->crtime_nano) + .kv("ctime", meta->ctime) + .kv("ctime_nano", meta->ctime_nano) + .kv("flags", meta->flags) + .kv("gid", meta->gid); + + const auto fs = file->fs_info; + + if (TSK_FS_TYPE_ISEXT(fs->ftype)) { + json + .kv("dtime", meta->time2.ext2.dtime) + .kv("dtime_nano", meta->time2.ext2.dtime_nano); + } + else if (TSK_FS_TYPE_ISHFS(fs->ftype)) { + json + .kv("bkup_time", meta->time2.hfs.bkup_time) + .kv("bkup_time_nano", meta->time2.hfs.bkup_time_nano); + } + + json + .kv("mode", meta->mode) + .kv("mtime", meta->mtime) + .kv("mtime_nano", meta->mtime_nano) + .kv("nlink", meta->nlink) + .kv("seq", meta->seq) + .kv("size", meta->size) + .kv("type", meta->type) + .kv("uid", meta->uid); + + const auto defAttr = tsk_fs_file_attr_get(file); + json.kv("default_attr", defAttr ? defAttr->id : -1); + + json.k("attrs"); + json.arr_lines(); + + if (meta->attr && (meta->attr_state & TSK_FS_META_ATTR_STUDIED)) { + uint32_t i = 0; + for (const TSK_FS_ATTR* a = meta->attr->head; a; a = a->next, ++i) { + if (a->flags & TSK_FS_ATTR_INUSE) { + processAttr(a); + } + } + } + else { + const int numAttrs = tsk_fs_file_attr_getsize(file); + if (numAttrs > 0) { + for (int i = 0; i < numAttrs; ++i) { + const TSK_FS_ATTR* a = tsk_fs_file_attr_get_idx(file, i); + if (a && a->flags & TSK_FS_ATTR_INUSE) { + processAttr(a); + } + } + } + } + + json.end(); + json.end(); + } + + virtual TSK_RETVAL_ENUM processFile(TSK_FS_FILE* file, const char*) override { + json.obj_line(); + + if (file->name) { + processName(file->name); + } + + if (file->meta) { + processMeta(file->meta, file); + } + + json.end(); + return TSK_OK; + } + +private: + JSON json; + const TSK_VS_PART_INFO* prev_vs_part; + const TSK_FS_INFO* prev_fs; +}; + +int main(int argc, char** argv) { + // Usage: img_dump IMAGE_PATH + if (argc < 2) { + return 1; + } + + std::unique_ptr img{ + tsk_img_open(argc - 1, argv + 1, TSK_IMG_TYPE_DETECT, 0), + tsk_img_close + }; + + if (!img) { + return 1; + } + + Walker walker(std::cout); + walker.openImageHandle(img.get()); + walker.run(); + + return 0; +} diff --git a/tests/imgs_to_dump.in b/tests/imgs_to_dump.in new file mode 100644 index 0000000000..32dae63bc2 --- /dev/null +++ b/tests/imgs_to_dump.in @@ -0,0 +1,3 @@ +image.dd +image.iso +@CHECK_IMGS@ diff --git a/tests/test_imgs.sh b/tests/test_imgs.sh new file mode 100755 index 0000000000..63207e67b9 --- /dev/null +++ b/tests/test_imgs.sh @@ -0,0 +1,9 @@ +#!/bin/bash -e + +ERROR=0 + +for i in $(cat imgs_to_dump) ; do + diff data/dump/$i.json <(TZ=America/New_York ./img_dump data/img/$i) && echo "SUCCESS: img_dump $i" || { echo "FAILED: img_dump $i" ; ERROR=1 ; } +done + +exit $ERROR From bbaa085b0d64ed0ff730a19e57cd33d48c24bf20 Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Thu, 5 Sep 2024 12:18:10 -0400 Subject: [PATCH 0101/1548] this is why PR to develop did not force a run of the checks. --- .github/workflows/compile-check-codecov.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/compile-check-codecov.yml b/.github/workflows/compile-check-codecov.yml index 73b4e4f355..a455237df7 100644 --- a/.github/workflows/compile-check-codecov.yml +++ b/.github/workflows/compile-check-codecov.yml @@ -15,8 +15,9 @@ on: branches: - '**' # This will trigger the action for all branches pull_request: - branches: - - main # Specify the branches for which pull_request events should trigger the action + branches: # Specify the branches for which pull_request events should trigger the action + - main + - develop jobs: build: From 58a023c1453313755567968815b5a72fee35f9b2 Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Thu, 5 Sep 2024 17:23:04 +0100 Subject: [PATCH 0102/1548] Make appveyor actually run tests. --- appveyor.yml | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index c825a97b0d..4c27c86db1 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -65,8 +65,11 @@ for: build_script: - ./bootstrap - - ./configure -q - - make -s + - ./configure + - make -j + + test_script: + - make -j check VERBOSE=1 - matrix: @@ -75,5 +78,8 @@ for: build_script: - ./bootstrap - - ./configure -q - - make -s + - ./configure + - make -j + + test_script: + - make -j check VERBOSE=1 From 85ccb72dacfacda9d246a20d941e1b9136853711 Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Thu, 11 Jul 2019 14:58:18 +0100 Subject: [PATCH 0103/1548] It is entirely pointless to put parentheses around the argument to "return". Don't do that. --- tsk/img/ewf.cpp | 16 ++++++++-------- tsk/img/vhd.c | 10 +++++----- tsk/img/vmdk.c | 10 +++++----- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/tsk/img/ewf.cpp b/tsk/img/ewf.cpp index 1dc8c81da0..756b172394 100644 --- a/tsk/img/ewf.cpp +++ b/tsk/img/ewf.cpp @@ -324,7 +324,7 @@ ewf_open(int a_num_img, if (tsk_verbose != 0) { tsk_fprintf(stderr, "Not an EWF file\n"); } - return (NULL); + return NULL; } if (libewf_handle_initialize(&(ewf_info->handle), &ewf_error) != 1) { @@ -341,7 +341,7 @@ ewf_open(int a_num_img, if (tsk_verbose != 0) { tsk_fprintf(stderr, "Unable to create EWF handle\n"); } - return (NULL); + return NULL; } #if defined( TSK_WIN32 ) is_error = (libewf_handle_open_wide(ewf_info->handle, @@ -367,7 +367,7 @@ ewf_open(int a_num_img, if (tsk_verbose != 0) { tsk_fprintf(stderr, "Error opening EWF file\n"); } - return (NULL); + return NULL; } if (libewf_handle_get_media_size(ewf_info->handle, (size64_t *) & (img_info->size), &ewf_error) != 1) { @@ -385,7 +385,7 @@ ewf_open(int a_num_img, if (tsk_verbose != 0) { tsk_fprintf(stderr, "Error getting size of EWF file\n"); } - return (NULL); + return NULL; } result = libewf_handle_get_utf8_hash_value_md5(ewf_info->handle, (uint8_t *) ewf_info->md5hash, 33, &ewf_error); @@ -405,7 +405,7 @@ ewf_open(int a_num_img, if (tsk_verbose != 0) { tsk_fprintf(stderr, "Error getting MD5 of EWF file\n"); } - return (NULL); + return NULL; } ewf_info->md5hash_isset = result; @@ -471,7 +471,7 @@ ewf_open(int a_num_img, if (tsk_verbose != 0) { tsk_fprintf(stderr, "Error opening EWF file\n"); } - return (NULL); + return NULL; } #if defined( LIBEWF_STRING_DIGEST_HASH_LENGTH_MD5 ) // 2007 version @@ -491,7 +491,7 @@ ewf_open(int a_num_img, if (tsk_verbose) { tsk_fprintf(stderr, "Error getting size of EWF file\n"); } - return (NULL); + return NULL; } if (libewf_get_md5_hash(ewf_info->handle, md5_hash, 16) == 1) { int md5_string_iterator = 0; @@ -565,7 +565,7 @@ ewf_open(int a_num_img, // initialize the read lock tsk_init_lock(&(ewf_info->read_lock)); - return (img_info); + return img_info; } diff --git a/tsk/img/vhd.c b/tsk/img/vhd.c index 7964f8d3e6..3f9818c226 100644 --- a/tsk/img/vhd.c +++ b/tsk/img/vhd.c @@ -196,7 +196,7 @@ vhdi_open(int a_num_img, if (tsk_verbose != 0) { tsk_fprintf(stderr, "Unable to create vhdi handle\n"); } - return (NULL); + return NULL; } // Check the file signature before we call the library open #if defined( TSK_WIN32 ) @@ -219,7 +219,7 @@ vhdi_open(int a_num_img, if (tsk_verbose != 0) { tsk_fprintf(stderr, "Error checking file signature for vhd file\n"); } - return (NULL); + return NULL; } #if defined( TSK_WIN32 ) if (libvhdi_file_open_wide(vhdi_info->handle, @@ -244,7 +244,7 @@ vhdi_open(int a_num_img, if (tsk_verbose != 0) { tsk_fprintf(stderr, "Error opening vhdi file\n"); } - return (NULL); + return NULL; } if (libvhdi_file_get_media_size(vhdi_info->handle, (size64_t *) & (img_info->size), &vhdi_error) != 1) { @@ -262,7 +262,7 @@ vhdi_open(int a_num_img, if (tsk_verbose != 0) { tsk_fprintf(stderr, "Error getting size of vhdi file\n"); } - return (NULL); + return NULL; } if (a_ssize != 0) { @@ -279,7 +279,7 @@ vhdi_open(int a_num_img, // initialize the read lock tsk_init_lock(&(vhdi_info->read_lock)); - return (img_info); + return img_info; } #endif /* HAVE_LIBVHDI */ diff --git a/tsk/img/vmdk.c b/tsk/img/vmdk.c index 188ba824e5..10e4467ade 100644 --- a/tsk/img/vmdk.c +++ b/tsk/img/vmdk.c @@ -196,7 +196,7 @@ vmdk_open(int a_num_img, if (tsk_verbose != 0) { tsk_fprintf(stderr, "Unable to create vmdk handle\n"); } - return (NULL); + return NULL; } #if defined( TSK_WIN32 ) if (libvmdk_handle_open_wide(vmdk_info->handle, @@ -221,7 +221,7 @@ vmdk_open(int a_num_img, if (tsk_verbose != 0) { tsk_fprintf(stderr, "Error opening vmdk file\n"); } - return (NULL); + return NULL; } if( libvmdk_handle_open_extent_data_files(vmdk_info->handle, &vmdk_error ) != 1 ) { @@ -239,7 +239,7 @@ vmdk_open(int a_num_img, if (tsk_verbose != 0) { tsk_fprintf(stderr, "Error opening vmdk extent data files\n"); } - return (NULL); + return NULL; } if (libvmdk_handle_get_media_size(vmdk_info->handle, (size64_t *) & (img_info->size), &vmdk_error) != 1) { @@ -257,7 +257,7 @@ vmdk_open(int a_num_img, if (tsk_verbose != 0) { tsk_fprintf(stderr, "Error getting size of vmdk file\n"); } - return (NULL); + return NULL; } if (a_ssize != 0) { @@ -274,7 +274,7 @@ vmdk_open(int a_num_img, // initialize the read lock tsk_init_lock(&(vmdk_info->read_lock)); - return (img_info); + return img_info; } #endif /* HAVE_LIBVMDK */ From 55e48e7e07491b01b6808f070a589742161ff53c Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Mon, 19 Jul 2021 15:06:25 +0100 Subject: [PATCH 0104/1548] Whitespace. --- tsk/img/vhd.c | 6 ++---- tsk/img/vmdk.c | 10 ++++------ 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/tsk/img/vhd.c b/tsk/img/vhd.c index 3f9818c226..40a0b5e43b 100644 --- a/tsk/img/vhd.c +++ b/tsk/img/vhd.c @@ -106,8 +106,7 @@ static void char *errmsg = NULL; IMG_VHDI_INFO *vhdi_info = (IMG_VHDI_INFO *) img_info; - if( libvhdi_file_close(vhdi_info->handle, &vhdi_error ) != 0 ) - { + if (libvhdi_file_close(vhdi_info->handle, &vhdi_error ) != 0) { tsk_error_reset(); tsk_error_set_errno(TSK_ERR_AUX_GENERIC); if (getError(vhdi_error, error_string)) @@ -119,8 +118,7 @@ static void } libvhdi_file_free(&(vhdi_info->handle), NULL); - if( libvhdi_file_free(&(vhdi_info->handle), &vhdi_error ) != 1 ) - { + if (libvhdi_file_free(&(vhdi_info->handle), &vhdi_error ) != 1) { tsk_error_reset(); tsk_error_set_errno(TSK_ERR_AUX_GENERIC); if (getError(vhdi_error, error_string)) diff --git a/tsk/img/vmdk.c b/tsk/img/vmdk.c index 10e4467ade..2496758aeb 100644 --- a/tsk/img/vmdk.c +++ b/tsk/img/vmdk.c @@ -106,8 +106,7 @@ static void char *errmsg = NULL; IMG_VMDK_INFO *vmdk_info = (IMG_VMDK_INFO *) img_info; - if( libvmdk_handle_close(vmdk_info->handle, &vmdk_error ) != 0 ) - { + if (libvmdk_handle_close(vmdk_info->handle, &vmdk_error ) != 0) { tsk_error_reset(); tsk_error_set_errno(TSK_ERR_AUX_GENERIC); if (getError(vmdk_error, error_string)) @@ -119,8 +118,7 @@ static void } libvmdk_handle_free(&(vmdk_info->handle), NULL); - if( libvmdk_handle_free(&(vmdk_info->handle), &vmdk_error ) != 1 ) - { + if (libvmdk_handle_free(&(vmdk_info->handle), &vmdk_error ) != 1) { tsk_error_reset(); tsk_error_set_errno(TSK_ERR_AUX_GENERIC); if (getError(vmdk_error, error_string)) @@ -223,8 +221,8 @@ vmdk_open(int a_num_img, } return NULL; } - if( libvmdk_handle_open_extent_data_files(vmdk_info->handle, &vmdk_error ) != 1 ) - { + + if (libvmdk_handle_open_extent_data_files(vmdk_info->handle, &vmdk_error) != 1) { tsk_error_reset(); tsk_error_set_errno(TSK_ERR_IMG_OPEN); From f5815d98385d0531ddfd1e70b4175ceb0799c103 Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Mon, 19 Jul 2021 15:13:30 +0100 Subject: [PATCH 0105/1548] Removed useless returns. --- tsk/img/ewf.cpp | 1 - tsk/img/vhd.c | 2 -- 2 files changed, 3 deletions(-) diff --git a/tsk/img/ewf.cpp b/tsk/img/ewf.cpp index 756b172394..624dfcdf58 100644 --- a/tsk/img/ewf.cpp +++ b/tsk/img/ewf.cpp @@ -115,7 +115,6 @@ ewf_image_imgstat(TSK_IMG_INFO * img_info, FILE * hFile) if (ewf_info->md5hash_isset == 1) { tsk_fprintf(hFile, "MD5 hash of data:\t%s\n", ewf_info->md5hash); } - return; } static void diff --git a/tsk/img/vhd.c b/tsk/img/vhd.c index 40a0b5e43b..847d081ed5 100644 --- a/tsk/img/vhd.c +++ b/tsk/img/vhd.c @@ -92,8 +92,6 @@ vhdi_image_imgstat(TSK_IMG_INFO * img_info, FILE * hFile) tsk_fprintf(hFile, "\nSize of data in bytes:\t%" PRIdOFF "\n", img_info->size); tsk_fprintf(hFile, "Sector size:\t%d\n", img_info->sector_size); - - return; } From ca83ff212bca65c5a64dae52919fc71871a673cd Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Fri, 12 Jul 2019 13:30:28 +0100 Subject: [PATCH 0106/1548] Correctly handle freeing images array for EWF. Also fixed nesting of glob free---libewf_error_t doesn't exist in the v1 API but some code using it was outside the #ifdef guard. --- tsk/img/aff.c | 26 +++++------------- tsk/img/ewf.cpp | 51 +++++++++++------------------------ tsk/img/img_open.cpp | 52 +++++++++++++++++++++++++++++++++++- tsk/img/raw.c | 63 +------------------------------------------- tsk/img/tsk_img_i.h | 3 +++ tsk/img/vhd.c | 27 ++++--------------- tsk/img/vmdk.c | 27 ++++--------------- 7 files changed, 87 insertions(+), 162 deletions(-) diff --git a/tsk/img/aff.c b/tsk/img/aff.c index c53812e822..e4f696045b 100644 --- a/tsk/img/aff.c +++ b/tsk/img/aff.c @@ -217,11 +217,6 @@ aff_close(TSK_IMG_INFO * img_info) int i; IMG_AFF_INFO *aff_info = (IMG_AFF_INFO *) img_info; af_close(aff_info->af_file); - for (i = 0; i < img_info->num_img; i++) { - if (img_info->images[i]) - free(img_info->images[i]); - } - free(img_info->images); tsk_img_free(aff_info); } @@ -290,24 +285,15 @@ aff_open(const TSK_TCHAR * const images[], unsigned int a_ssize) img_info->close = aff_close; img_info->imgstat = aff_imgstat; - // Save the image path in TSK_IMG_INFO - this is mostly for consistency with the other - // image types and is not currently used - img_info->num_img = 1; - img_info->images = - (TSK_TCHAR **)tsk_malloc(sizeof(TSK_TCHAR *) * img_info->num_img); - if (img_info->images == NULL) { - free(image); - return NULL; - } - size_t len = TSTRLEN(images[0]); - img_info->images[0] = - (TSK_TCHAR *)tsk_malloc(sizeof(TSK_TCHAR) * (len + 1)); - if (img_info->images[0] == NULL) { - free(img_info->images); + // Save the image path in TSK_IMG_INFO - this is mostly for consistency + // with the other image types and is not currently used + + // a_num_img should be 1 + if (!tsk_img_copy_image_names(img_info, a_images, a_num_img)) { + tsk_img_free(aff_info); free(image); return NULL; } - TSTRNCPY(img_info->images[0], images[0], len + 1); img_info->sector_size = 512; if (a_ssize) diff --git a/tsk/img/ewf.cpp b/tsk/img/ewf.cpp index 624dfcdf58..5ce35771f6 100644 --- a/tsk/img/ewf.cpp +++ b/tsk/img/ewf.cpp @@ -37,6 +37,7 @@ getError(libewf_error_t * ewf_error, error_string[0] = '\0'; retval = libewf_error_backtrace_sprint(ewf_error, error_string, TSK_EWF_ERROR_STRING_SIZE); + libewf_error_free(&ewf_error); return retval <= 0; } #endif @@ -125,27 +126,27 @@ ewf_image_close(TSK_IMG_INFO * img_info) #if defined ( HAVE_LIBEWF_V2_API) libewf_handle_close(ewf_info->handle, NULL); libewf_handle_free(&(ewf_info->handle), NULL); - #else libewf_close(ewf_info->handle); #endif - // this stuff crashes if we used glob. v2 of the API has a free method. - // not clear from the docs what we should do in v1... + // Freeing img_info->images ourselves is incorrect if we used glob. + // v2 of the API has a free method. It's not clear from the docs what we + // should do in v1... // @@@ Probably a memory leak in v1 unless libewf_close deals with it - if (ewf_info->used_ewf_glob == 0) { - int i; - for (i = 0; i < ewf_info->img_info.num_img; i++) { - free(ewf_info->img_info.images[i]); - } - free(ewf_info->img_info.images); - } - else { + if (ewf_info->used_ewf_glob != 0) { +#if defined ( HAVE_LIBEWF_V2_API) + libewf_error_t *error = NULL; #ifdef TSK_WIN32 - libewf_glob_wide_free( ewf_info->img_info.images, ewf_info->img_info.num_img, NULL); + libewf_glob_wide_free(ewf_info->img_info.images, ewf_info->img_info.num_img, &error); #else - libewf_glob_free( ewf_info->img_info.images, ewf_info->img_info.num_img, NULL); + libewf_glob_free(ewf_info->img_info.images, ewf_info->img_info.num_img, &error); +#endif + libewf_error_free(&error); #endif + // ensure that tsk_img_free() does not double free images + img_info->images = NULL; + img_info->num_img = 0; } tsk_deinit_lock(&(ewf_info->read_lock)); @@ -246,7 +247,6 @@ ewf_open(int a_num_img, getError(ewf_error, error_string); tsk_error_set_errstr("ewf_open: Not an E01 glob name (%s)", error_string); - libewf_error_free(&ewf_error); tsk_img_free(ewf_info); return NULL; } @@ -279,27 +279,12 @@ ewf_open(int a_num_img, ewf_info->img_info.num_img); } else { - int i; - ewf_info->img_info.num_img = a_num_img; - if ((ewf_info->img_info.images = - (TSK_TCHAR **) tsk_malloc(a_num_img * - sizeof(TSK_TCHAR *))) == NULL) { + if (!tsk_img_copy_image_names(img_info, a_images, a_num_img)) { tsk_img_free(ewf_info); return NULL; } - for (i = 0; i < a_num_img; i++) { - if ((ewf_info->img_info.images[i] = - (TSK_TCHAR *) tsk_malloc((TSTRLEN(a_images[i]) + - 1) * sizeof(TSK_TCHAR))) == NULL) { - tsk_img_free(ewf_info); - return NULL; - } - TSTRNCPY(ewf_info->img_info.images[i], a_images[i], - TSTRLEN(a_images[i]) + 1); - } } - #if defined( HAVE_LIBEWF_V2_API ) // Check the file signature before we call the library open @@ -316,7 +301,6 @@ ewf_open(int a_num_img, getError(ewf_error, error_string); tsk_error_set_errstr("ewf_open: Not an EWF file (%s)", error_string); - libewf_error_free(&ewf_error); tsk_img_free(ewf_info); @@ -333,7 +317,6 @@ ewf_open(int a_num_img, getError(ewf_error, error_string); tsk_error_set_errstr("ewf_open file: %" PRIttocTSK ": Error initializing handle (%s)", a_images[0], error_string); - libewf_error_free(&ewf_error); tsk_img_free(ewf_info); @@ -359,7 +342,6 @@ ewf_open(int a_num_img, getError(ewf_error, error_string); tsk_error_set_errstr("ewf_open file: %" PRIttocTSK ": Error opening (%s)", a_images[0], error_string); - libewf_error_free(&ewf_error); tsk_img_free(ewf_info); @@ -377,7 +359,6 @@ ewf_open(int a_num_img, tsk_error_set_errstr("ewf_open file: %" PRIttocTSK ": Error getting size of image (%s)", a_images[0], error_string); - libewf_error_free(&ewf_error); tsk_img_free(ewf_info); @@ -397,7 +378,6 @@ ewf_open(int a_num_img, tsk_error_set_errstr("ewf_open file: %" PRIttocTSK ": Error getting MD5 of image (%s)", a_images[0], error_string); - libewf_error_free(&ewf_error); tsk_img_free(ewf_info); @@ -537,6 +517,7 @@ ewf_open(int a_num_img, tsk_fprintf(stderr, "ewf_image_read: error getting sector size from E01\n"); img_info->sector_size = 512; + libewf_error_free(&ewf_error); } else { // if E01 had size of 0 or non-512 then consider it junk and ignore diff --git a/tsk/img/img_open.cpp b/tsk/img/img_open.cpp index 2b72d2da51..a99519333e 100644 --- a/tsk/img/img_open.cpp +++ b/tsk/img/img_open.cpp @@ -560,8 +560,32 @@ tsk_img_open_utf16(int num_img, } #endif +void tsk_img_free_image_names(TSK_IMG_INFO* img_info) { + for (int i = img_info->num_img - 1; i >= 0; --i) { + free(img_info->images[i]); + } + free(img_info->images); + img_info->images = NULL; + img_info->num_img = 0; +} - +int tsk_img_copy_image_names(TSK_IMG_INFO* img_info, const TSK_TCHAR* const images[], int num) { + if (!(img_info->images = (TSK_TCHAR**) tsk_malloc(num * sizeof(TSK_TCHAR*)))) { + return 0; + } + img_info->num_img = num; + memset(img_info->images, 0, sizeof(num * sizeof(TSK_TCHAR*))); + + for (int i = 0; i < num; ++i) { + const size_t len = TSTRLEN(images[i]); + if (!(img_info->images[i] = (TSK_TCHAR*) tsk_malloc((len+1)*sizeof(TSK_TCHAR)))) { + tsk_img_free_image_names(img_info); + return 0; + } + TSTRNCPY(img_info->images[i], images[i], len + 1); + } + return 1; +} /** * \ingroup imglib @@ -577,3 +601,29 @@ tsk_img_close(TSK_IMG_INFO * a_img_info) tsk_deinit_lock(&(a_img_info->cache_lock)); a_img_info->close(a_img_info); } + +/* tsk_img_malloc - tsk_malloc, then set image tag + * This is for img module and all its inheritances + */ +void * +tsk_img_malloc(size_t a_len) +{ + TSK_IMG_INFO *imgInfo; + if ((imgInfo = (TSK_IMG_INFO *) tsk_malloc(a_len)) == NULL) + return NULL; + imgInfo->tag = TSK_IMG_INFO_TAG; + return (void *) imgInfo; +} + + +/* tsk_img_free - unset image tag, then free memory + * This is for img module and all its inheritances + */ +void +tsk_img_free(void *a_ptr) +{ + TSK_IMG_INFO *imgInfo = (TSK_IMG_INFO *) a_ptr; + imgInfo->tag = 0; + tsk_img_free_image_names(imgInfo); + free(imgInfo); +} diff --git a/tsk/img/raw.c b/tsk/img/raw.c index 3210536451..9d9279a9b3 100644 --- a/tsk/img/raw.c +++ b/tsk/img/raw.c @@ -656,29 +656,10 @@ raw_open(int a_num_img, const TSK_TCHAR * const a_images[], } } else { - raw_info->img_info.num_img = a_num_img; - raw_info->img_info.images = - (TSK_TCHAR **) tsk_malloc(sizeof(TSK_TCHAR *) * a_num_img); - if (raw_info->img_info.images == NULL) { + if (!tsk_img_copy_image_names(img_info, a_images, a_num_img)) { tsk_img_free(raw_info); return NULL; } - - for (i = 0; i < raw_info->img_info.num_img; i++) { - size_t len = TSTRLEN(a_images[i]); - raw_info->img_info.images[i] = - (TSK_TCHAR *) tsk_malloc(sizeof(TSK_TCHAR) * (len + 1)); - if (raw_info->img_info.images[i] == NULL) { - int j; - for (j = 0; j < i; j++) { - free(raw_info->img_info.images[j]); - } - free(raw_info->img_info.images); - tsk_img_free(raw_info); - return NULL; - } - TSTRNCPY(raw_info->img_info.images[i], a_images[i], len + 1); - } } /* sanity check: when we have multiple segments, the size of @@ -689,10 +670,6 @@ raw_open(int a_num_img, const TSK_TCHAR * const a_images[], "raw_open: file size is unknown in a segmented raw image\n"); } - for (i = 0; i < raw_info->img_info.num_img; i++) { - free(raw_info->img_info.images[i]); - } - free(raw_info->img_info.images); tsk_img_free(raw_info); return NULL; } @@ -700,10 +677,6 @@ raw_open(int a_num_img, const TSK_TCHAR * const a_images[], /* initialize the split cache */ raw_info->cptr = (int *) tsk_malloc(raw_info->img_info.num_img * sizeof(int)); if (raw_info->cptr == NULL) { - for (i = 0; i < raw_info->img_info.num_img; i++) { - free(raw_info->img_info.images[i]); - } - free(raw_info->img_info.images); tsk_img_free(raw_info); return NULL; } @@ -717,10 +690,6 @@ raw_open(int a_num_img, const TSK_TCHAR * const a_images[], (TSK_OFF_T *) tsk_malloc(raw_info->img_info.num_img * sizeof(TSK_OFF_T)); if (raw_info->max_off == NULL) { free(raw_info->cptr); - for (i = 0; i < raw_info->img_info.num_img; i++) { - free(raw_info->img_info.images[i]); - } - free(raw_info->img_info.images); tsk_img_free(raw_info); return NULL; } @@ -749,10 +718,6 @@ raw_open(int a_num_img, const TSK_TCHAR * const a_images[], } } free(raw_info->cptr); - for (i = 0; i < raw_info->img_info.num_img; i++) { - free(raw_info->img_info.images[i]); - } - free(raw_info->img_info.images); tsk_img_free(raw_info); return NULL; } @@ -771,29 +736,3 @@ raw_open(int a_num_img, const TSK_TCHAR * const a_images[], return img_info; } - - -/* tsk_img_malloc - tsk_malloc, then set image tag - * This is for img module and all its inheritances - */ -void * -tsk_img_malloc(size_t a_len) -{ - TSK_IMG_INFO *imgInfo; - if ((imgInfo = (TSK_IMG_INFO *) tsk_malloc(a_len)) == NULL) - return NULL; - imgInfo->tag = TSK_IMG_INFO_TAG; - return (void *) imgInfo; -} - - -/* tsk_img_free - unset image tag, then free memory - * This is for img module and all its inheritances - */ -void -tsk_img_free(void *a_ptr) -{ - TSK_IMG_INFO *imgInfo = (TSK_IMG_INFO *) a_ptr; - imgInfo->tag = 0; - free(imgInfo); -} diff --git a/tsk/img/tsk_img_i.h b/tsk/img/tsk_img_i.h index 85b7df9e78..5759252ff6 100644 --- a/tsk/img/tsk_img_i.h +++ b/tsk/img/tsk_img_i.h @@ -37,6 +37,9 @@ extern "C" { #endif extern void *tsk_img_malloc(size_t); extern void tsk_img_free(void *); + +extern int tsk_img_copy_image_names(TSK_IMG_INFO* img_info, const TSK_TCHAR* const images[], int num); +extern void tsk_img_free_image_names(TSK_IMG_INFO* img_info); extern TSK_TCHAR **tsk_img_findFiles(const TSK_TCHAR * a_startingName, int *a_numFound); diff --git a/tsk/img/vhd.c b/tsk/img/vhd.c index 847d081ed5..0d32faabb9 100644 --- a/tsk/img/vhd.c +++ b/tsk/img/vhd.c @@ -127,11 +127,6 @@ static void tsk_error_set_errstr("vhdi_image_close: unable to free handle - %s", errmsg); } - for (i = 0; i < vhdi_info->img_info.num_img; i++) { - free(vhdi_info->img_info.images[i]); - } - free(vhdi_info->img_info.images); - tsk_deinit_lock(&(vhdi_info->read_lock)); tsk_img_free(img_info); } @@ -159,23 +154,11 @@ vhdi_open(int a_num_img, } vhdi_info->handle = NULL; img_info = (TSK_IMG_INFO *) vhdi_info; - - vhdi_info->img_info.num_img = a_num_img; - if ((vhdi_info->img_info.images = - (TSK_TCHAR **) tsk_malloc(a_num_img * - sizeof(TSK_TCHAR *))) == NULL) { - tsk_img_free(vhdi_info); - return NULL; - } - for (i = 0; i < a_num_img; i++) { - if ((vhdi_info->img_info.images[i] = - (TSK_TCHAR *) tsk_malloc((TSTRLEN(a_images[i]) + - 1) * sizeof(TSK_TCHAR))) == NULL) { - tsk_img_free(vhdi_info); - return NULL; - } - TSTRNCPY(vhdi_info->img_info.images[i], a_images[i], - TSTRLEN(a_images[i]) + 1); + + // a_num_img should be 1 + if (!tsk_img_copy_image_names(img_info, a_images, a_num_img)) { + tsk_img_free(vhdi_info); + return NULL; } if (libvhdi_file_initialize(&(vhdi_info->handle), &vhdi_error) != 1) { diff --git a/tsk/img/vmdk.c b/tsk/img/vmdk.c index 2496758aeb..85473fc457 100644 --- a/tsk/img/vmdk.c +++ b/tsk/img/vmdk.c @@ -129,11 +129,6 @@ static void tsk_error_set_errstr("vmdk_image_close: unable to free handle - %s", errmsg); } - for (i = 0; i < vmdk_info->img_info.num_img; i++) { - free(vmdk_info->img_info.images[i]); - } - free(vmdk_info->img_info.images); - tsk_deinit_lock(&(vmdk_info->read_lock)); tsk_img_free(img_info); } @@ -161,23 +156,11 @@ vmdk_open(int a_num_img, } vmdk_info->handle = NULL; img_info = (TSK_IMG_INFO *) vmdk_info; - - vmdk_info->img_info.num_img = a_num_img; - if ((vmdk_info->img_info.images = - (TSK_TCHAR **) tsk_malloc(a_num_img * - sizeof(TSK_TCHAR *))) == NULL) { - tsk_img_free(vmdk_info); - return NULL; - } - for (i = 0; i < a_num_img; i++) { - if ((vmdk_info->img_info.images[i] = - (TSK_TCHAR *) tsk_malloc((TSTRLEN(a_images[i]) + - 1) * sizeof(TSK_TCHAR))) == NULL) { - tsk_img_free(vmdk_info); - return NULL; - } - TSTRNCPY(vmdk_info->img_info.images[i], a_images[i], - TSTRLEN(a_images[i]) + 1); + + // a_num_img should be 1 + if (!tsk_img_copy_image_names(img_info, a_images, a_num_img)) { + tsk_img_free(vmdk_info); + return NULL; } if (libvmdk_handle_initialize(&(vmdk_info->handle), &vmdk_error) != 1) { From 34eb908765ac4a1d230633e194cac901049ce559 Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Fri, 12 Jul 2019 15:53:32 +0100 Subject: [PATCH 0107/1548] Move error freeing into getError(). It's silly to repeat it (and potentially miss one) everywhere. --- tsk/img/vhd.c | 9 ++------- tsk/img/vmdk.c | 9 ++------- 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/tsk/img/vhd.c b/tsk/img/vhd.c index 0d32faabb9..719390582d 100644 --- a/tsk/img/vhd.c +++ b/tsk/img/vhd.c @@ -31,9 +31,8 @@ getError(libvhdi_error_t * vhdi_error, error_string[0] = '\0'; retval = libvhdi_error_backtrace_sprint(vhdi_error, error_string, TSK_VHDI_ERROR_STRING_SIZE); - if (retval) - return 1; - return 0; + libvhdi_error_free(&vhdi_error); + return retval ? 1 : 0; } @@ -168,7 +167,6 @@ vhdi_open(int a_num_img, getError(vhdi_error, error_string); tsk_error_set_errstr("vhdi_open file: %" PRIttocTSK ": Error initializing handle (%s)", a_images[0], error_string); - libvhdi_error_free(&vhdi_error); tsk_img_free(vhdi_info); @@ -191,7 +189,6 @@ vhdi_open(int a_num_img, tsk_error_set_errstr("vhdi_open file: %" PRIttocTSK ": Error checking file signature for image (%s)", a_images[0], error_string); - libvhdi_error_free(&vhdi_error); tsk_img_free(vhdi_info); @@ -216,7 +213,6 @@ vhdi_open(int a_num_img, getError(vhdi_error, error_string); tsk_error_set_errstr("vhdi_open file: %" PRIttocTSK ": Error opening (%s)", a_images[0], error_string); - libvhdi_error_free(&vhdi_error); tsk_img_free(vhdi_info); @@ -234,7 +230,6 @@ vhdi_open(int a_num_img, tsk_error_set_errstr("vhdi_open file: %" PRIttocTSK ": Error getting size of image (%s)", a_images[0], error_string); - libvhdi_error_free(&vhdi_error); tsk_img_free(vhdi_info); diff --git a/tsk/img/vmdk.c b/tsk/img/vmdk.c index 85473fc457..b2edfb3164 100644 --- a/tsk/img/vmdk.c +++ b/tsk/img/vmdk.c @@ -31,9 +31,8 @@ getError(libvmdk_error_t * vmdk_error, error_string[0] = '\0'; retval = libvmdk_error_backtrace_sprint(vmdk_error, error_string, TSK_VMDK_ERROR_STRING_SIZE); - if (retval) - return 1; - return 0; + libvmdk_error_free(&vmdk_error); + return retval ? 1 : 0; } @@ -170,7 +169,6 @@ vmdk_open(int a_num_img, getError(vmdk_error, error_string); tsk_error_set_errstr("vmdk_open file: %" PRIttocTSK ": Error initializing handle (%s)", a_images[0], error_string); - libvmdk_error_free(&vmdk_error); tsk_img_free(vmdk_info); @@ -195,7 +193,6 @@ vmdk_open(int a_num_img, getError(vmdk_error, error_string); tsk_error_set_errstr("vmdk_open file: %" PRIttocTSK ": Error opening (%s)", a_images[0], error_string); - libvmdk_error_free(&vmdk_error); tsk_img_free(vmdk_info); @@ -213,7 +210,6 @@ vmdk_open(int a_num_img, tsk_error_set_errstr("vmdk_open file: %" PRIttocTSK ": Error opening extent data files for image (%s)", a_images[0], error_string); - libvmdk_error_free(&vmdk_error); tsk_img_free(vmdk_info); @@ -231,7 +227,6 @@ vmdk_open(int a_num_img, tsk_error_set_errstr("vmdk_open file: %" PRIttocTSK ": Error getting size of image (%s)", a_images[0], error_string); - libvmdk_error_free(&vmdk_error); tsk_img_free(vmdk_info); From 504e56f4a0387ae99d8d26ac0938b8bf39f25c67 Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Fri, 12 Jul 2019 16:17:09 +0100 Subject: [PATCH 0108/1548] Remove redundant free calls. --- tsk/img/vhd.c | 3 +-- tsk/img/vmdk.c | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/tsk/img/vhd.c b/tsk/img/vhd.c index 719390582d..3290e9eece 100644 --- a/tsk/img/vhd.c +++ b/tsk/img/vhd.c @@ -114,8 +114,7 @@ static void tsk_error_set_errstr("vhdi_image_close: unable to close handle - %s", errmsg); } - libvhdi_file_free(&(vhdi_info->handle), NULL); - if (libvhdi_file_free(&(vhdi_info->handle), &vhdi_error ) != 1) { + if (libvhdi_file_free(&(vhdi_info->handle), &vhdi_error) != 1) { tsk_error_reset(); tsk_error_set_errno(TSK_ERR_AUX_GENERIC); if (getError(vhdi_error, error_string)) diff --git a/tsk/img/vmdk.c b/tsk/img/vmdk.c index b2edfb3164..6f8bce4d41 100644 --- a/tsk/img/vmdk.c +++ b/tsk/img/vmdk.c @@ -116,8 +116,7 @@ static void tsk_error_set_errstr("vmdk_image_close: unable to close handle - %s", errmsg); } - libvmdk_handle_free(&(vmdk_info->handle), NULL); - if (libvmdk_handle_free(&(vmdk_info->handle), &vmdk_error ) != 1) { + if (libvmdk_handle_free(&(vmdk_info->handle), &vmdk_error) != 1) { tsk_error_reset(); tsk_error_set_errno(TSK_ERR_AUX_GENERIC); if (getError(vmdk_error, error_string)) From eb72448fbfb23b07aec1a890f32af2930a881c8b Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Fri, 12 Jul 2019 16:52:51 +0100 Subject: [PATCH 0109/1548] Fixed memory leaks: EWF, VMDK, VHD handles must be freed if opening fails after handle initialization. --- tsk/img/ewf.cpp | 3 +++ tsk/img/vhd.c | 5 ++++- tsk/img/vmdk.c | 5 ++++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/tsk/img/ewf.cpp b/tsk/img/ewf.cpp index 5ce35771f6..697a01c823 100644 --- a/tsk/img/ewf.cpp +++ b/tsk/img/ewf.cpp @@ -343,6 +343,7 @@ ewf_open(int a_num_img, tsk_error_set_errstr("ewf_open file: %" PRIttocTSK ": Error opening (%s)", a_images[0], error_string); + libewf_handle_free(&(ewf_info->handle), NULL); tsk_img_free(ewf_info); if (tsk_verbose != 0) { @@ -360,6 +361,7 @@ ewf_open(int a_num_img, ": Error getting size of image (%s)", a_images[0], error_string); + libewf_handle_free(&(ewf_info->handle), NULL); tsk_img_free(ewf_info); if (tsk_verbose != 0) { @@ -379,6 +381,7 @@ ewf_open(int a_num_img, ": Error getting MD5 of image (%s)", a_images[0], error_string); + libewf_handle_free(&(ewf_info->handle), NULL); tsk_img_free(ewf_info); if (tsk_verbose != 0) { diff --git a/tsk/img/vhd.c b/tsk/img/vhd.c index 3290e9eece..c32df8b91c 100644 --- a/tsk/img/vhd.c +++ b/tsk/img/vhd.c @@ -103,7 +103,7 @@ static void char *errmsg = NULL; IMG_VHDI_INFO *vhdi_info = (IMG_VHDI_INFO *) img_info; - if (libvhdi_file_close(vhdi_info->handle, &vhdi_error ) != 0) { + if (libvhdi_file_close(vhdi_info->handle, &vhdi_error) != 0) { tsk_error_reset(); tsk_error_set_errno(TSK_ERR_AUX_GENERIC); if (getError(vhdi_error, error_string)) @@ -189,6 +189,7 @@ vhdi_open(int a_num_img, ": Error checking file signature for image (%s)", a_images[0], error_string); + libvhdi_file_free(&(vhdi_info->handle), NULL); tsk_img_free(vhdi_info); if (tsk_verbose != 0) { @@ -213,6 +214,7 @@ vhdi_open(int a_num_img, tsk_error_set_errstr("vhdi_open file: %" PRIttocTSK ": Error opening (%s)", a_images[0], error_string); + libvhdi_file_free(&(vhdi_info->handle), NULL); tsk_img_free(vhdi_info); if (tsk_verbose != 0) { @@ -230,6 +232,7 @@ vhdi_open(int a_num_img, ": Error getting size of image (%s)", a_images[0], error_string); + libvhdi_file_free(&(vhdi_info->handle), NULL); tsk_img_free(vhdi_info); if (tsk_verbose != 0) { diff --git a/tsk/img/vmdk.c b/tsk/img/vmdk.c index 6f8bce4d41..112fc31b39 100644 --- a/tsk/img/vmdk.c +++ b/tsk/img/vmdk.c @@ -105,7 +105,7 @@ static void char *errmsg = NULL; IMG_VMDK_INFO *vmdk_info = (IMG_VMDK_INFO *) img_info; - if (libvmdk_handle_close(vmdk_info->handle, &vmdk_error ) != 0) { + if (libvmdk_handle_close(vmdk_info->handle, &vmdk_error) != 0) { tsk_error_reset(); tsk_error_set_errno(TSK_ERR_AUX_GENERIC); if (getError(vmdk_error, error_string)) @@ -193,6 +193,7 @@ vmdk_open(int a_num_img, tsk_error_set_errstr("vmdk_open file: %" PRIttocTSK ": Error opening (%s)", a_images[0], error_string); + libvmdk_handle_free(&(vmdk_info->handle), NULL); tsk_img_free(vmdk_info); if (tsk_verbose != 0) { @@ -210,6 +211,7 @@ vmdk_open(int a_num_img, ": Error opening extent data files for image (%s)", a_images[0], error_string); + libvmdk_handle_free(&(vmdk_info->handle), NULL); tsk_img_free(vmdk_info); if (tsk_verbose != 0) { @@ -227,6 +229,7 @@ vmdk_open(int a_num_img, ": Error getting size of image (%s)", a_images[0], error_string); + libvmdk_handle_free(&(vmdk_info->handle), NULL); tsk_img_free(vmdk_info); if (tsk_verbose != 0) { From 7c4643cf54cc7baba6a8a3c487c4dadc2cfc5aef Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Tue, 16 Jul 2019 14:59:41 +0100 Subject: [PATCH 0110/1548] DRY: Cleaned up image opening error handling. --- tsk/img/aff.c | 38 ++++++++++----------- tsk/img/ewf.cpp | 90 ++++++++++++++++++++++++++----------------------- tsk/img/raw.c | 30 +++++++---------- tsk/img/vhd.c | 30 +++++++---------- tsk/img/vmdk.c | 30 +++++++---------- 5 files changed, 104 insertions(+), 114 deletions(-) diff --git a/tsk/img/aff.c b/tsk/img/aff.c index e4f696045b..f6d760a13b 100644 --- a/tsk/img/aff.c +++ b/tsk/img/aff.c @@ -227,7 +227,7 @@ aff_open(const TSK_TCHAR * const images[], unsigned int a_ssize) IMG_AFF_INFO *aff_info; TSK_IMG_INFO *img_info; int type; - char *image; + char *image = NULL; #ifdef TSK_WIN32 // convert wchar_t* image path to char* to conform to @@ -235,11 +235,13 @@ aff_open(const TSK_TCHAR * const images[], unsigned int a_ssize) UTF16 *utf16 = (UTF16 *) images[0]; size_t ilen = wcslen(utf16); size_t olen = ilen * 4 + 1; + UTF8 *utf8 = (UTF8 *) tsk_malloc(olen); + if (utf8 == NULL) { + return NULL; + } image = (char *) utf8; - if (image == NULL) - return NULL; TSKConversionResult retval = tsk_UTF16toUTF8_lclorder((const UTF16 **) &utf16, &utf16[ilen], &utf8, @@ -250,8 +252,7 @@ aff_open(const TSK_TCHAR * const images[], unsigned int a_ssize) tsk_error_set_errno(TSK_ERR_FS_UNICODE); tsk_error_set_errstr("aff_open file: %" PRIttocTSK ": Error converting path to UTF-8 %d\n", images[0], retval); - free(image); - return NULL; + goto on_error; } utf8 = (UTF8 *) image; while (*utf8) { @@ -261,8 +262,7 @@ aff_open(const TSK_TCHAR * const images[], unsigned int a_ssize) tsk_error_set_errstr("aff_open file: %" PRIttocTSK ": Non-Latin paths are not supported for AFF images\n", images[0]); - free(image); - return NULL; + goto on_error; } utf8++; } @@ -276,8 +276,7 @@ aff_open(const TSK_TCHAR * const images[], unsigned int a_ssize) if ((aff_info = (IMG_AFF_INFO *) tsk_img_malloc(sizeof(IMG_AFF_INFO))) == NULL) { - free(image); - return NULL; + goto on_error; } img_info = (TSK_IMG_INFO *) aff_info; @@ -290,9 +289,7 @@ aff_open(const TSK_TCHAR * const images[], unsigned int a_ssize) // a_num_img should be 1 if (!tsk_img_copy_image_names(img_info, a_images, a_num_img)) { - tsk_img_free(aff_info); - free(image); - return NULL; + goto on_error; } img_info->sector_size = 512; @@ -311,9 +308,7 @@ aff_open(const TSK_TCHAR * const images[], unsigned int a_ssize) tsk_error_set_errno(TSK_ERR_IMG_OPEN); tsk_error_set_errstr("aff_open file: %" PRIttocTSK ": Error checking type", images[0]); - tsk_img_free(aff_info); - free(image); - return NULL; + goto on_error; } else if (type == AF_IDENTIFY_AFF) { img_info->itype = TSK_IMG_TYPE_AFF_AFF; @@ -335,26 +330,22 @@ aff_open(const TSK_TCHAR * const images[], unsigned int a_ssize) tsk_error_set_errno(TSK_ERR_IMG_OPEN); tsk_error_set_errstr("aff_open file: %" PRIttocTSK ": Error opening - %s", images[0], strerror(errno)); - tsk_img_free(aff_info); if (tsk_verbose) { tsk_fprintf(stderr, "Error opening AFF/AFD/AFM file\n"); perror("aff_open"); } - free(image); - return NULL; + goto on_error; } // verify that a password was given and we can read encrypted data. if (af_cannot_decrypt(aff_info->af_file)) { tsk_error_reset(); tsk_error_set_errno(TSK_ERR_IMG_PASSWD); tsk_error_set_errstr("aff_open file: %" PRIttocTSK, images[0]); - tsk_img_free(aff_info); if (tsk_verbose) { tsk_fprintf(stderr, "Error opening AFF/AFD/AFM file (incorrect password)\n"); } - free(image); - return NULL; + goto on_error; } aff_info->type = type; @@ -365,5 +356,10 @@ aff_open(const TSK_TCHAR * const images[], unsigned int a_ssize) aff_info->seek_pos = 0; free(image); return img_info; + +on_error: + free(image); + tsk_img_free(aff_info); + return NULL; } #endif diff --git a/tsk/img/ewf.cpp b/tsk/img/ewf.cpp index 697a01c823..ff89af5757 100644 --- a/tsk/img/ewf.cpp +++ b/tsk/img/ewf.cpp @@ -119,17 +119,7 @@ ewf_image_imgstat(TSK_IMG_INFO * img_info, FILE * hFile) } static void -ewf_image_close(TSK_IMG_INFO * img_info) -{ - IMG_EWF_INFO *ewf_info = (IMG_EWF_INFO *) img_info; - -#if defined ( HAVE_LIBEWF_V2_API) - libewf_handle_close(ewf_info->handle, NULL); - libewf_handle_free(&(ewf_info->handle), NULL); -#else - libewf_close(ewf_info->handle); -#endif - +ewf_glob_free(IMG_EWF_INFO* ewf_info) { // Freeing img_info->images ourselves is incorrect if we used glob. // v2 of the API has a free method. It's not clear from the docs what we // should do in v1... @@ -145,9 +135,24 @@ ewf_image_close(TSK_IMG_INFO * img_info) libewf_error_free(&error); #endif // ensure that tsk_img_free() does not double free images - img_info->images = NULL; - img_info->num_img = 0; + ewf_info->img_info.images = NULL; + ewf_info->img_info.num_img = 0; } +} + +static void +ewf_image_close(TSK_IMG_INFO * img_info) +{ + IMG_EWF_INFO *ewf_info = (IMG_EWF_INFO *) img_info; + +#if defined ( HAVE_LIBEWF_V2_API) + libewf_handle_close(ewf_info->handle, NULL); + libewf_handle_free(&(ewf_info->handle), NULL); +#else + libewf_close(ewf_info->handle); +#endif + + ewf_glob_free(ewf_info); tsk_deinit_lock(&(ewf_info->read_lock)); tsk_img_free(ewf_info); @@ -225,6 +230,7 @@ ewf_open(int a_num_img, NULL) { return NULL; } + ewf_info->handle = NULL; img_info = (TSK_IMG_INFO *) ewf_info; // See if they specified only the first of the set... @@ -247,8 +253,7 @@ ewf_open(int a_num_img, getError(ewf_error, error_string); tsk_error_set_errstr("ewf_open: Not an E01 glob name (%s)", error_string); - tsk_img_free(ewf_info); - return NULL; + goto on_error; } #else //use v1 @@ -266,9 +271,7 @@ ewf_open(int a_num_img, tsk_error_reset(); tsk_error_set_errno(TSK_ERR_IMG_MAGIC); tsk_error_set_errstr("ewf_open: Not an E01 glob name"); - - tsk_img_free(ewf_info); - return NULL; + goto on_error; } #endif // end v1 @@ -280,8 +283,7 @@ ewf_open(int a_num_img, } else { if (!tsk_img_copy_image_names(img_info, a_images, a_num_img)) { - tsk_img_free(ewf_info); - return NULL; + goto on_error; } } @@ -302,12 +304,10 @@ ewf_open(int a_num_img, tsk_error_set_errstr("ewf_open: Not an EWF file (%s)", error_string); - tsk_img_free(ewf_info); - if (tsk_verbose != 0) { tsk_fprintf(stderr, "Not an EWF file\n"); } - return NULL; + goto on_error; } if (libewf_handle_initialize(&(ewf_info->handle), &ewf_error) != 1) { @@ -318,12 +318,10 @@ ewf_open(int a_num_img, tsk_error_set_errstr("ewf_open file: %" PRIttocTSK ": Error initializing handle (%s)", a_images[0], error_string); - tsk_img_free(ewf_info); - if (tsk_verbose != 0) { tsk_fprintf(stderr, "Unable to create EWF handle\n"); } - return NULL; + goto on_error; } #if defined( TSK_WIN32 ) is_error = (libewf_handle_open_wide(ewf_info->handle, @@ -343,13 +341,10 @@ ewf_open(int a_num_img, tsk_error_set_errstr("ewf_open file: %" PRIttocTSK ": Error opening (%s)", a_images[0], error_string); - libewf_handle_free(&(ewf_info->handle), NULL); - tsk_img_free(ewf_info); - if (tsk_verbose != 0) { tsk_fprintf(stderr, "Error opening EWF file\n"); } - return NULL; + goto on_error; } if (libewf_handle_get_media_size(ewf_info->handle, (size64_t *) & (img_info->size), &ewf_error) != 1) { @@ -361,13 +356,12 @@ ewf_open(int a_num_img, ": Error getting size of image (%s)", a_images[0], error_string); - libewf_handle_free(&(ewf_info->handle), NULL); - tsk_img_free(ewf_info); + libewf_handle_close(ewf_info->handle, NULL); if (tsk_verbose != 0) { tsk_fprintf(stderr, "Error getting size of EWF file\n"); } - return NULL; + goto on_error; } result = libewf_handle_get_utf8_hash_value_md5(ewf_info->handle, (uint8_t *) ewf_info->md5hash, 33, &ewf_error); @@ -381,13 +375,12 @@ ewf_open(int a_num_img, ": Error getting MD5 of image (%s)", a_images[0], error_string); - libewf_handle_free(&(ewf_info->handle), NULL); - tsk_img_free(ewf_info); + libewf_handle_close(ewf_info->handle, NULL); if (tsk_verbose != 0) { tsk_fprintf(stderr, "Error getting MD5 of EWF file\n"); } - return NULL; + goto on_error; } ewf_info->md5hash_isset = result; @@ -427,11 +420,10 @@ ewf_open(int a_num_img, tsk_error_reset(); tsk_error_set_errno(TSK_ERR_IMG_MAGIC); tsk_error_set_errstr("ewf_open: Not an EWF file"); - tsk_img_free(ewf_info); if (tsk_verbose) tsk_fprintf(stderr, "Not an EWF file\n"); - return NULL; + goto on_error; } #if defined( TSK_WIN32 ) @@ -448,12 +440,11 @@ ewf_open(int a_num_img, tsk_error_set_errno(TSK_ERR_IMG_OPEN); tsk_error_set_errstr("ewf_open file: %" PRIttocTSK ": Error opening", ewf_info->img_info.images[0]); - tsk_img_free(ewf_info); if (tsk_verbose != 0) { tsk_fprintf(stderr, "Error opening EWF file\n"); } - return NULL; + goto on_error; } #if defined( LIBEWF_STRING_DIGEST_HASH_LENGTH_MD5 ) // 2007 version @@ -469,11 +460,11 @@ ewf_open(int a_num_img, tsk_error_set_errno(TSK_ERR_IMG_OPEN); tsk_error_set_errstr("ewf_open file: %" PRIttocTSK ": Error getting size of image", ewf_info->img_info.images[0]); - tsk_img_free(ewf_info); + if (tsk_verbose) { tsk_fprintf(stderr, "Error getting size of EWF file\n"); } - return NULL; + goto on_error; } if (libewf_get_md5_hash(ewf_info->handle, md5_hash, 16) == 1) { int md5_string_iterator = 0; @@ -549,6 +540,21 @@ ewf_open(int a_num_img, tsk_init_lock(&(ewf_info->read_lock)); return img_info; + +on_error: + if (ewf_info->handle) { +#if defined( HAVE_LIBEWF_V2_API ) + libewf_handle_close(ewf_info->handle, NULL); +#else + libewf_close(ewf_info->handle); +#endif + } +#if defined( HAVE_LIBEWF_V2_API ) + libewf_handle_free(&(ewf_info->handle), NULL); +#endif + ewf_glob_free(ewf_info); + tsk_img_free(ewf_info); + return NULL; } diff --git a/tsk/img/raw.c b/tsk/img/raw.c index 9d9279a9b3..bfd23a04e3 100644 --- a/tsk/img/raw.c +++ b/tsk/img/raw.c @@ -601,6 +601,7 @@ raw_open(int a_num_img, const TSK_TCHAR * const a_images[], (IMG_RAW_INFO *) tsk_img_malloc(sizeof(IMG_RAW_INFO))) == NULL) return NULL; + raw_info->cptr = NULL; img_info = (TSK_IMG_INFO *) raw_info; img_info->itype = TSK_IMG_TYPE_RAW; @@ -623,8 +624,7 @@ raw_open(int a_num_img, const TSK_TCHAR * const a_images[], /* Check that the first image file exists and is not a directory */ first_seg_size = get_size_of_file_on_disk(a_images[0], raw_info->is_winobj); if (first_seg_size < -1) { - tsk_img_free(raw_info); - return NULL; + goto on_error; } /* Set the sector size */ @@ -651,14 +651,12 @@ raw_open(int a_num_img, const TSK_TCHAR * const a_images[], tsk_error_set_errstr ("raw_open: could not find segment files starting at \"%" PRIttocTSK "\"", a_images[0]); - tsk_img_free(raw_info); - return NULL; + goto on_error; } } else { if (!tsk_img_copy_image_names(img_info, a_images, a_num_img)) { - tsk_img_free(raw_info); - return NULL; + goto on_error; } } @@ -669,16 +667,13 @@ raw_open(int a_num_img, const TSK_TCHAR * const a_images[], tsk_fprintf(stderr, "raw_open: file size is unknown in a segmented raw image\n"); } - - tsk_img_free(raw_info); - return NULL; + goto on_error; } /* initialize the split cache */ raw_info->cptr = (int *) tsk_malloc(raw_info->img_info.num_img * sizeof(int)); if (raw_info->cptr == NULL) { - tsk_img_free(raw_info); - return NULL; + goto on_error; } memset((void *) &raw_info->cache, 0, SPLIT_CACHE * sizeof(IMG_SPLIT_CACHE)); @@ -689,9 +684,7 @@ raw_open(int a_num_img, const TSK_TCHAR * const a_images[], raw_info->max_off = (TSK_OFF_T *) tsk_malloc(raw_info->img_info.num_img * sizeof(TSK_OFF_T)); if (raw_info->max_off == NULL) { - free(raw_info->cptr); - tsk_img_free(raw_info); - return NULL; + goto on_error; } img_info->size = first_seg_size; raw_info->max_off[0] = img_info->size; @@ -717,9 +710,7 @@ raw_open(int a_num_img, const TSK_TCHAR * const a_images[], "raw_open: file size is unknown in a segmented raw image\n"); } } - free(raw_info->cptr); - tsk_img_free(raw_info); - return NULL; + goto on_error; } /* add the size of this image to the total and save the current max */ @@ -735,4 +726,9 @@ raw_open(int a_num_img, const TSK_TCHAR * const a_images[], } return img_info; + +on_error: + free(raw_info->cptr); + tsk_img_free(raw_info); + return NULL; } diff --git a/tsk/img/vhd.c b/tsk/img/vhd.c index c32df8b91c..09cc187b55 100644 --- a/tsk/img/vhd.c +++ b/tsk/img/vhd.c @@ -155,8 +155,7 @@ vhdi_open(int a_num_img, // a_num_img should be 1 if (!tsk_img_copy_image_names(img_info, a_images, a_num_img)) { - tsk_img_free(vhdi_info); - return NULL; + goto on_error; } if (libvhdi_file_initialize(&(vhdi_info->handle), &vhdi_error) != 1) { @@ -167,12 +166,10 @@ vhdi_open(int a_num_img, tsk_error_set_errstr("vhdi_open file: %" PRIttocTSK ": Error initializing handle (%s)", a_images[0], error_string); - tsk_img_free(vhdi_info); - if (tsk_verbose != 0) { tsk_fprintf(stderr, "Unable to create vhdi handle\n"); } - return NULL; + goto on_error; } // Check the file signature before we call the library open #if defined( TSK_WIN32 ) @@ -189,13 +186,10 @@ vhdi_open(int a_num_img, ": Error checking file signature for image (%s)", a_images[0], error_string); - libvhdi_file_free(&(vhdi_info->handle), NULL); - tsk_img_free(vhdi_info); - if (tsk_verbose != 0) { tsk_fprintf(stderr, "Error checking file signature for vhd file\n"); } - return NULL; + goto on_error; } #if defined( TSK_WIN32 ) if (libvhdi_file_open_wide(vhdi_info->handle, @@ -214,13 +208,10 @@ vhdi_open(int a_num_img, tsk_error_set_errstr("vhdi_open file: %" PRIttocTSK ": Error opening (%s)", a_images[0], error_string); - libvhdi_file_free(&(vhdi_info->handle), NULL); - tsk_img_free(vhdi_info); - if (tsk_verbose != 0) { tsk_fprintf(stderr, "Error opening vhdi file\n"); } - return NULL; + goto on_error; } if (libvhdi_file_get_media_size(vhdi_info->handle, (size64_t *) & (img_info->size), &vhdi_error) != 1) { @@ -232,13 +223,10 @@ vhdi_open(int a_num_img, ": Error getting size of image (%s)", a_images[0], error_string); - libvhdi_file_free(&(vhdi_info->handle), NULL); - tsk_img_free(vhdi_info); - if (tsk_verbose != 0) { tsk_fprintf(stderr, "Error getting size of vhdi file\n"); } - return NULL; + goto on_error; } if (a_ssize != 0) { @@ -256,6 +244,14 @@ vhdi_open(int a_num_img, tsk_init_lock(&(vhdi_info->read_lock)); return img_info; + +on_error: + if (vhdi_info->handle) { + libvhdi_file_close(vhdi_info->handle, NULL); + } + libvhdi_file_free(&(vhdi_info->handle), NULL); + tsk_img_free(vhdi_info); + return NULL; } #endif /* HAVE_LIBVHDI */ diff --git a/tsk/img/vmdk.c b/tsk/img/vmdk.c index 112fc31b39..c50d641f80 100644 --- a/tsk/img/vmdk.c +++ b/tsk/img/vmdk.c @@ -157,8 +157,7 @@ vmdk_open(int a_num_img, // a_num_img should be 1 if (!tsk_img_copy_image_names(img_info, a_images, a_num_img)) { - tsk_img_free(vmdk_info); - return NULL; + goto on_error; } if (libvmdk_handle_initialize(&(vmdk_info->handle), &vmdk_error) != 1) { @@ -169,12 +168,10 @@ vmdk_open(int a_num_img, tsk_error_set_errstr("vmdk_open file: %" PRIttocTSK ": Error initializing handle (%s)", a_images[0], error_string); - tsk_img_free(vmdk_info); - if (tsk_verbose != 0) { tsk_fprintf(stderr, "Unable to create vmdk handle\n"); } - return NULL; + goto on_error; } #if defined( TSK_WIN32 ) if (libvmdk_handle_open_wide(vmdk_info->handle, @@ -193,13 +190,10 @@ vmdk_open(int a_num_img, tsk_error_set_errstr("vmdk_open file: %" PRIttocTSK ": Error opening (%s)", a_images[0], error_string); - libvmdk_handle_free(&(vmdk_info->handle), NULL); - tsk_img_free(vmdk_info); - if (tsk_verbose != 0) { tsk_fprintf(stderr, "Error opening vmdk file\n"); } - return NULL; + goto on_error; } if (libvmdk_handle_open_extent_data_files(vmdk_info->handle, &vmdk_error) != 1) { @@ -211,13 +205,10 @@ vmdk_open(int a_num_img, ": Error opening extent data files for image (%s)", a_images[0], error_string); - libvmdk_handle_free(&(vmdk_info->handle), NULL); - tsk_img_free(vmdk_info); - if (tsk_verbose != 0) { tsk_fprintf(stderr, "Error opening vmdk extent data files\n"); } - return NULL; + goto on_error; } if (libvmdk_handle_get_media_size(vmdk_info->handle, (size64_t *) & (img_info->size), &vmdk_error) != 1) { @@ -229,13 +220,10 @@ vmdk_open(int a_num_img, ": Error getting size of image (%s)", a_images[0], error_string); - libvmdk_handle_free(&(vmdk_info->handle), NULL); - tsk_img_free(vmdk_info); - if (tsk_verbose != 0) { tsk_fprintf(stderr, "Error getting size of vmdk file\n"); } - return NULL; + goto on_error; } if (a_ssize != 0) { @@ -253,6 +241,14 @@ vmdk_open(int a_num_img, tsk_init_lock(&(vmdk_info->read_lock)); return img_info; + +on_error: + if (vmdk_info->handle) { + libvmdk_handle_close(vmdk_info->handle, NULL); + } + libvmdk_handle_free(&(vmdk_info->handle), NULL); + tsk_img_free(vmdk_info); + return NULL; } #endif /* HAVE_LIBVMDK */ From 5e67022ca83887cbd3f2cabd0b34fe7d8480c549 Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Tue, 16 Jul 2019 15:01:47 +0100 Subject: [PATCH 0111/1548] Don't store an error we intend to ignore. --- tsk/img/ewf.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/tsk/img/ewf.cpp b/tsk/img/ewf.cpp index ff89af5757..f464147e69 100644 --- a/tsk/img/ewf.cpp +++ b/tsk/img/ewf.cpp @@ -126,13 +126,11 @@ ewf_glob_free(IMG_EWF_INFO* ewf_info) { // @@@ Probably a memory leak in v1 unless libewf_close deals with it if (ewf_info->used_ewf_glob != 0) { #if defined ( HAVE_LIBEWF_V2_API) - libewf_error_t *error = NULL; #ifdef TSK_WIN32 - libewf_glob_wide_free(ewf_info->img_info.images, ewf_info->img_info.num_img, &error); + libewf_glob_wide_free(ewf_info->img_info.images, ewf_info->img_info.num_img, NULL); #else - libewf_glob_free(ewf_info->img_info.images, ewf_info->img_info.num_img, &error); + libewf_glob_free(ewf_info->img_info.images, ewf_info->img_info.num_img, NULL); #endif - libewf_error_free(&error); #endif // ensure that tsk_img_free() does not double free images ewf_info->img_info.images = NULL; From 8ca07e3c98177ca24057af20417a367e39ed9dd6 Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Tue, 16 Jul 2019 15:22:08 +0100 Subject: [PATCH 0112/1548] Remove old code freeing images array now that tsk_img_free() does it. --- tsk/img/raw.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tsk/img/raw.c b/tsk/img/raw.c index bfd23a04e3..cfa896cab1 100644 --- a/tsk/img/raw.c +++ b/tsk/img/raw.c @@ -451,11 +451,8 @@ raw_close(TSK_IMG_INFO * img_info) close(raw_info->cache[i].fd); #endif } - for (i = 0; i < raw_info->img_info.num_img; i++) { - free(raw_info->img_info.images[i]); - } + free(raw_info->max_off); - free(raw_info->img_info.images); free(raw_info->cptr); tsk_img_free(raw_info); From 16d5d94f11240f984045fa6019da669b393b1e77 Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Tue, 16 Jul 2019 16:02:19 +0100 Subject: [PATCH 0113/1548] Don't leak the af_file. --- tsk/img/aff.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tsk/img/aff.c b/tsk/img/aff.c index f6d760a13b..f0cc2c2bf0 100644 --- a/tsk/img/aff.c +++ b/tsk/img/aff.c @@ -278,6 +278,7 @@ aff_open(const TSK_TCHAR * const images[], unsigned int a_ssize) NULL) { goto on_error; } + aff_info->af_file = NULL; img_info = (TSK_IMG_INFO *) aff_info; img_info->read = aff_read; @@ -359,6 +360,9 @@ aff_open(const TSK_TCHAR * const images[], unsigned int a_ssize) on_error: free(image); + if (af_file) { + af_close(aff_info->af_file); + } tsk_img_free(aff_info); return NULL; } From 91dd079bca9f36d9845dd71b5de67c76d71517f2 Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Tue, 16 Jul 2019 13:45:46 +0100 Subject: [PATCH 0114/1548] * tsk_img_open() now errors out if num_img < 0 * tsk_img_open() now errors out if num_img != 1 for AFF, QCOW, VHD, VMDK. --- tsk/img/aff.c | 12 +++++++++++- tsk/img/img_open.cpp | 11 +++++++++-- tsk/img/vhd.c | 11 ++++++++++- tsk/img/vmdk.c | 11 ++++++++++- 4 files changed, 40 insertions(+), 5 deletions(-) diff --git a/tsk/img/aff.c b/tsk/img/aff.c index f0cc2c2bf0..1dc3d0cb9f 100644 --- a/tsk/img/aff.c +++ b/tsk/img/aff.c @@ -222,8 +222,18 @@ aff_close(TSK_IMG_INFO * img_info) TSK_IMG_INFO * -aff_open(const TSK_TCHAR * const images[], unsigned int a_ssize) +aff_open(int a_num_img, const TSK_TCHAR * const images[], unsigned int a_ssize) { + if (a_num_img != 1) { + tsk_error_set_errstr("aff_open file: %" PRIttocTSK + ": expected one image filename, was given %d", a_images[0], a_num_img); + + if (tsk_verbose != 0) { + tsk_fprintf(stderr, "aff requires exactly 1 image filename for opening\n"); + } + return NULL; + } + IMG_AFF_INFO *aff_info; TSK_IMG_INFO *img_info; int type; diff --git a/tsk/img/img_open.cpp b/tsk/img/img_open.cpp index a99519333e..a9c43e28ff 100644 --- a/tsk/img/img_open.cpp +++ b/tsk/img/img_open.cpp @@ -92,6 +92,13 @@ tsk_img_open(int num_img, return NULL; } + if (num_img < 0) { + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_IMG_ARG); + tsk_error_set_errstr("number of images is negative (%d)", num_img); + return NULL; + } + if ((a_ssize > 0) && (a_ssize < 512)) { tsk_error_reset(); tsk_error_set_errno(TSK_ERR_IMG_ARG); @@ -131,7 +138,7 @@ tsk_img_open(int num_img, /* Try the non-raw formats first */ #if HAVE_LIBAFFLIB - if ((img_info = aff_open(images, a_ssize)) != NULL) { + if ((img_info = aff_open(num_img, images, a_ssize)) != NULL) { /* we don't allow the "ANY" when autodetect is used because * we only want to detect the tested formats. */ if (img_info->itype == TSK_IMG_TYPE_AFF_ANY) { @@ -244,7 +251,7 @@ tsk_img_open(int num_img, case TSK_IMG_TYPE_AFF_AFD: case TSK_IMG_TYPE_AFF_AFM: case TSK_IMG_TYPE_AFF_ANY: - img_info = aff_open(images, a_ssize); + img_info = aff_open(num_img, images, a_ssize); break; #endif diff --git a/tsk/img/vhd.c b/tsk/img/vhd.c index 09cc187b55..b0a87c3a39 100644 --- a/tsk/img/vhd.c +++ b/tsk/img/vhd.c @@ -133,6 +133,16 @@ TSK_IMG_INFO * vhdi_open(int a_num_img, const TSK_TCHAR * const a_images[], unsigned int a_ssize) { + if (a_num_img != 1) { + tsk_error_set_errstr("vhdi_open file: %" PRIttocTSK + ": expected one image filename, was given %d", a_images[0], a_num_img); + + if (tsk_verbose != 0) { + tsk_fprintf(stderr, "vhd requires exactly 1 image filename for opening\n"); + } + return NULL; + } + char error_string[TSK_VHDI_ERROR_STRING_SIZE]; libvhdi_error_t *vhdi_error = NULL; int i; @@ -153,7 +163,6 @@ vhdi_open(int a_num_img, vhdi_info->handle = NULL; img_info = (TSK_IMG_INFO *) vhdi_info; - // a_num_img should be 1 if (!tsk_img_copy_image_names(img_info, a_images, a_num_img)) { goto on_error; } diff --git a/tsk/img/vmdk.c b/tsk/img/vmdk.c index c50d641f80..63bd632a94 100644 --- a/tsk/img/vmdk.c +++ b/tsk/img/vmdk.c @@ -135,6 +135,16 @@ TSK_IMG_INFO * vmdk_open(int a_num_img, const TSK_TCHAR * const a_images[], unsigned int a_ssize) { + if (a_num_img != 1) { + tsk_error_set_errstr("vmdk_open file: %" PRIttocTSK + ": expected one image filename, was given %d", a_images[0], a_num_img); + + if (tsk_verbose != 0) { + tsk_fprintf(stderr, "vmdk requires exactly 1 image filename for opening\n"); + } + return NULL; + } + char error_string[TSK_VMDK_ERROR_STRING_SIZE]; libvmdk_error_t *vmdk_error = NULL; int i; @@ -155,7 +165,6 @@ vmdk_open(int a_num_img, vmdk_info->handle = NULL; img_info = (TSK_IMG_INFO *) vmdk_info; - // a_num_img should be 1 if (!tsk_img_copy_image_names(img_info, a_images, a_num_img)) { goto on_error; } From 50ebe52d17124893e3c51c99a646a0f25a2e4586 Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Mon, 19 Jul 2021 16:03:10 +0100 Subject: [PATCH 0115/1548] Make usage of tsk_verbose uniform with rest of codebase. --- tsk/img/aff.c | 2 +- tsk/img/ewf.cpp | 14 +++++++------- tsk/img/vhd.c | 10 +++++----- tsk/img/vmdk.c | 10 +++++----- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/tsk/img/aff.c b/tsk/img/aff.c index 1dc3d0cb9f..c5dabc17d6 100644 --- a/tsk/img/aff.c +++ b/tsk/img/aff.c @@ -228,7 +228,7 @@ aff_open(int a_num_img, const TSK_TCHAR * const images[], unsigned int a_ssize) tsk_error_set_errstr("aff_open file: %" PRIttocTSK ": expected one image filename, was given %d", a_images[0], a_num_img); - if (tsk_verbose != 0) { + if (tsk_verbose) { tsk_fprintf(stderr, "aff requires exactly 1 image filename for opening\n"); } return NULL; diff --git a/tsk/img/ewf.cpp b/tsk/img/ewf.cpp index f464147e69..36af563214 100644 --- a/tsk/img/ewf.cpp +++ b/tsk/img/ewf.cpp @@ -302,7 +302,7 @@ ewf_open(int a_num_img, tsk_error_set_errstr("ewf_open: Not an EWF file (%s)", error_string); - if (tsk_verbose != 0) { + if (tsk_verbose) { tsk_fprintf(stderr, "Not an EWF file\n"); } goto on_error; @@ -316,7 +316,7 @@ ewf_open(int a_num_img, tsk_error_set_errstr("ewf_open file: %" PRIttocTSK ": Error initializing handle (%s)", a_images[0], error_string); - if (tsk_verbose != 0) { + if (tsk_verbose) { tsk_fprintf(stderr, "Unable to create EWF handle\n"); } goto on_error; @@ -339,7 +339,7 @@ ewf_open(int a_num_img, tsk_error_set_errstr("ewf_open file: %" PRIttocTSK ": Error opening (%s)", a_images[0], error_string); - if (tsk_verbose != 0) { + if (tsk_verbose) { tsk_fprintf(stderr, "Error opening EWF file\n"); } goto on_error; @@ -356,7 +356,7 @@ ewf_open(int a_num_img, libewf_handle_close(ewf_info->handle, NULL); - if (tsk_verbose != 0) { + if (tsk_verbose) { tsk_fprintf(stderr, "Error getting size of EWF file\n"); } goto on_error; @@ -375,7 +375,7 @@ ewf_open(int a_num_img, libewf_handle_close(ewf_info->handle, NULL); - if (tsk_verbose != 0) { + if (tsk_verbose) { tsk_fprintf(stderr, "Error getting MD5 of EWF file\n"); } goto on_error; @@ -397,7 +397,7 @@ ewf_open(int a_num_img, tsk_img_free(ewf_info); - if (tsk_verbose != 0) { + if (tsk_verbose) { tsk_fprintf(stderr, "Error getting SHA1 of EWF file\n"); } return NULL; @@ -439,7 +439,7 @@ ewf_open(int a_num_img, tsk_error_set_errstr("ewf_open file: %" PRIttocTSK ": Error opening", ewf_info->img_info.images[0]); - if (tsk_verbose != 0) { + if (tsk_verbose) { tsk_fprintf(stderr, "Error opening EWF file\n"); } goto on_error; diff --git a/tsk/img/vhd.c b/tsk/img/vhd.c index b0a87c3a39..fbe137e4b0 100644 --- a/tsk/img/vhd.c +++ b/tsk/img/vhd.c @@ -137,7 +137,7 @@ vhdi_open(int a_num_img, tsk_error_set_errstr("vhdi_open file: %" PRIttocTSK ": expected one image filename, was given %d", a_images[0], a_num_img); - if (tsk_verbose != 0) { + if (tsk_verbose) { tsk_fprintf(stderr, "vhd requires exactly 1 image filename for opening\n"); } return NULL; @@ -175,7 +175,7 @@ vhdi_open(int a_num_img, tsk_error_set_errstr("vhdi_open file: %" PRIttocTSK ": Error initializing handle (%s)", a_images[0], error_string); - if (tsk_verbose != 0) { + if (tsk_verbose) { tsk_fprintf(stderr, "Unable to create vhdi handle\n"); } goto on_error; @@ -195,7 +195,7 @@ vhdi_open(int a_num_img, ": Error checking file signature for image (%s)", a_images[0], error_string); - if (tsk_verbose != 0) { + if (tsk_verbose) { tsk_fprintf(stderr, "Error checking file signature for vhd file\n"); } goto on_error; @@ -217,7 +217,7 @@ vhdi_open(int a_num_img, tsk_error_set_errstr("vhdi_open file: %" PRIttocTSK ": Error opening (%s)", a_images[0], error_string); - if (tsk_verbose != 0) { + if (tsk_verbose) { tsk_fprintf(stderr, "Error opening vhdi file\n"); } goto on_error; @@ -232,7 +232,7 @@ vhdi_open(int a_num_img, ": Error getting size of image (%s)", a_images[0], error_string); - if (tsk_verbose != 0) { + if (tsk_verbose) { tsk_fprintf(stderr, "Error getting size of vhdi file\n"); } goto on_error; diff --git a/tsk/img/vmdk.c b/tsk/img/vmdk.c index 63bd632a94..e346776a96 100644 --- a/tsk/img/vmdk.c +++ b/tsk/img/vmdk.c @@ -139,7 +139,7 @@ vmdk_open(int a_num_img, tsk_error_set_errstr("vmdk_open file: %" PRIttocTSK ": expected one image filename, was given %d", a_images[0], a_num_img); - if (tsk_verbose != 0) { + if (tsk_verbose) { tsk_fprintf(stderr, "vmdk requires exactly 1 image filename for opening\n"); } return NULL; @@ -177,7 +177,7 @@ vmdk_open(int a_num_img, tsk_error_set_errstr("vmdk_open file: %" PRIttocTSK ": Error initializing handle (%s)", a_images[0], error_string); - if (tsk_verbose != 0) { + if (tsk_verbose) { tsk_fprintf(stderr, "Unable to create vmdk handle\n"); } goto on_error; @@ -199,7 +199,7 @@ vmdk_open(int a_num_img, tsk_error_set_errstr("vmdk_open file: %" PRIttocTSK ": Error opening (%s)", a_images[0], error_string); - if (tsk_verbose != 0) { + if (tsk_verbose) { tsk_fprintf(stderr, "Error opening vmdk file\n"); } goto on_error; @@ -214,7 +214,7 @@ vmdk_open(int a_num_img, ": Error opening extent data files for image (%s)", a_images[0], error_string); - if (tsk_verbose != 0) { + if (tsk_verbose) { tsk_fprintf(stderr, "Error opening vmdk extent data files\n"); } goto on_error; @@ -229,7 +229,7 @@ vmdk_open(int a_num_img, ": Error getting size of image (%s)", a_images[0], error_string); - if (tsk_verbose != 0) { + if (tsk_verbose) { tsk_fprintf(stderr, "Error getting size of vmdk file\n"); } goto on_error; From 4cf42f4506ccbfabaeb6bae04678e8d1ff70b0ff Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Thu, 5 Sep 2024 15:09:48 +0100 Subject: [PATCH 0116/1548] Removed unused variables. --- tsk/img/vmdk.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/tsk/img/vmdk.c b/tsk/img/vmdk.c index e346776a96..b8441c48c4 100644 --- a/tsk/img/vmdk.c +++ b/tsk/img/vmdk.c @@ -99,7 +99,6 @@ vmdk_image_imgstat(TSK_IMG_INFO * img_info, FILE * hFile) static void vmdk_image_close(TSK_IMG_INFO * img_info) { - int i; char error_string[TSK_VMDK_ERROR_STRING_SIZE]; libvmdk_error_t *vmdk_error = NULL; char *errmsg = NULL; @@ -147,7 +146,6 @@ vmdk_open(int a_num_img, char error_string[TSK_VMDK_ERROR_STRING_SIZE]; libvmdk_error_t *vmdk_error = NULL; - int i; IMG_VMDK_INFO *vmdk_info = NULL; TSK_IMG_INFO *img_info = NULL; From 450f7b900e3a56a4a9d83712efecb3648b82a82f Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Thu, 5 Sep 2024 15:10:25 +0100 Subject: [PATCH 0117/1548] Cleanup. --- tsk/img/vmdk.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tsk/img/vmdk.c b/tsk/img/vmdk.c index b8441c48c4..d9a3b136e7 100644 --- a/tsk/img/vmdk.c +++ b/tsk/img/vmdk.c @@ -32,7 +32,7 @@ getError(libvmdk_error_t * vmdk_error, retval = libvmdk_error_backtrace_sprint(vmdk_error, error_string, TSK_VMDK_ERROR_STRING_SIZE); libvmdk_error_free(&vmdk_error); - return retval ? 1 : 0; + return retval != 0; } From 13f74c72b37ecc0a03a905e2d493ad6e5dbadb55 Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Fri, 9 Aug 2024 17:03:01 +0100 Subject: [PATCH 0118/1548] Fix GH 2899. The hfs_thread struct is sized for the maximum possible name length, but the actual on-disk storage of the name is variable length. It's incorrect to require the buffer to be the maximum size, and results in entries being skipped as corrupt. Instead, the right thing to do is check that enough of the data fits into the buffer so that the name lengtt can be read, and if so, read the name length and check that a name of that length also fits. --- tsk/fs/hfs_dent.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/tsk/fs/hfs_dent.c b/tsk/fs/hfs_dent.c index 9a69dd7138..8cee27abff 100644 --- a/tsk/fs/hfs_dent.c +++ b/tsk/fs/hfs_dent.c @@ -258,12 +258,20 @@ hfs_dir_open_meta_cb(HFS_INFO * hfs, int8_t level_type, /* This will link the folder to its parent, which is the ".." entry */ else if (rec_type == HFS_FOLDER_THREAD) { - if ((nodesize < sizeof(hfs_thread)) || (rec_off2 > nodesize - sizeof(hfs_thread))) { + hfs_thread *thread = (hfs_thread *) & rec_buf[rec_off2]; + + // hfs_thread is of variable size on disk. The minimum size is + // 10 bytes (8 for the fields, 2 for the length of an empty name). + // First, check that we can read as far as the name length; then + // get the name length and check that the whole record fits into + // the buffer. + if (rec_off2 > nodesize - (sizeof(hfs_thread) - sizeof(hfs_uni_str) + 2) || + rec_off2 > nodesize - (sizeof(hfs_thread) - sizeof(hfs_uni_str) + 2 + tsk_getu16(hfs->fs_info.endian, thread->name.length))) { tsk_error_set_errno(TSK_ERR_FS_GENFS); tsk_error_set_errstr("hfs_dir_open_meta: nodesize value out of bounds"); return HFS_BTREE_CB_ERR; } - hfs_thread *thread = (hfs_thread *) & rec_buf[rec_off2]; + strcpy(info->fs_name->name, ".."); info->fs_name->meta_addr = tsk_getu32(hfs->fs_info.endian, thread->parent_cnid); From b8c28b8836e70bb6f7436347f7170c5cecfac0fa Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Fri, 9 Aug 2024 17:36:14 +0100 Subject: [PATCH 0119/1548] Simplified expression. --- tsk/fs/hfs_dent.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tsk/fs/hfs_dent.c b/tsk/fs/hfs_dent.c index 8cee27abff..908ae0b762 100644 --- a/tsk/fs/hfs_dent.c +++ b/tsk/fs/hfs_dent.c @@ -261,12 +261,15 @@ hfs_dir_open_meta_cb(HFS_INFO * hfs, int8_t level_type, hfs_thread *thread = (hfs_thread *) & rec_buf[rec_off2]; // hfs_thread is of variable size on disk. The minimum size is - // 10 bytes (8 for the fields, 2 for the length of an empty name). + // 10 bytes (8 for the non-name fields, 2 for the length of an + // empty name). + const size_t min_hfs_thread_size = sizeof(hfs_thread) - sizeof(hfs_uni_str) + 2; + // First, check that we can read as far as the name length; then // get the name length and check that the whole record fits into // the buffer. - if (rec_off2 > nodesize - (sizeof(hfs_thread) - sizeof(hfs_uni_str) + 2) || - rec_off2 > nodesize - (sizeof(hfs_thread) - sizeof(hfs_uni_str) + 2 + tsk_getu16(hfs->fs_info.endian, thread->name.length))) { + if (rec_off2 > nodesize - min_hfs_thread_size || + rec_off2 > nodesize - (min_hfs_thread_size + tsk_getu16(hfs->fs_info.endian, thread->name.length))) { tsk_error_set_errno(TSK_ERR_FS_GENFS); tsk_error_set_errstr("hfs_dir_open_meta: nodesize value out of bounds"); return HFS_BTREE_CB_ERR; From 93d7766584944ee9b43ba3e7a6e4c92ed4314012 Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Thu, 5 Sep 2024 14:10:52 -0400 Subject: [PATCH 0120/1548] cppunit unit tests reactivated. --- .github/workflows/compile-check-codecov.yml | 9 +++++++++ .gitignore | 1 + unit_tests/.gitignore | 1 + unit_tests/Makefile.am | 10 ++++++++++ 4 files changed, 21 insertions(+) create mode 100644 unit_tests/.gitignore diff --git a/.github/workflows/compile-check-codecov.yml b/.github/workflows/compile-check-codecov.yml index 73b4e4f355..fa7bef955d 100644 --- a/.github/workflows/compile-check-codecov.yml +++ b/.github/workflows/compile-check-codecov.yml @@ -37,6 +37,15 @@ jobs: with: submodules: recursive + - name: Prep the VM (MacOS) + run: | + sudo brew install cppunit + + - name: Prep the VM (ubuntu) + if: startsWith(matrix.os, 'ubuntu') + run: | + sudo apt install cppunit + - name: Get disk images run: | bash tests/get_dftt.bash diff --git a/.gitignore b/.gitignore index 9c1e10e935..dba241ad49 100755 --- a/.gitignore +++ b/.gitignore @@ -205,3 +205,4 @@ sleuthkit-*.tar.gz # Whitelist test data folder !tests/data/* +.Tpo diff --git a/unit_tests/.gitignore b/unit_tests/.gitignore new file mode 100644 index 0000000000..c33ca06209 --- /dev/null +++ b/unit_tests/.gitignore @@ -0,0 +1 @@ +runner diff --git a/unit_tests/Makefile.am b/unit_tests/Makefile.am index 792a44d8ce..4c917b3eea 100644 --- a/unit_tests/Makefile.am +++ b/unit_tests/Makefile.am @@ -1 +1,11 @@ +AM_CPPFLAGS = -I.. -I$(srcdir)/.. +AM_CFLAGS += $(PTHREAD_CFLAGS) +AM_CXXFLAGS += -Wno-unused-command-line-argument $(PTHREAD_CFLAGS) +LDADD = ../tsk/libtsk.la +LDFLAGS += -static $(PTHREAD_LIBS) -lcppunit + + SUBDIRS = base +check_PROGRAMS = runner + +runner_SOURCES = runner.cpp base/errors_test.cpp From 0ae372c08f1f40e3fac1f6b57884162e0d303008 Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Thu, 5 Sep 2024 14:14:29 -0400 Subject: [PATCH 0121/1548] fixed error that running homebrew as root is no longer supporter. --- .github/workflows/compile-check-codecov.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/compile-check-codecov.yml b/.github/workflows/compile-check-codecov.yml index fa7bef955d..0ed9758c08 100644 --- a/.github/workflows/compile-check-codecov.yml +++ b/.github/workflows/compile-check-codecov.yml @@ -39,7 +39,7 @@ jobs: - name: Prep the VM (MacOS) run: | - sudo brew install cppunit + brew install cppunit - name: Prep the VM (ubuntu) if: startsWith(matrix.os, 'ubuntu') From fe5fc3f5f5064ce7995dcc36625f048713308f78 Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Thu, 5 Sep 2024 14:25:47 -0400 Subject: [PATCH 0122/1548] forgot to conditionalize --- .github/workflows/compile-check-codecov.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/compile-check-codecov.yml b/.github/workflows/compile-check-codecov.yml index f6b4c473e0..3a72c20986 100644 --- a/.github/workflows/compile-check-codecov.yml +++ b/.github/workflows/compile-check-codecov.yml @@ -39,6 +39,7 @@ jobs: submodules: recursive - name: Prep the VM (MacOS) + if: startsWith(matrix.os, 'macos') run: | brew install cppunit From c67c5d1131c753b1243a9fc554b94c4f47cd9d56 Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Thu, 5 Sep 2024 14:38:09 -0400 Subject: [PATCH 0123/1548] this is how to install cppunit on ubuntu, apparently. --- .github/workflows/compile-check-codecov.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/compile-check-codecov.yml b/.github/workflows/compile-check-codecov.yml index 3a72c20986..c210216827 100644 --- a/.github/workflows/compile-check-codecov.yml +++ b/.github/workflows/compile-check-codecov.yml @@ -46,7 +46,7 @@ jobs: - name: Prep the VM (ubuntu) if: startsWith(matrix.os, 'ubuntu') run: | - sudo apt install cppunit + sudo apt-get install libcppunit-dev - name: Get disk images run: | From a28c92cc3481138788cffdc29c07d8d7b5560012 Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Thu, 5 Sep 2024 12:35:55 -0700 Subject: [PATCH 0124/1548] try to make compiling under GetHub actions on Windows work --- .github/workflows/compile-windows.yml | 62 +++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 .github/workflows/compile-windows.yml diff --git a/.github/workflows/compile-windows.yml b/.github/workflows/compile-windows.yml new file mode 100644 index 0000000000..bbacea4a24 --- /dev/null +++ b/.github/workflows/compile-windows.yml @@ -0,0 +1,62 @@ +name: TSK Tests on Windows + +on: + push: + branches: + - '**' # This will trigger the action for all branches + pull_request: + branches: # Specify the branches for which pull_request events should trigger the action + - main + - develop + +jobs: + build: + strategy: + matrix: + targetplatform: [x86, x64] + runs-on: windows-latest + + env: + TSK_HOME: "${{ github.workspace }}" + + steps: + # https://github.com/actions/checkout + - uses: actions/checkout@v4 + - uses: actions/setup-dotnet@v1 + - uses: microsoft/setup-msbuild@v1.1 + + - name: Set up Python 3.10 + uses: actions/setup-python@v2 + with: + python-version: '3.10' + + - name: Set up JDK 11 + uses: actions/setup-java@v3 + with: + distribution: 'temurin' # You can use 'zulu' or 'adopt' as well + java-version: '11' + + - name: Install Chocolatey + run: | + Set-ExecutionPolicy Bypass -Scope Process -Force; + [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; + iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1')) + choco install nuget.commandline + choco install ant --ignore-dependencies + + - name: Restore NuGet packages + run: nuget restore win32/lib + + - name: Build TSK + run: | + python win32\updateAndBuildAll.py -m + + - name: Build Java + run: | + ant -version + cd bindings\java + ant -q dist + cd ..\.. + cd case-uco\java + ant -q + cd ..\.. From ac31cd04f5d0b0a829605d00d7d3cf4728b2ab45 Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Thu, 5 Sep 2024 12:47:34 -0700 Subject: [PATCH 0125/1548] remove nugent lib thing --- .github/workflows/compile-windows.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/compile-windows.yml b/.github/workflows/compile-windows.yml index bbacea4a24..00dcfad0dd 100644 --- a/.github/workflows/compile-windows.yml +++ b/.github/workflows/compile-windows.yml @@ -44,8 +44,8 @@ jobs: choco install nuget.commandline choco install ant --ignore-dependencies - - name: Restore NuGet packages - run: nuget restore win32/lib + #- name: Restore NuGet packages + # run: nuget restore win32/lib - name: Build TSK run: | From d80eabd8bec342fe84b46ece529dd35d03e3c351 Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Thu, 5 Sep 2024 13:01:13 -0700 Subject: [PATCH 0126/1548] make updateAndBuildAll.py build with Visual Studio 2022 Enterprise --- win32/updateAndBuildAll.py | 42 ++++++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/win32/updateAndBuildAll.py b/win32/updateAndBuildAll.py index 36d9b23e84..8d3ac58fc5 100644 --- a/win32/updateAndBuildAll.py +++ b/win32/updateAndBuildAll.py @@ -8,6 +8,7 @@ import datetime import logging import os +import os.path import re import shutil import subprocess @@ -18,14 +19,28 @@ import time import traceback -MSBUILD_HOME = os.getenv("MSBUILD_HOME", "C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/MSBuild/Current") -MSBUILD_PATH = os.path.normpath(MSBUILD_HOME+"/Bin/MSBuild.exe") +MSBUILD_LOCATIONS = ['C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/MSBuild/Current/Bin', + 'C:/Program Files (x86)/Microsoft Visual Studio/2022/Enterprise/MSBuild/Current/Bin', + '/cygdrive/c/Program\ Files\ \(x86\)/MSBuild/14.0/Bin/'] + + + + +MSBUILD = 'MSBuild.exe' CURRENT_PATH = os.getcwd() # save the build log in the output directory LOG_PATH = os.path.join(CURRENT_PATH, 'output', time.strftime("%Y.%m.%d-%H.%M.%S")) MINIMAL = False +def find_msbuild(): + for loc in MSBUILD_LOCATIONS: + if os.path.exists(loc): + msbuild_exe = os.path.join(loc,MSBUILD) + assert os.path.exists(msbuild_exe) + return msbuild_exe + raise RuntimeError("Could not find %s",MSBUILD) + def getDependencies(depBranch): ''' @@ -45,14 +60,14 @@ def getDependencies(depBranch): print("Please set the TSK_HOME environment variable") sys.exit(1) else: - # nuget restore + # nuget restore os.chdir(os.path.join(os.getenv("TSK_HOME"),"win32")) - + print ("Restoring nuget packages.") ret = subprocess.call(["nuget", "restore", "tsk-win.sln"] , stdout=sys.stdout) if ret != 0: sys.exit("Failed to restore nuget packages") - + def buildTSKAll(): @@ -60,13 +75,13 @@ def buildTSKAll(): if not TSK_HOME: print("Please set the TSK_HOME environment variable") sys.exit(1) - + if not MINIMAL: if(passed): buildTSK(32, "Release") if(passed): buildTSK(64, "Release_NoLibs") - + # MINIMAL is 64-bit for Autopsy and 32-bit with no deps for logical imager et al. if(passed): @@ -94,9 +109,9 @@ def buildTSK(wPlatform, target): sys.exit(1) else: os.chdir(os.path.join(os.getenv("TSK_HOME"),"win32")) - + vs = [] - vs.append(MSBUILD_PATH) + vs.append(find_msbuild()) vs.append(os.path.join("tsk-win.sln")) vs.append("/p:configuration=" + target) if wPlatform == 64: @@ -115,7 +130,11 @@ def buildTSK(wPlatform, target): outputFile = os.path.join(LOG_PATH, "TSKOutput.txt") VSout = open(outputFile, 'w') - ret = subprocess.call(vs, stdout=sys.stdout) + try: + ret = subprocess.call(vs, stdout=sys.stdout) + except FileNotFoundError as e: + logging.error("failing command line: %s",vs) + raise VSout.close() if ret != 0: print("ret = " + str(ret)) @@ -157,9 +176,6 @@ def main(): if not os.path.exists(LOG_PATH): os.makedirs(LOG_PATH) - if not os.path.exists(MSBUILD_PATH): - print("MS_BUILD Does not exist") - sys.stdout.flush() getDependencies(depBranch) buildTSKAll() From f21f29451b4e3349d564a49f7b86eea16c8f4cee Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Thu, 5 Sep 2024 13:15:43 -0700 Subject: [PATCH 0127/1548] try using shutil --- win32/updateAndBuildAll.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/win32/updateAndBuildAll.py b/win32/updateAndBuildAll.py index 8d3ac58fc5..ffd87a8146 100644 --- a/win32/updateAndBuildAll.py +++ b/win32/updateAndBuildAll.py @@ -34,12 +34,18 @@ MINIMAL = False def find_msbuild(): + # First try using shutil to search the patn + msbuild_path = shutil.which(MSBUILD) + if msbuild_path: + return msbuild_path + + # Use our hard-coded locations for loc in MSBUILD_LOCATIONS: if os.path.exists(loc): msbuild_exe = os.path.join(loc,MSBUILD) assert os.path.exists(msbuild_exe) return msbuild_exe - raise RuntimeError("Could not find %s",MSBUILD) + raise FileNotFoundError(f"Could not find {MSBUILD}") def getDependencies(depBranch): From f4bcd5d5816df570dd29e2c9e5129a8e43956a8b Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Thu, 5 Sep 2024 13:28:51 -0700 Subject: [PATCH 0128/1548] cannot find jni.h; this may help --- .github/workflows/compile-windows.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/compile-windows.yml b/.github/workflows/compile-windows.yml index 00dcfad0dd..aefeab84de 100644 --- a/.github/workflows/compile-windows.yml +++ b/.github/workflows/compile-windows.yml @@ -47,6 +47,11 @@ jobs: #- name: Restore NuGet packages # run: nuget restore win32/lib + - name: Set JDK_HOME and INCLUDE + run: | + echo "JDK_HOME=$(Get-Command java).Path.Replace('\bin\java.exe', '')" >> $GITHUB_ENV + echo "INCLUDE=${{ env.JDK_HOME }}/include;${{ env.JDK_HOME }}/include/win32" >> $GITHUB_ENV + - name: Build TSK run: | python win32\updateAndBuildAll.py -m From f477cefa935689bcd452cab710a5f283c5027aef Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Thu, 5 Sep 2024 13:37:27 -0700 Subject: [PATCH 0129/1548] cannot find jni.h; this may help --- .github/workflows/compile-windows.yml | 29 +++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/.github/workflows/compile-windows.yml b/.github/workflows/compile-windows.yml index aefeab84de..e71e305119 100644 --- a/.github/workflows/compile-windows.yml +++ b/.github/workflows/compile-windows.yml @@ -30,12 +30,6 @@ jobs: with: python-version: '3.10' - - name: Set up JDK 11 - uses: actions/setup-java@v3 - with: - distribution: 'temurin' # You can use 'zulu' or 'adopt' as well - java-version: '11' - - name: Install Chocolatey run: | Set-ExecutionPolicy Bypass -Scope Process -Force; @@ -44,6 +38,29 @@ jobs: choco install nuget.commandline choco install ant --ignore-dependencies + - name: Set up JDK 11 + uses: actions/setup-java@v3 + with: + distribution: 'temurin' # You can use 'zulu' or 'adopt' as well + java-version: '11' + + - name: Search for all jni.h files on the system + run: | + Get-ChildItem -Recurse -Filter jni.h -ErrorAction SilentlyContinue + + - name: Print INCLUDE environment variable + run: echo $env:INCLUDE + + - name: Set INCLUDE environment variable (if needed) + run: | + # Example: Add a custom path if the jni.h directory is found but not in INCLUDE + $jniPath = (Get-ChildItem -Recurse -Filter jni.h -ErrorAction SilentlyContinue | Select-Object -First 1).DirectoryName + if ($jniPath) { + echo "Found jni.h at $jniPath" + $env:INCLUDE = "$jniPath;$env:INCLUDE" + echo "Updated INCLUDE: $env:INCLUDE" + } + #- name: Restore NuGet packages # run: nuget restore win32/lib From 52c05700695be859f3ead1d54fc396c06a490c7c Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Thu, 5 Sep 2024 13:49:07 -0700 Subject: [PATCH 0130/1548] cannot find jni.h; this may help --- .github/workflows/compile-windows.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/compile-windows.yml b/.github/workflows/compile-windows.yml index e71e305119..b8f497bee4 100644 --- a/.github/workflows/compile-windows.yml +++ b/.github/workflows/compile-windows.yml @@ -38,16 +38,22 @@ jobs: choco install nuget.commandline choco install ant --ignore-dependencies - - name: Set up JDK 11 + - name: Set up JDK 17 uses: actions/setup-java@v3 with: distribution: 'temurin' # You can use 'zulu' or 'adopt' as well - java-version: '11' + java-version: '17' - name: Search for all jni.h files on the system run: | Get-ChildItem -Recurse -Filter jni.h -ErrorAction SilentlyContinue + - name: Find jni.h using the Linux `find` command + shell: bash + run: | + echo "Searching for jni.h..." + find / -name "jni.h" 2>/dev/null + - name: Print INCLUDE environment variable run: echo $env:INCLUDE From b334c96963f99247c033e8a2167b0e48462c8d6a Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Thu, 5 Sep 2024 14:01:07 -0700 Subject: [PATCH 0131/1548] switch to zulu --- .github/workflows/compile-windows.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/compile-windows.yml b/.github/workflows/compile-windows.yml index b8f497bee4..6ac9fcca97 100644 --- a/.github/workflows/compile-windows.yml +++ b/.github/workflows/compile-windows.yml @@ -41,7 +41,7 @@ jobs: - name: Set up JDK 17 uses: actions/setup-java@v3 with: - distribution: 'temurin' # You can use 'zulu' or 'adopt' as well + distribution: 'zulu' # choose 'temurin', 'zulu' or 'adopt' java-version: '17' - name: Search for all jni.h files on the system From 94e0165f0d10474e1939ebbe864895df1ad3ec48 Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Thu, 5 Sep 2024 14:05:43 -0700 Subject: [PATCH 0132/1548] print all the files --- .github/workflows/compile-windows.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.github/workflows/compile-windows.yml b/.github/workflows/compile-windows.yml index 6ac9fcca97..490410f5cf 100644 --- a/.github/workflows/compile-windows.yml +++ b/.github/workflows/compile-windows.yml @@ -48,6 +48,16 @@ jobs: run: | Get-ChildItem -Recurse -Filter jni.h -ErrorAction SilentlyContinue + - name: Print the Java release from JAVA_HOME + shell: bash + run: | + find $JAVA_HOME -print + + - name: Print the Java release from / + shell: bash + run: | + find / -print + - name: Find jni.h using the Linux `find` command shell: bash run: | From 550b23e01a23e261dd228f7b311a3605a863cf8a Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Thu, 5 Sep 2024 14:14:20 -0700 Subject: [PATCH 0133/1548] slouching towards the solution --- .github/workflows/compile-windows.yml | 39 ++++++--------------------- 1 file changed, 8 insertions(+), 31 deletions(-) diff --git a/.github/workflows/compile-windows.yml b/.github/workflows/compile-windows.yml index 490410f5cf..d5de9a23a0 100644 --- a/.github/workflows/compile-windows.yml +++ b/.github/workflows/compile-windows.yml @@ -44,47 +44,24 @@ jobs: distribution: 'zulu' # choose 'temurin', 'zulu' or 'adopt' java-version: '17' - - name: Search for all jni.h files on the system - run: | - Get-ChildItem -Recurse -Filter jni.h -ErrorAction SilentlyContinue - - name: Print the Java release from JAVA_HOME shell: bash run: | find $JAVA_HOME -print - - name: Print the Java release from / - shell: bash - run: | - find / -print - - - name: Find jni.h using the Linux `find` command - shell: bash - run: | - echo "Searching for jni.h..." - find / -name "jni.h" 2>/dev/null - - - name: Print INCLUDE environment variable - run: echo $env:INCLUDE - - - name: Set INCLUDE environment variable (if needed) - run: | - # Example: Add a custom path if the jni.h directory is found but not in INCLUDE - $jniPath = (Get-ChildItem -Recurse -Filter jni.h -ErrorAction SilentlyContinue | Select-Object -First 1).DirectoryName - if ($jniPath) { - echo "Found jni.h at $jniPath" - $env:INCLUDE = "$jniPath;$env:INCLUDE" - echo "Updated INCLUDE: $env:INCLUDE" - } - - #- name: Restore NuGet packages - # run: nuget restore win32/lib - - name: Set JDK_HOME and INCLUDE run: | echo "JDK_HOME=$(Get-Command java).Path.Replace('\bin\java.exe', '')" >> $GITHUB_ENV echo "INCLUDE=${{ env.JDK_HOME }}/include;${{ env.JDK_HOME }}/include/win32" >> $GITHUB_ENV + - name: Demo JAVA_HOME/include/jni.h + shell: bash + run: | + ls -l $JAVA_HOME/include/jni.h + echo INCLUDE=$INCLUDE + ls -l $GITHUB_ENV + cat $GITHUB_ENV + - name: Build TSK run: | python win32\updateAndBuildAll.py -m From 31d74ddef412ef77b9565d68fd2d9279104593d5 Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Thu, 5 Sep 2024 14:27:02 -0700 Subject: [PATCH 0134/1548] JDK_HOME is not JAVA_HOME --- .github/workflows/compile-windows.yml | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/.github/workflows/compile-windows.yml b/.github/workflows/compile-windows.yml index d5de9a23a0..51696da418 100644 --- a/.github/workflows/compile-windows.yml +++ b/.github/workflows/compile-windows.yml @@ -50,9 +50,10 @@ jobs: find $JAVA_HOME -print - name: Set JDK_HOME and INCLUDE + shell: bash run: | - echo "JDK_HOME=$(Get-Command java).Path.Replace('\bin\java.exe', '')" >> $GITHUB_ENV - echo "INCLUDE=${{ env.JDK_HOME }}/include;${{ env.JDK_HOME }}/include/win32" >> $GITHUB_ENV + echo "JDK_HOME=$JAVA_HOME" >> $GITHUB_ENV + echo "INCLUDE=$INCLUDE;$JAVA_HOME/include;$JAVA_HOME/include/win32" >> $GITHUB_ENV - name: Demo JAVA_HOME/include/jni.h shell: bash @@ -60,7 +61,11 @@ jobs: ls -l $JAVA_HOME/include/jni.h echo INCLUDE=$INCLUDE ls -l $GITHUB_ENV - cat $GITHUB_ENV + + - name: bash printenv + shell: bash + run: | + printenv - name: Build TSK run: | From 201055e960b2c38ac0d502300c78933f2b2a340e Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Wed, 11 Oct 2017 13:22:16 +0100 Subject: [PATCH 0135/1548] Implemented detection of arbitrary-width alphabetic and zero-padded numeric image split patterns. (E.g., .00001 and .aaaa are now detected properly.) --- configure.ac | 4 +- tsk/img/Makefile.am | 2 +- tsk/img/mult_files.c | 214 ----------------------------- tsk/img/mult_files.cpp | 170 +++++++++++++++++++++++ tsk/img/mult_files.h | 15 ++ unit_tests/Makefile.am | 2 +- unit_tests/img/Makefile.am | 16 +++ unit_tests/img/mult_files_test.cpp | 152 ++++++++++++++++++++ unit_tests/img/mult_files_test.h | 25 ++++ 9 files changed, 383 insertions(+), 217 deletions(-) delete mode 100644 tsk/img/mult_files.c create mode 100644 tsk/img/mult_files.cpp create mode 100644 tsk/img/mult_files.h create mode 100644 unit_tests/img/Makefile.am create mode 100644 unit_tests/img/mult_files_test.cpp create mode 100644 unit_tests/img/mult_files_test.h diff --git a/configure.ac b/configure.ac index 98a410433e..bf0a6c2e7f 100644 --- a/configure.ac +++ b/configure.ac @@ -340,7 +340,8 @@ AC_CONFIG_FILES([ bindings/java/jni/Makefile case-uco/java/Makefile unit_tests/Makefile - unit_tests/base/Makefile]) + unit_tests/base/Makefile + unit_tests/img/Makefile]) AC_OUTPUT @@ -358,6 +359,7 @@ Building: zlib support: $ax_zlib Features: + cppunit support: $ac_cv_cppunit Java/JNI support: $ax_java_support Multithreading: $ax_multithread ]) diff --git a/tsk/img/Makefile.am b/tsk/img/Makefile.am index 0c51301b2d..86cb816c83 100644 --- a/tsk/img/Makefile.am +++ b/tsk/img/Makefile.am @@ -15,7 +15,7 @@ libtskimg_la_SOURCES = \ img_writer.h \ logical_img.c \ logical_img.h \ - mult_files.c \ + mult_files.cpp \ raw.c \ raw.h \ tsk_img_i.h \ diff --git a/tsk/img/mult_files.c b/tsk/img/mult_files.c deleted file mode 100644 index 1cd41a562f..0000000000 --- a/tsk/img/mult_files.c +++ /dev/null @@ -1,214 +0,0 @@ -/* - * Brian Carrier [carrier sleuthkit [dot] org] - * Copyright (c) 2011 Brian Carrier, Basis Technology. All rights reserved - * - * mult_files - * - * This software is distributed under the Common Public License 1.0 - * - */ - - -/** - * \file mult_files.c - * Internal code to find remainder of files in a split raw set - */ - -#include "tsk_img_i.h" - - -// return non-zero if str ends with suffix, ignoring case -static int -endsWith(const TSK_TCHAR * str, const TSK_TCHAR * suffix) -{ - - if (TSTRLEN(str) >= TSTRLEN(suffix)) { - return (TSTRICMP(&str[TSTRLEN(str) - TSTRLEN(suffix)], - suffix) == 0); - } - return 0; -} - - -/** Generate the name of the Nth segment of an image, given the starting name. - * If the name scheme isn't recognized, just returns the starting name for - * segment 1 and NULL for subsequent segments. - * - * @param a_startingName First name in the list (must be full name) - * @param a_segmentNumber The file number to generate a name for (starting at 1) - * @returns newly-allocated file name for this segment number or NULL on error - */ -static TSK_TCHAR * -getSegmentName(const TSK_TCHAR * a_startingName, int a_segmentNumber) -{ - - size_t nameLen = TSTRLEN(a_startingName); - TSK_TCHAR *newName = - (TSK_TCHAR *) tsk_malloc((nameLen + 32) * sizeof(TSK_TCHAR)); - // (extra space to allow for .NNN.dmgpart for .dmg file names and for - // large segment numbers, which could be 10 digits for 32-bit int) - - if (newName == NULL) - return NULL; - - // segment 1 uses the original file name always - TSTRNCPY(newName, a_startingName, nameLen + 1); - if (a_segmentNumber == 1) { - return newName; - } - - // .dmg case: second part is .002.dmgpart (etc.) - if (endsWith(a_startingName, _TSK_T(".dmg"))) { - TSNPRINTF(newName + nameLen - 3, 35, _TSK_T("%03d.dmgpart"), - a_segmentNumber); - return newName; - } - - // numeric counter case, 3 digit - if (endsWith(a_startingName, _TSK_T(".001")) || - endsWith(a_startingName, _TSK_T("_001"))) { - - // don't limit to 3 digits (FTK produces files named - // foo.1000 for 1000-part DD images) - TSNPRINTF(newName + nameLen - 3, 35, _TSK_T("%03d"), - a_segmentNumber); - return newName; - } - - // 0-based numeric counter case, 3 digit - if (endsWith(a_startingName, _TSK_T(".000")) || - endsWith(a_startingName, _TSK_T("_000"))) { - - TSNPRINTF(newName + nameLen - 3, 35, _TSK_T("%03d"), - a_segmentNumber - 1); - return newName; - } - - // numeric counter case, 2 digit - if (endsWith(a_startingName, _TSK_T(".01")) || - endsWith(a_startingName, _TSK_T("_01"))) { - - TSNPRINTF(newName + nameLen - 2, 34, _TSK_T("%02d"), - a_segmentNumber); - return newName; - } - - // 0-based numeric counter case, 2 digit - if (endsWith(a_startingName, _TSK_T(".00")) || - endsWith(a_startingName, _TSK_T("_00"))) { - - TSNPRINTF(newName + nameLen - 2, 34, _TSK_T("%02d"), - a_segmentNumber - 1); - return newName; - } - - // alphabetic counter, 3 character - if (endsWith(a_startingName, _TSK_T(".aaa")) || - endsWith(a_startingName, _TSK_T("xaaa")) || - endsWith(a_startingName, _TSK_T("_aaa"))) { - - // preserve case for the alpha characters - a_segmentNumber--; - newName[nameLen - 1] += (a_segmentNumber % 26); - a_segmentNumber /= 26; - newName[nameLen - 2] += (a_segmentNumber % 26); - a_segmentNumber /= 26; - newName[nameLen - 3] += (a_segmentNumber % 26); - a_segmentNumber /= 26; - if (a_segmentNumber > 0) { - // too many segments for format - free(newName); - return NULL; - } - return newName; - } - - // alphabetic counter, 2 character - if (endsWith(a_startingName, _TSK_T(".aa")) || - endsWith(a_startingName, _TSK_T("xaa")) || - endsWith(a_startingName, _TSK_T("_aa"))) { - - // preserve case for the alpha characters - a_segmentNumber--; - newName[nameLen - 1] += (a_segmentNumber % 26); - a_segmentNumber /= 26; - newName[nameLen - 2] += (a_segmentNumber % 26); - a_segmentNumber /= 26; - if (a_segmentNumber > 0) { - // too many segments for format - free(newName); - return NULL; - } - return newName; - } - - // numeric counter, variable width - if (endsWith(a_startingName, _TSK_T(".bin"))) { - TSNPRINTF(newName + nameLen - 4, 36, _TSK_T("(%d).bin"), - a_segmentNumber); - return newName; - } - - // unknown name format - free(newName); - return NULL; -} - - -/** - * @param a_startingName First name in the list (must be full name) - * @param [out] a_numFound Number of images that are in returned list - * @returns array of names that caller must free (NULL on error or if supplied file does not exist) - */ -TSK_TCHAR ** -tsk_img_findFiles(const TSK_TCHAR * a_startingName, int *a_numFound) -{ - TSK_TCHAR **retNames = NULL; - TSK_TCHAR *nextName; - TSK_TCHAR **tmpNames; - int fileCount = 0; - struct STAT_STR stat_buf; - - *a_numFound = 0; - - // iterate through potential segment names - while ((nextName = - getSegmentName(a_startingName, fileCount + 1)) != NULL) { - - // does the file exist? - if (TSTAT(nextName, &stat_buf) < 0) { - free(nextName); - break; - } - - if (tsk_verbose) - tsk_fprintf(stderr, - "tsk_img_findFiles: %" PRIttocTSK " found\n", nextName); - - // add to list - fileCount++; - if (fileCount == 1) - tmpNames = (TSK_TCHAR **) tsk_malloc(sizeof(TSK_TCHAR *)); - else - tmpNames = - (TSK_TCHAR **) tsk_realloc(retNames, - fileCount * sizeof(TSK_TCHAR *)); - if (tmpNames == NULL) { - if (retNames != NULL) - free(retNames); - return NULL; - } - retNames = tmpNames; - retNames[fileCount - 1] = nextName; - } - - if (fileCount <= 0) - return NULL; - - if (tsk_verbose) - tsk_fprintf(stderr, "tsk_img_findFiles: %d total segments found\n", - fileCount); - *a_numFound = fileCount; - - return retNames; -} diff --git a/tsk/img/mult_files.cpp b/tsk/img/mult_files.cpp new file mode 100644 index 0000000000..a8d2e6cb9d --- /dev/null +++ b/tsk/img/mult_files.cpp @@ -0,0 +1,170 @@ + +#include "mult_files.h" + +#include +#include + +namespace { + +// return non-zero if str ends with suffix, ignoring case +int endsWith(const TSK_TCHAR * str, const TSK_TCHAR * suffix) { + return TSTRLEN(str) >= TSTRLEN(suffix) ? + TSTRICMP(&str[TSTRLEN(str) - TSTRLEN(suffix)], suffix) == 0 : 0; +} + +} + +std::function getSegmentPattern(const TSK_TCHAR* first) { + const size_t flen = TSTRLEN(first); + + // zero-padded numeric counter, zero- or one-based: + // [.000,] .001, .002, ... ; [_000,] _001, _002, ... + if (first[flen-1] == '0' || first[flen-1] == '1') { + const bool zero_based = first[flen-1] == '0'; + + // find left end of zero padding + int i; + for (i = flen - 2; i >= 0 && first[i] == '0'; --i) ; + + if (first[i] == '.' || first[i] == '_') { + const TSK_STRING base(first, first + i + 1); + const size_t width = flen - (i + 1); + + // NB: digit overflow is ok; FTK apparently adds a fourth digit + // when there are > 999 segments. + return [base, width, zero_based](size_t i, TSK_OSTRINGSTREAM& os) { + os << base << std::setfill('0') << std::setw(width) << (i+1-zero_based); + return os.str(); + }; + } + } + // alphabetic counter: + // .aaa, .aab, .aac, ... ; _aaa, _aab, _aac, ... ; xaaa, xaab, xaac, ... + else if (first[flen-1] == 'a') { + // find left end of suffix + int i; + for (i = flen - 2; i >= 0 && first[i] == 'a'; --i) ; + + if (first[i] == '.' || first[i] == '_' || first[i] == 'x') { + const TSK_STRING base(first); + const size_t limit = i; + + return [base, limit](size_t i, TSK_OSTRINGSTREAM&) { + TSK_STRING seg(base); + for (size_t d = seg.size() - 1; i; i /= 26, --d) { + if (d == limit) { + // we've exhausted the counter width + return TSK_STRING(); + } + seg[d] = i % 26 + 'a'; + } + return seg; + }; + } + } + // .dmg: .dmg, .002.dmgpart, .003.dmgpart, ... + else if (endsWith(first, _TSK_T(".dmg"))) { + const TSK_STRING base(first, first + flen - 3); + + return [base](size_t i, TSK_OSTRINGSTREAM& os) { + os << base << std::setfill('0') << std::setw(3) << (i+1) << ".dmgpart"; + return os.str(); + }; + } + // .bin: .bin, (2).bin, (3).bin, ... + else if (endsWith(first, _TSK_T(".bin"))) { + const TSK_STRING base(first, first + flen - 4); + + return [base](size_t i, TSK_OSTRINGSTREAM& os) { + os << base << '(' << (i+1) << ").bin"; + return os.str(); + }; + } + + // no pattern detected + return nullptr; +} + +namespace { + +template +void free_array(T** a, size_t len) { + for (size_t i = 0; i < len; ++i) { + free(a[i]); + } + free(a); +} + +TSK_TCHAR** str_vec_to_array(const std::vector& vec) { + const size_t count = vec.size(); + + TSK_TCHAR** arr = (TSK_TCHAR**) tsk_malloc(count * sizeof(TSK_TCHAR*)); + if (!arr) { + return nullptr; + } + + for (size_t i = 0; i < count; ++i) { + const size_t len = vec[i].size() + 1; + arr[i] = (TSK_TCHAR*) tsk_malloc(len * sizeof(TSK_TCHAR)); + if (!arr[i]) { + free_array(arr, i); + return nullptr; + } + TSTRNCPY(arr[i], vec[i].c_str(), len); + } + + return arr; +} + +bool add_if_exists(const TSK_STRING& name, std::vector& names) { + struct STAT_STR stat_buf; + + // does the file exist? + if (TSTAT(name.c_str(), &stat_buf) < 0) { + return false; + } + + if (tsk_verbose) { + tsk_fprintf(stderr, "tsk_img_findFiles: %" PRIttocTSK " found\n", name.c_str()); + } + + names.push_back(name); + return true; +} + +} + +/** + * @param a_startingName First name in the list (must be full name) + * @param [out] a_numFound Number of images that are in returned list + * @returns array of names that caller must free (NULL on error or if supplied file does not exist) + */ +TSK_TCHAR ** +tsk_img_findFiles(const TSK_TCHAR * a_startingName, int *a_numFound) +{ + TSK_TCHAR** nlist = nullptr; + std::vector names; + *a_numFound = 0; + + // get the first segment + if (add_if_exists(a_startingName, names)) { + // look for a pattern + const auto pfunc = getSegmentPattern(a_startingName); + if (pfunc) { + // found a pattern, look for subsequent segments + TSK_OSTRINGSTREAM os; + for (size_t i = 1; add_if_exists(pfunc(i, os), names); ++i, os.str(_TSK_T(""))); + } + + // copy the vector to a C array + nlist = str_vec_to_array(names); + if (nlist) { + *a_numFound = names.size(); + } + } + + if (tsk_verbose) { + tsk_fprintf(stderr, "tsk_img_findFiles: %d total segments found\n", names.size()); + } + return nlist; +} diff --git a/tsk/img/mult_files.h b/tsk/img/mult_files.h new file mode 100644 index 0000000000..451eb1d792 --- /dev/null +++ b/tsk/img/mult_files.h @@ -0,0 +1,15 @@ +#ifndef MULT_FILES_H +#define MULT_FILES_H + +#include "tsk_img_i.h" + +#include +#include +#include + +#define TSK_STRING std::basic_string +#define TSK_OSTRINGSTREAM std::basic_ostringstream + +std::function getSegmentPattern(const TSK_TCHAR* first); + +#endif diff --git a/unit_tests/Makefile.am b/unit_tests/Makefile.am index 4c917b3eea..3af3952531 100644 --- a/unit_tests/Makefile.am +++ b/unit_tests/Makefile.am @@ -5,7 +5,7 @@ LDADD = ../tsk/libtsk.la LDFLAGS += -static $(PTHREAD_LIBS) -lcppunit -SUBDIRS = base +SUBDIRS = base img check_PROGRAMS = runner runner_SOURCES = runner.cpp base/errors_test.cpp diff --git a/unit_tests/img/Makefile.am b/unit_tests/img/Makefile.am new file mode 100644 index 0000000000..4dde11ea1f --- /dev/null +++ b/unit_tests/img/Makefile.am @@ -0,0 +1,16 @@ +AM_CPPFLAGS = -I../.. $(CPPUNIT_CFLAGS) +AM_CXXFLAGS += $(CPPUNIT_CFLAGS) +LDADD = ../../tsk/libtsk.la $(CPPUNIT_LIBS) +LDFLAGS = -static + +noinst_PROGRAMS = test_img +test_img_SOURCES= ../runner.cpp mult_files_test.cpp ../../tsk/img/mult_files.cpp + +indent: + indent *.cpp *.h + +clean-local: + -rm -f *.cpp~ *.h~ + +check: + ./test_img diff --git a/unit_tests/img/mult_files_test.cpp b/unit_tests/img/mult_files_test.cpp new file mode 100644 index 0000000000..9edd5d12ee --- /dev/null +++ b/unit_tests/img/mult_files_test.cpp @@ -0,0 +1,152 @@ +#include "mult_files_test.h" + +#include "tsk/img/mult_files.h" + +// Registers the fixture into the 'registry' +CPPUNIT_TEST_SUITE_REGISTRATION(MultFilesTest); + +void MultFilesTest::testSegmentsAlphabetic() { + TSK_OSTRINGSTREAM os; + TSK_STRING base = _TSK_T("x"); + + for (TSK_STRING sep: {_TSK_T("."), _TSK_T("_"), _TSK_T("")}) { + const TSK_STRING name = base + sep; + const auto pfunc = getSegmentPattern((name + _TSK_T("aaa")).c_str()); + + CPPUNIT_ASSERT(pfunc(1, os) == name + _TSK_T("aab")); + os.str(_TSK_T("")); + CPPUNIT_ASSERT(pfunc(25, os) == name + _TSK_T("aaz")); + os.str(_TSK_T("")); + CPPUNIT_ASSERT(pfunc(26, os) == name + _TSK_T("aba")); + os.str(_TSK_T("")); + CPPUNIT_ASSERT(pfunc(51, os) == name + _TSK_T("abz")); + os.str(_TSK_T("")); + CPPUNIT_ASSERT(pfunc(52, os) == name + _TSK_T("aca")); + os.str(_TSK_T("")); + CPPUNIT_ASSERT(pfunc(675, os) == name + _TSK_T("azz")); + os.str(_TSK_T("")); + CPPUNIT_ASSERT(pfunc(676, os) == name + _TSK_T("baa")); + os.str(_TSK_T("")); + CPPUNIT_ASSERT(pfunc(17575, os) == name + _TSK_T("zzz")); + os.str(_TSK_T("")); + CPPUNIT_ASSERT(pfunc(17576, os) == _TSK_T("")); + os.str(_TSK_T("")); + } + + for (TSK_STRING sep: {_TSK_T("."), _TSK_T("_"), _TSK_T("")}) { + const TSK_STRING name = base + sep; + const auto pfunc = getSegmentPattern((name + _TSK_T("aaaa")).c_str()); + + CPPUNIT_ASSERT(pfunc(1, os) == name + _TSK_T("aaab")); + os.str(_TSK_T("")); + CPPUNIT_ASSERT(pfunc(25, os) == name + _TSK_T("aaaz")); + os.str(_TSK_T("")); + CPPUNIT_ASSERT(pfunc(26, os) == name + _TSK_T("aaba")); + os.str(_TSK_T("")); + CPPUNIT_ASSERT(pfunc(51, os) == name + _TSK_T("aabz")); + os.str(_TSK_T("")); + CPPUNIT_ASSERT(pfunc(52, os) == name + _TSK_T("aaca")); + os.str(_TSK_T("")); + CPPUNIT_ASSERT(pfunc(675, os) == name + _TSK_T("aazz")); + os.str(_TSK_T("")); + CPPUNIT_ASSERT(pfunc(676, os) == name + _TSK_T("abaa")); + os.str(_TSK_T("")); + CPPUNIT_ASSERT(pfunc(17575, os) == name + _TSK_T("azzz")); + os.str(_TSK_T("")); + CPPUNIT_ASSERT(pfunc(17576, os) == name + _TSK_T("baaa")); + os.str(_TSK_T("")); + } +} + +void MultFilesTest::testSegmentsBin() { + TSK_OSTRINGSTREAM os; + const auto pfunc = getSegmentPattern(_TSK_T("file.bin")); + + CPPUNIT_ASSERT(pfunc(1, os) == _TSK_T("file(2).bin")); + os.str(_TSK_T("")); + CPPUNIT_ASSERT(pfunc(9, os) == _TSK_T("file(10).bin")); + os.str(_TSK_T("")); + CPPUNIT_ASSERT(pfunc(99, os) == _TSK_T("file(100).bin")); + os.str(_TSK_T("")); + CPPUNIT_ASSERT(pfunc(999, os) == _TSK_T("file(1000).bin")); +} + +void MultFilesTest::testSegmentsDmg() { + TSK_OSTRINGSTREAM os; + const auto pfunc = getSegmentPattern(_TSK_T("file.dmg")); + + CPPUNIT_ASSERT(pfunc(1, os) == _TSK_T("file.002.dmgpart")); + os.str(_TSK_T("")); + CPPUNIT_ASSERT(pfunc(9, os) == _TSK_T("file.010.dmgpart")); + os.str(_TSK_T("")); + CPPUNIT_ASSERT(pfunc(99, os) == _TSK_T("file.100.dmgpart")); + os.str(_TSK_T("")); + CPPUNIT_ASSERT(pfunc(999, os) == _TSK_T("file.1000.dmgpart")); +} + +void MultFilesTest::testSegmentsNone() { + const auto pfunc = getSegmentPattern(_TSK_T("some.img")); + CPPUNIT_ASSERT(!pfunc); +} + +void MultFilesTest::testSegmentsNumericOneBased() { + TSK_OSTRINGSTREAM os; + TSK_STRING base = _TSK_T("file"); + + for (TSK_TCHAR sep: {'.', '_'}) { + const TSK_STRING name = base + sep; + const auto pfunc = getSegmentPattern((name + _TSK_T("001")).c_str()); + os.str(_TSK_T("")); + CPPUNIT_ASSERT(pfunc(1, os) == name + _TSK_T("002")); + os.str(_TSK_T("")); + CPPUNIT_ASSERT(pfunc(9, os) == name + _TSK_T("010")); + os.str(_TSK_T("")); + CPPUNIT_ASSERT(pfunc(99, os) == name + _TSK_T("100")); + os.str(_TSK_T("")); + CPPUNIT_ASSERT(pfunc(999, os) == name + _TSK_T("1000")); + } + + for (TSK_TCHAR sep: {_TSK_T('.'), _TSK_T('_')}) { + const TSK_STRING name = base + sep; + const auto pfunc = getSegmentPattern((name + _TSK_T("00001")).c_str()); + os.str(_TSK_T("")); + CPPUNIT_ASSERT(pfunc(1, os) == name + _TSK_T("00002")); + os.str(_TSK_T("")); + CPPUNIT_ASSERT(pfunc(9, os) == name + _TSK_T("00010")); + os.str(_TSK_T("")); + CPPUNIT_ASSERT(pfunc(99, os) == name + _TSK_T("00100")); + os.str(_TSK_T("")); + CPPUNIT_ASSERT(pfunc(999, os) == name + _TSK_T("01000")); + } +} + +void MultFilesTest::testSegmentsNumericZeroBased() { + TSK_OSTRINGSTREAM os; + TSK_STRING base = _TSK_T("file"); + + for (TSK_TCHAR sep: {_TSK_T('.'), _TSK_T('_')}) { + const TSK_STRING name = base + sep; + const auto pfunc = getSegmentPattern((name + _TSK_T("000")).c_str()); + os.str(_TSK_T("")); + CPPUNIT_ASSERT(pfunc(1, os) == name + _TSK_T("001")); + os.str(_TSK_T("")); + CPPUNIT_ASSERT(pfunc(10, os) == name + _TSK_T("010")); + os.str(_TSK_T("")); + CPPUNIT_ASSERT(pfunc(100, os) == name + _TSK_T("100")); + os.str(_TSK_T("")); + CPPUNIT_ASSERT(pfunc(1000, os) == name + _TSK_T("1000")); + } + + for (TSK_TCHAR sep: {_TSK_T('.'), _TSK_T('_')}) { + const TSK_STRING name = base + sep; + const auto pfunc = getSegmentPattern((name + _TSK_T("00000")).c_str()); + os.str(_TSK_T("")); + CPPUNIT_ASSERT(pfunc(1, os) == name + _TSK_T("00001")); + os.str(_TSK_T("")); + CPPUNIT_ASSERT(pfunc(10, os) == name + _TSK_T("00010")); + os.str(_TSK_T("")); + CPPUNIT_ASSERT(pfunc(100, os) == name + _TSK_T("00100")); + os.str(_TSK_T("")); + CPPUNIT_ASSERT(pfunc(1000, os) == name + _TSK_T("01000")); + } +} diff --git a/unit_tests/img/mult_files_test.h b/unit_tests/img/mult_files_test.h new file mode 100644 index 0000000000..c9a16e0980 --- /dev/null +++ b/unit_tests/img/mult_files_test.h @@ -0,0 +1,25 @@ +#ifndef MULT_FILES_TEST_H +#define MULT_FILES_TEST_H + +#include + +class MultFilesTest : public CppUnit::TestFixture { + CPPUNIT_TEST_SUITE(MultFilesTest); + CPPUNIT_TEST(testSegmentsAlphabetic); + CPPUNIT_TEST(testSegmentsBin); + CPPUNIT_TEST(testSegmentsDmg); + CPPUNIT_TEST(testSegmentsNone); + CPPUNIT_TEST(testSegmentsNumericOneBased); + CPPUNIT_TEST(testSegmentsNumericZeroBased); + CPPUNIT_TEST_SUITE_END(); + +public: + void testSegmentsAlphabetic(); + void testSegmentsBin(); + void testSegmentsDmg(); + void testSegmentsNone(); + void testSegmentsNumericOneBased(); + void testSegmentsNumericZeroBased(); +}; + +#endif From 5696351fc314eae85978687c2f0f86ab22b7ac5e Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Wed, 11 Oct 2017 15:01:39 +0100 Subject: [PATCH 0136/1548] Don't set an explicit check target for the unit tests, as that makes the target have the wrong executable extension. --- tsk/img/mult_files.cpp | 6 ++++-- unit_tests/img/Makefile.am | 7 +++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/tsk/img/mult_files.cpp b/tsk/img/mult_files.cpp index a8d2e6cb9d..10b39c762c 100644 --- a/tsk/img/mult_files.cpp +++ b/tsk/img/mult_files.cpp @@ -33,7 +33,8 @@ std::function getSegmentPattern(const TS // NB: digit overflow is ok; FTK apparently adds a fourth digit // when there are > 999 segments. return [base, width, zero_based](size_t i, TSK_OSTRINGSTREAM& os) { - os << base << std::setfill('0') << std::setw(width) << (i+1-zero_based); + os << base << std::setfill(_TSK_T('0')) << std::setw(width) + << (i+1-zero_based); return os.str(); }; } @@ -67,7 +68,8 @@ std::function getSegmentPattern(const TS const TSK_STRING base(first, first + flen - 3); return [base](size_t i, TSK_OSTRINGSTREAM& os) { - os << base << std::setfill('0') << std::setw(3) << (i+1) << ".dmgpart"; + os << base << std::setfill(_TSK_T('0')) << std::setw(3) << (i+1) + << ".dmgpart"; return os.str(); }; } diff --git a/unit_tests/img/Makefile.am b/unit_tests/img/Makefile.am index 4dde11ea1f..6a2cf883dd 100644 --- a/unit_tests/img/Makefile.am +++ b/unit_tests/img/Makefile.am @@ -3,14 +3,13 @@ AM_CXXFLAGS += $(CPPUNIT_CFLAGS) LDADD = ../../tsk/libtsk.la $(CPPUNIT_LIBS) LDFLAGS = -static -noinst_PROGRAMS = test_img +check_PROGRAMS = test_img test_img_SOURCES= ../runner.cpp mult_files_test.cpp ../../tsk/img/mult_files.cpp +TESTS = $(check_PROGRAMS) + indent: indent *.cpp *.h clean-local: -rm -f *.cpp~ *.h~ - -check: - ./test_img From 93253bf116a55952be736bdc5c33b03c56e2868a Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Wed, 20 Dec 2017 15:50:17 +0000 Subject: [PATCH 0137/1548] Adjusted vcxproj files for new mult_files.cpp, mult_files.h. --- win32/libtsk/libtsk.vcxproj | 5 +++-- win32/libtsk/libtsk.vcxproj.filters | 7 +++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/win32/libtsk/libtsk.vcxproj b/win32/libtsk/libtsk.vcxproj index f32e50757c..0a3964742b 100755 --- a/win32/libtsk/libtsk.vcxproj +++ b/win32/libtsk/libtsk.vcxproj @@ -507,7 +507,7 @@ xcopy /E /Y "$(VCInstallDir)\redist\MSVC\$(VCToolsRedistVersion)\$(PlatformTarge - + @@ -583,6 +583,7 @@ xcopy /E /Y "$(VCInstallDir)\redist\MSVC\$(VCToolsRedistVersion)\$(PlatformTarge + @@ -609,4 +610,4 @@ xcopy /E /Y "$(VCInstallDir)\redist\MSVC\$(VCToolsRedistVersion)\$(PlatformTarge - \ No newline at end of file + diff --git a/win32/libtsk/libtsk.vcxproj.filters b/win32/libtsk/libtsk.vcxproj.filters index 64c8fd6cc2..5a7c680a61 100755 --- a/win32/libtsk/libtsk.vcxproj.filters +++ b/win32/libtsk/libtsk.vcxproj.filters @@ -240,7 +240,7 @@ img - + img @@ -500,6 +500,9 @@ img + + img + img @@ -646,4 +649,4 @@ - \ No newline at end of file + From 69ad52595bc82af2740ffe92616334f8bd3d9f76 Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Mon, 6 Jun 2022 21:52:15 +0100 Subject: [PATCH 0138/1548] Ignore unit test executables. --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index dc87cf3d87..6a590f4b74 100755 --- a/.gitignore +++ b/.gitignore @@ -191,6 +191,7 @@ tools/vstools/mmstat tools/*/*.exe tools/*/*/*.exe unit_tests/base/test_base +unit_tests/img/test_img # EMACS backup files *~ From 4df24a7a0f7cc600f5c6f5016cf41659f5d95183 Mon Sep 17 00:00:00 2001 From: bradley Date: Sat, 3 Jun 2017 17:29:08 +1000 Subject: [PATCH 0139/1548] AFF4 support. --- configure.ac | 4 +- tsk/img/Makefile.am | 2 + tsk/img/aff4.c | 182 +++++++++++++++++++++++++++++++++++++++++++ tsk/img/aff4.h | 38 +++++++++ tsk/img/img_open.cpp | 30 ++++++- tsk/img/img_types.c | 3 + tsk/img/tsk_img.h | 1 + tsk/tsk_config.h.in | 5 +- 8 files changed, 262 insertions(+), 3 deletions(-) create mode 100644 tsk/img/aff4.c create mode 100644 tsk/img/aff4.h diff --git a/configure.ac b/configure.ac index bf0a6c2e7f..18aeab8ada 100644 --- a/configure.ac +++ b/configure.ac @@ -136,6 +136,8 @@ AM_CONDITIONAL([HAVE_LIBSQLITE3], [test "x$ax_sqlite3" = "xyes"]) dnl Check if we should link with afflib TSK_OPT_DEP_CHECK([afflib], [], [], [afflib/afflib.h], [afflib], [af_open]) +dnl Check if we should link with libaff4 +TSK_OPT_DEP_CHECK([libaff4], [], [], [aff4/libaff4-c.h], [aff4], [AFF4_version]) dnl Check if we should link with zlib TSK_OPT_DEP_CHECK([zlib], [ZLIB], [zlib], [zlib.h], [z], [inflate]) dnl Check if we should link with libbfio @@ -350,7 +352,7 @@ dnl openssl is disabled, so removed line openssl support: $ax_openssl AC_MSG_NOTICE([ Building: afflib support: $ax_afflib - libbfio support: $ax_libbfio + libaff4 support: $ax_libaff4 libewf support: $ax_libewf libvhdi support: $ax_libvhdi libvmdk support: $ax_libvmdk diff --git a/tsk/img/Makefile.am b/tsk/img/Makefile.am index 86cb816c83..dfff7514e7 100644 --- a/tsk/img/Makefile.am +++ b/tsk/img/Makefile.am @@ -6,6 +6,8 @@ noinst_LTLIBRARIES = libtskimg.la libtskimg_la_SOURCES = \ aff.c \ aff.h \ + aff4.c \ + aff4.h \ ewf.cpp \ ewf.h \ img_io.c \ diff --git a/tsk/img/aff4.c b/tsk/img/aff4.c new file mode 100644 index 0000000000..74b4f5bf24 --- /dev/null +++ b/tsk/img/aff4.c @@ -0,0 +1,182 @@ +/* + * The Sleuth Kit - Add on for AFF4 image support + * + * This software is distributed under the Common Public License 1.0 + * + * Based on ewf image support of the Sleuth Kit from + * Brian Carrier. + */ + +/** \file aff4.c + * Internal code for TSK to interface with libaff4. + */ + +#include "tsk_img_i.h" + +#if HAVE_LIBAFF4 +#include "aff4.h" + +static ssize_t +aff4_image_read(TSK_IMG_INFO * img_info, TSK_OFF_T offset, char *buf, + size_t len) +{ + + ssize_t cnt; + IMG_AFF4_INFO *aff4_info = (IMG_AFF4_INFO *) img_info; + + if (tsk_verbose) + tsk_fprintf(stderr, + "aff4_image_read: byte offset: %" PRIuOFF " len: %" PRIuSIZE + "\n", offset, len); + + if (offset > img_info->size) { + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_IMG_READ_OFF); + tsk_error_set_errstr("aff4_image_read - %" PRIuOFF, offset); + return -1; + } + + tsk_take_lock(&(aff4_info->read_lock)); + cnt = AFF4_read(aff4_info->handle, offset, buf, len); + if (cnt < 0) { + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_IMG_READ); + tsk_error_set_errstr("aff4_image_read - offset: %" PRIuOFF + " - len: %" PRIuSIZE " - %s", offset, len, strerror(errno)); + tsk_release_lock(&(aff4_info->read_lock)); + return -1; + } + tsk_release_lock(&(aff4_info->read_lock)); + return cnt; +} + +static void +aff4_image_imgstat(TSK_IMG_INFO * img_info, FILE * hFile) +{ + + tsk_fprintf(hFile, "IMAGE FILE INFORMATION\n"); + tsk_fprintf(hFile, "--------------------------------------------\n"); + tsk_fprintf(hFile, "Image Type:\t\taff4\n"); + tsk_fprintf(hFile, "\nSize of data in bytes:\t%" PRIuOFF "\n", img_info->size); + + // TODO: Expand on this when C API expands to allow dumping TURTLE to FILE* + return; +} + +static void +aff4_image_close(TSK_IMG_INFO * img_info) +{ + IMG_AFF4_INFO *aff4_info = (IMG_AFF4_INFO *) img_info; + + AFF4_close(aff4_info->handle); + + tsk_deinit_lock(&(aff4_info->read_lock)); + tsk_img_free(aff4_info); +} + +static int aff4_check_file_signature(char* filename) +{ + // Implement. + return 0; +} + +TSK_IMG_INFO * +aff4_open(int a_num_img, + const TSK_TCHAR * const a_images[], unsigned int a_ssize) +{ + int is_error; + + IMG_AFF4_INFO *aff4_info = NULL; + TSK_IMG_INFO *img_info = NULL; + + if ((aff4_info = + (IMG_AFF4_INFO *) tsk_img_malloc(sizeof(IMG_AFF4_INFO))) == + NULL) { + return NULL; + } + img_info = (TSK_IMG_INFO *) aff4_info; + + // libaff4 only deals with UTF-8... if Win32 convert wchar_t to utf-8. + char* filename = NULL; +#if defined ( TSK_WIN32) + size_t newsize = (wcslen(a_images[0]) + 1) * 2; + filename = tsk_malloc(newsize); + if(filename == NULL){ + tsk_error_set_errno(TSK_ERR_IMG_CONVERT); + tsk_error_set_errstr("aff4_open: Unable to convert filename to UTF-8"); + return NULL; + } + // TODO: Possible refactor to tsk_UTF16toUTF8? + wcstombs(a_images[0], filename, newsize); +#else + filename = a_images[0]; +#endif + + // Check the file extension. (bad I know). + is_error = aff4_check_file_signature(filename); + if (is_error) + { + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_IMG_MAGIC); + tsk_error_set_errstr("aff4_open: Not an AFF4 file"); + tsk_img_free(aff4_info); + if (tsk_verbose) + tsk_fprintf(stderr, "Not an AFF4 file\n"); +#if defined ( TSK_WIN32) + free(filename); +#endif + return NULL; + } + + // Attempt to open the file. + aff4_info->handle = AFF4_open(filename); + if (aff4_info->handle == -1) { + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_IMG_OPEN); + tsk_error_set_errstr("aff4_open file: %" PRIttocTSK + ": Error opening", a_images[0]); + tsk_img_free(aff4_info); + + if (tsk_verbose != 0) { + tsk_fprintf(stderr, "Error opening AFF4 file\n"); + } +#if defined ( TSK_WIN32) + free(filename); +#endif + return (NULL); + } + + // get image size + img_info->size = AFF4_object_size(aff4_info->handle); + if (img_info->size == 0) { + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_IMG_OPEN); + tsk_error_set_errstr("aff4_open file: %" PRIttocTSK + ": Error getting size of image", a_images[0]); + tsk_img_free(aff4_info); + if (tsk_verbose) { + tsk_fprintf(stderr, "Error getting size of AFF4 file\n"); + } +#if defined ( TSK_WIN32) + free(filename); +#endif + return (NULL); + } + + aff4_info->images = a_images; + img_info->sector_size = 512; + img_info->itype = TSK_IMG_TYPE_AFF4_AFF4; + img_info->read = &aff4_image_read; + img_info->close = &aff4_image_close; + img_info->imgstat = &aff4_image_imgstat; + +#if defined ( TSK_WIN32) + free(filename); +#endif + + // initialize the read lock + tsk_init_lock(&(aff4_info->read_lock)); + return (img_info); +} + +#endif /* HAVE_LIBAFF4 */ diff --git a/tsk/img/aff4.h b/tsk/img/aff4.h new file mode 100644 index 0000000000..1c5d29700e --- /dev/null +++ b/tsk/img/aff4.h @@ -0,0 +1,38 @@ +/* + * The Sleuth Kit - Add on for AFF4 image support + * + * This software is distributed under the Common Public License 1.0 + * + * Based on EWF image support of the Sleuth Kit from + * Brian Carrier. + */ + +/* + * Header files for AFF4-specific data structures and functions. + */ + +#ifndef _TSK_IMG_AFF4_H +#define _TSK_IMG_AFF4_H + +#if HAVE_LIBAFF4 + +#include + +#ifdef __cplusplus +extern "C" { +#endif + + extern TSK_IMG_INFO *aff4_open(int, const TSK_TCHAR * const images[], unsigned int a_ssize); + + typedef struct { + TSK_IMG_INFO img_info; + int handle; + TSK_TCHAR **images; + tsk_lock_t read_lock; ///< Lock for reads since libaff4 is not thread safe -- only works if you have a single instance of AFF4_INFO for all threads. + } IMG_AFF4_INFO; + +#ifdef __cplusplus +} +#endif +#endif +#endif diff --git a/tsk/img/img_open.cpp b/tsk/img/img_open.cpp index a9c43e28ff..cf229fefce 100644 --- a/tsk/img/img_open.cpp +++ b/tsk/img/img_open.cpp @@ -35,6 +35,10 @@ #include "vhd.h" #endif +#if HAVE_LIBAFF4 +#include "aff4.h" +#endif + /** * \ingroup imglib * Opens a single (non-split) disk image file so that it can be read. This is a @@ -129,7 +133,7 @@ tsk_img_open(int num_img, * we try all of the embedded formats */ TSK_IMG_INFO *img_set = NULL; -#if HAVE_LIBAFFLIB || HAVE_LIBEWF || HAVE_LIBVMDK || HAVE_LIBVHDI +#if HAVE_LIBAFFLIB || HAVE_LIBEWF || HAVE_LIBVMDK || HAVE_LIBVHDI || HAVE_LIBAFF4 const char *set = NULL; #endif @@ -179,6 +183,26 @@ tsk_img_open(int num_img, } #endif +#if HAVE_LIBAFF4 + if ((img_info = aff4_open(num_img, images, a_ssize)) != NULL) { + if (set == NULL) { + set = "AFF4"; + img_set = img_info; + } + else { + img_set->close(img_set); + img_info->close(img_info); + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_IMG_UNKTYPE); + tsk_error_set_errstr("AFF4 or %s", set); + return NULL; + } + } + else { + tsk_error_reset(); + } +#endif + #if HAVE_LIBVMDK if ((img_info = vmdk_open(num_img, images, a_ssize)) != NULL) { if (set == NULL) { @@ -270,6 +294,10 @@ tsk_img_open(int num_img, #if HAVE_LIBVHDI case TSK_IMG_TYPE_VHD_VHD: img_info = vhdi_open(num_img, images, a_ssize); + +#if HAVE_LIBAFF4 + case TSK_IMG_TYPE_AFF4_AFF4: + img_info = aff4_open(num_img, images, a_ssize); break; #endif diff --git a/tsk/img/img_types.c b/tsk/img/img_types.c index 0e920812ef..b6891daf35 100644 --- a/tsk/img/img_types.c +++ b/tsk/img/img_types.c @@ -40,6 +40,9 @@ static IMG_TYPES img_open_table[] = { #if HAVE_LIBEWF {"ewf", TSK_IMG_TYPE_EWF_EWF, "Expert Witness Format (EnCase)"}, #endif +#if HAVE_LIBAFF4 + {"aff4", TSK_IMG_TYPE_AFF4_AFF4, "Advanced Forensic Format 4 (AFF4)"}, +#endif #if HAVE_LIBVMDK {"vmdk", TSK_IMG_TYPE_VMDK_VMDK, "Virtual Machine Disk (VmWare, Virtual Box)"}, #endif diff --git a/tsk/img/tsk_img.h b/tsk/img/tsk_img.h index ebd37562ed..8ee9f2a7e2 100644 --- a/tsk/img/tsk_img.h +++ b/tsk/img/tsk_img.h @@ -74,6 +74,7 @@ extern "C" { TSK_IMG_TYPE_EWF_EWF = 0x0040, ///< EWF version TSK_IMG_TYPE_VMDK_VMDK = 0x0080, ///< VMDK version TSK_IMG_TYPE_VHD_VHD = 0x0100, ///< VHD version + TSK_IMG_TYPE_AFF4_AFF4 = 0x200, ///< AFF4 version TSK_IMG_TYPE_EXTERNAL = 0x1000, ///< external defined format which at least implements TSK_IMG_INFO, used by pytsk TSK_IMG_TYPE_POOL = 0x4000, ///< Pool TSK_IMG_TYPE_LOGICAL = 0x8000, ///< Logical directory diff --git a/tsk/tsk_config.h.in b/tsk/tsk_config.h.in index 61c0e3d608..ec138d9a60 100644 --- a/tsk/tsk_config.h.in +++ b/tsk/tsk_config.h.in @@ -45,7 +45,10 @@ /* Define to 1 if you have the 'ishexnumber' function. */ #undef HAVE_ISHEXNUMBER -/* Define to 1 if you have the 'afflib' library (-lafflib). */ +/* Define to 1 if you have the `aff4' library (-laff4). */ +#undef HAVE_LIBAFF4 + +/* Define to 1 if you have the `afflib' library (-lafflib). */ #undef HAVE_LIBAFFLIB /* Define to 1 if you have the 'bfio' library (-lbfio). */ From 634c75761ed73ae267c6f3523f36dc09a9be6687 Mon Sep 17 00:00:00 2001 From: bradley Date: Mon, 28 Aug 2017 20:10:51 -0500 Subject: [PATCH 0140/1548] Fix Codacy PR blockers --- tsk/img/aff4.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tsk/img/aff4.c b/tsk/img/aff4.c index 74b4f5bf24..e9e448bff3 100644 --- a/tsk/img/aff4.c +++ b/tsk/img/aff4.c @@ -85,7 +85,7 @@ aff4_open(int a_num_img, const TSK_TCHAR * const a_images[], unsigned int a_ssize) { int is_error; - + char* filename; IMG_AFF4_INFO *aff4_info = NULL; TSK_IMG_INFO *img_info = NULL; @@ -97,7 +97,6 @@ aff4_open(int a_num_img, img_info = (TSK_IMG_INFO *) aff4_info; // libaff4 only deals with UTF-8... if Win32 convert wchar_t to utf-8. - char* filename = NULL; #if defined ( TSK_WIN32) size_t newsize = (wcslen(a_images[0]) + 1) * 2; filename = tsk_malloc(newsize); From f37e7e0e29cac6ef6cb1745d04670f2e50b97711 Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Tue, 19 Jun 2018 16:34:08 +0100 Subject: [PATCH 0141/1548] Fixed filename conversion for loading AFF4 images. Cleanup. --- tsk/img/aff4.c | 103 +++++++++++++++++++++++++++----------------- tsk/img/aff4.h | 1 - tsk/tsk_config.h.in | 3 ++ 3 files changed, 67 insertions(+), 40 deletions(-) diff --git a/tsk/img/aff4.c b/tsk/img/aff4.c index e9e448bff3..20c1407b1a 100644 --- a/tsk/img/aff4.c +++ b/tsk/img/aff4.c @@ -70,6 +70,11 @@ aff4_image_close(TSK_IMG_INFO * img_info) AFF4_close(aff4_info->handle); + for (int i = 0; i < img_info->num_img; ++i) { + free(img_info->images[i]); + } + free(img_info->images); + tsk_deinit_lock(&(aff4_info->read_lock)); tsk_img_free(aff4_info); } @@ -84,47 +89,64 @@ TSK_IMG_INFO * aff4_open(int a_num_img, const TSK_TCHAR * const a_images[], unsigned int a_ssize) { - int is_error; - char* filename; IMG_AFF4_INFO *aff4_info = NULL; - TSK_IMG_INFO *img_info = NULL; - if ((aff4_info = (IMG_AFF4_INFO *) tsk_img_malloc(sizeof(IMG_AFF4_INFO))) == NULL) { return NULL; } - img_info = (TSK_IMG_INFO *) aff4_info; + aff4_info->handle = -1; + + TSK_IMG_INFO* img_info = (TSK_IMG_INFO *) aff4_info; + img_info->images = NULL; + img_info->num_img = 0; + + char* filename = NULL; + + // copy the image filename into the img_info + img_info->images = (TSK_TCHAR**) tsk_malloc(sizeof(TSK_TCHAR*)); + if (img_info->images == NULL) { + goto on_error; + } + + const size_t len = TSTRLEN(a_images[0]) + 1; + img_info->images[0] = (TSK_TCHAR*) tsk_malloc(sizeof(TSK_TCHAR) * len); + if (img_info->images[0] == NULL) { + goto on_error; + } + + TSTRNCPY(img_info->images[0], a_images[0], len); + img_info->num_img = 1; // libaff4 handles image assembly // libaff4 only deals with UTF-8... if Win32 convert wchar_t to utf-8. -#if defined ( TSK_WIN32) - size_t newsize = (wcslen(a_images[0]) + 1) * 2; - filename = tsk_malloc(newsize); - if(filename == NULL){ - tsk_error_set_errno(TSK_ERR_IMG_CONVERT); - tsk_error_set_errstr("aff4_open: Unable to convert filename to UTF-8"); - return NULL; +#if defined (TSK_WIN32) + filename = tsk_malloc(len); + if (filename == NULL) { + goto on_error; + } + + UTF8* utf8 = (UTF8*) filename; + const UTF16* utf16 = (UTF16*) a_images[0]; + + const int ret = tsk_UTF16toUTF8_lclorder(&utf16, utf16 + len, &utf8, utf8 + len, TSKstrictConversion); + if (ret != TSKconversionOK) { + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_IMG_CONVERT); + tsk_error_set_errstr("aff4_open: Unable to convert filename to UTF-8"); + goto on_error; } - // TODO: Possible refactor to tsk_UTF16toUTF8? - wcstombs(a_images[0], filename, newsize); #else filename = a_images[0]; #endif // Check the file extension. (bad I know). - is_error = aff4_check_file_signature(filename); - if (is_error) - { + if (aff4_check_file_signature(filename)) { tsk_error_reset(); tsk_error_set_errno(TSK_ERR_IMG_MAGIC); tsk_error_set_errstr("aff4_open: Not an AFF4 file"); - tsk_img_free(aff4_info); if (tsk_verbose) tsk_fprintf(stderr, "Not an AFF4 file\n"); -#if defined ( TSK_WIN32) - free(filename); -#endif - return NULL; + goto on_error; } // Attempt to open the file. @@ -134,15 +156,10 @@ aff4_open(int a_num_img, tsk_error_set_errno(TSK_ERR_IMG_OPEN); tsk_error_set_errstr("aff4_open file: %" PRIttocTSK ": Error opening", a_images[0]); - tsk_img_free(aff4_info); - - if (tsk_verbose != 0) { + if (tsk_verbose) { tsk_fprintf(stderr, "Error opening AFF4 file\n"); } -#if defined ( TSK_WIN32) - free(filename); -#endif - return (NULL); + goto on_error; } // get image size @@ -152,30 +169,38 @@ aff4_open(int a_num_img, tsk_error_set_errno(TSK_ERR_IMG_OPEN); tsk_error_set_errstr("aff4_open file: %" PRIttocTSK ": Error getting size of image", a_images[0]); - tsk_img_free(aff4_info); if (tsk_verbose) { tsk_fprintf(stderr, "Error getting size of AFF4 file\n"); } -#if defined ( TSK_WIN32) - free(filename); -#endif - return (NULL); + AFF4_close(aff4_info->handle); + goto on_error; } - aff4_info->images = a_images; img_info->sector_size = 512; img_info->itype = TSK_IMG_TYPE_AFF4_AFF4; img_info->read = &aff4_image_read; img_info->close = &aff4_image_close; img_info->imgstat = &aff4_image_imgstat; -#if defined ( TSK_WIN32) - free(filename); +#if defined (TSK_WIN32) + free(filename); #endif // initialize the read lock tsk_init_lock(&(aff4_info->read_lock)); - return (img_info); + return img_info; + +on_error: +#if defined (TSK_WIN32) + free(filename); +#endif + for (int i = 0; i < img_info->num_img; ++i) { + free(img_info->images[i]); + } + free(img_info->images); + + tsk_img_free(aff4_info); + return NULL; } -#endif /* HAVE_LIBAFF4 */ +#endif /* HAVE_LIBAFF4 */ diff --git a/tsk/img/aff4.h b/tsk/img/aff4.h index 1c5d29700e..f007e89d7b 100644 --- a/tsk/img/aff4.h +++ b/tsk/img/aff4.h @@ -27,7 +27,6 @@ extern "C" { typedef struct { TSK_IMG_INFO img_info; int handle; - TSK_TCHAR **images; tsk_lock_t read_lock; ///< Lock for reads since libaff4 is not thread safe -- only works if you have a single instance of AFF4_INFO for all threads. } IMG_AFF4_INFO; diff --git a/tsk/tsk_config.h.in b/tsk/tsk_config.h.in index ec138d9a60..e032de0163 100644 --- a/tsk/tsk_config.h.in +++ b/tsk/tsk_config.h.in @@ -3,6 +3,9 @@ /* Define to 1 if using 'alloca.c'. */ #undef C_ALLOCA +/* Define to 1 if you have the header file. */ +#undef HAVE_AFF4_LIBAFF4_C_H + /* Define to 1 if you have the header file. */ #undef HAVE_AFFLIB_AFFLIB_H From 8768df5ea40926bd39e795d3c3ff2f287d689aea Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Wed, 20 Jun 2018 16:59:55 +0100 Subject: [PATCH 0142/1548] Implemented AFF4 signature checking. Checks only for the ZIP magic, but this is better than nothing. --- tsk/img/aff4.c | 40 +++++++++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 7 deletions(-) diff --git a/tsk/img/aff4.c b/tsk/img/aff4.c index 20c1407b1a..85a5fb0d3a 100644 --- a/tsk/img/aff4.c +++ b/tsk/img/aff4.c @@ -16,6 +16,9 @@ #if HAVE_LIBAFF4 #include "aff4.h" +#include +#include + static ssize_t aff4_image_read(TSK_IMG_INFO * img_info, TSK_OFF_T offset, char *buf, size_t len) @@ -79,10 +82,21 @@ aff4_image_close(TSK_IMG_INFO * img_info) tsk_img_free(aff4_info); } -static int aff4_check_file_signature(char* filename) +static int aff4_check_file_signature(const char* path) { - // Implement. - return 0; + // AFF4 images are ZIP archives, check for the ZIP signature + FILE* f; + if (!(f = fopen(path, "rb"))) { + return -1; + } + + char sig[4]; + const size_t len = fread(sig, 1, 4, f); + if (fclose(f)) { + return -1; + } + + return len == 4 && memcmp(sig, "PK\x03\x04", 4) == 0; } TSK_IMG_INFO * @@ -136,14 +150,26 @@ aff4_open(int a_num_img, goto on_error; } #else - filename = a_images[0]; + filename = img_info->images[0]; #endif - // Check the file extension. (bad I know). - if (aff4_check_file_signature(filename)) { + // Check the file signature + switch (aff4_check_file_signature(filename)) { + case -1: + // some sort of I/O failure + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_IMG_MAGIC); + tsk_error_set_errstr("aff4_open: file: %" PRIttocTSK + ": Error opening", a_images[0]); + if (tsk_verbose) + tsk_fprintf(stderr, "Error opening AFF4 file\n"); + goto on_error; + case 0: + // successful read, signature mismatch tsk_error_reset(); tsk_error_set_errno(TSK_ERR_IMG_MAGIC); - tsk_error_set_errstr("aff4_open: Not an AFF4 file"); + tsk_error_set_errstr("aff4_open: file: %" PRIttocTSK + ": Not an AFF4 file", a_images[0]); if (tsk_verbose) tsk_fprintf(stderr, "Not an AFF4 file\n"); goto on_error; From d68e0b726005e1abc81ef9fdf3c12887a3a6670e Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Mon, 12 Jul 2021 17:22:39 +0100 Subject: [PATCH 0143/1548] Whitespace. --- tsk/img/tsk_img.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tsk/img/tsk_img.h b/tsk/img/tsk_img.h index 8ee9f2a7e2..650097a628 100644 --- a/tsk/img/tsk_img.h +++ b/tsk/img/tsk_img.h @@ -74,7 +74,7 @@ extern "C" { TSK_IMG_TYPE_EWF_EWF = 0x0040, ///< EWF version TSK_IMG_TYPE_VMDK_VMDK = 0x0080, ///< VMDK version TSK_IMG_TYPE_VHD_VHD = 0x0100, ///< VHD version - TSK_IMG_TYPE_AFF4_AFF4 = 0x200, ///< AFF4 version + TSK_IMG_TYPE_AFF4_AFF4 = 0x200, ///< AFF4 version TSK_IMG_TYPE_EXTERNAL = 0x1000, ///< external defined format which at least implements TSK_IMG_INFO, used by pytsk TSK_IMG_TYPE_POOL = 0x4000, ///< Pool TSK_IMG_TYPE_LOGICAL = 0x8000, ///< Logical directory From 8f6cf939d8561ca17800de9301dfb9be2668aa46 Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Thu, 8 Sep 2022 18:23:55 +0100 Subject: [PATCH 0144/1548] Cleanup. PRs wouldn't bitrot like this if they were merged more promptly. --- tsk/img/img_open.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/tsk/img/img_open.cpp b/tsk/img/img_open.cpp index cf229fefce..2c566bbac4 100644 --- a/tsk/img/img_open.cpp +++ b/tsk/img/img_open.cpp @@ -294,6 +294,7 @@ tsk_img_open(int num_img, #if HAVE_LIBVHDI case TSK_IMG_TYPE_VHD_VHD: img_info = vhdi_open(num_img, images, a_ssize); +#endif #if HAVE_LIBAFF4 case TSK_IMG_TYPE_AFF4_AFF4: From ad1cf90b26bf02dda2b00bd11e46d5867c2859b9 Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Thu, 8 Sep 2022 18:27:01 +0100 Subject: [PATCH 0145/1548] PRIuOFF -> PRIdOFF. --- tsk/img/aff4.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tsk/img/aff4.c b/tsk/img/aff4.c index 85a5fb0d3a..2ab96f6e8c 100644 --- a/tsk/img/aff4.c +++ b/tsk/img/aff4.c @@ -29,13 +29,13 @@ aff4_image_read(TSK_IMG_INFO * img_info, TSK_OFF_T offset, char *buf, if (tsk_verbose) tsk_fprintf(stderr, - "aff4_image_read: byte offset: %" PRIuOFF " len: %" PRIuSIZE + "aff4_image_read: byte offset: %" PRIdOFF " len: %" PRIuSIZE "\n", offset, len); if (offset > img_info->size) { tsk_error_reset(); tsk_error_set_errno(TSK_ERR_IMG_READ_OFF); - tsk_error_set_errstr("aff4_image_read - %" PRIuOFF, offset); + tsk_error_set_errstr("aff4_image_read - %" PRIdOFF, offset); return -1; } @@ -44,7 +44,7 @@ aff4_image_read(TSK_IMG_INFO * img_info, TSK_OFF_T offset, char *buf, if (cnt < 0) { tsk_error_reset(); tsk_error_set_errno(TSK_ERR_IMG_READ); - tsk_error_set_errstr("aff4_image_read - offset: %" PRIuOFF + tsk_error_set_errstr("aff4_image_read - offset: %" PRIdOFF " - len: %" PRIuSIZE " - %s", offset, len, strerror(errno)); tsk_release_lock(&(aff4_info->read_lock)); return -1; @@ -60,7 +60,7 @@ aff4_image_imgstat(TSK_IMG_INFO * img_info, FILE * hFile) tsk_fprintf(hFile, "IMAGE FILE INFORMATION\n"); tsk_fprintf(hFile, "--------------------------------------------\n"); tsk_fprintf(hFile, "Image Type:\t\taff4\n"); - tsk_fprintf(hFile, "\nSize of data in bytes:\t%" PRIuOFF "\n", img_info->size); + tsk_fprintf(hFile, "\nSize of data in bytes:\t%" PRIuSIZE "\n", img_info->size); // TODO: Expand on this when C API expands to allow dumping TURTLE to FILE* return; From 2891c9b4314934cf94be4550b3b0c9c6070bbc7a Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Thu, 14 Feb 2019 17:32:57 +0000 Subject: [PATCH 0146/1548] Adjustments to aff4 handle for updated libaff4 C API. --- tsk/img/aff4.c | 160 +++++++++++++++++++++++++++++++++++-------------- tsk/img/aff4.h | 4 +- 2 files changed, 118 insertions(+), 46 deletions(-) diff --git a/tsk/img/aff4.c b/tsk/img/aff4.c index 2ab96f6e8c..489e9504f0 100644 --- a/tsk/img/aff4.c +++ b/tsk/img/aff4.c @@ -14,19 +14,52 @@ #include "tsk_img_i.h" #if HAVE_LIBAFF4 + #include "aff4.h" -#include +#include + #include +static char* get_messages(AFF4_Message* msg) { + // find total message length + size_t len = 0; + for (const AFF4_Message* m = msg; m; m = m->next) { + len += strlen(m->message) + 1; + } + + if (len == 0) { + return NULL; + } + + char* ret = (char*) tsk_malloc(len + 1); + + // copy the messages to one string + char* p = ret; + size_t mlen; + for (const AFF4_Message* m = msg; m; m = m->next) { + *p = '\n'; + mlen = strlen(m->message); + strcpy(++p, m->message); + p += mlen; + } + ret[len] = '\0'; + + return ret; +} + +static void free_image_names(TSK_IMG_INFO* img_info) { + for (int i = 0; i < img_info->num_img; ++i) { + free(img_info->images[i]); + } + free(img_info->images); +} + +>>>>>>> ff70c2d76 (Adjustments to aff4 handle for updated libaff4 C API.) static ssize_t -aff4_image_read(TSK_IMG_INFO * img_info, TSK_OFF_T offset, char *buf, +aff4_image_read(TSK_IMG_INFO* img_info, TSK_OFF_T offset, char* buf, size_t len) { - - ssize_t cnt; - IMG_AFF4_INFO *aff4_info = (IMG_AFF4_INFO *) img_info; - if (tsk_verbose) tsk_fprintf(stderr, "aff4_image_read: byte offset: %" PRIdOFF " len: %" PRIuSIZE @@ -39,22 +72,31 @@ aff4_image_read(TSK_IMG_INFO * img_info, TSK_OFF_T offset, char *buf, return -1; } + IMG_AFF4_INFO* aff4_info = (IMG_AFF4_INFO*) img_info; + AFF4_Message* msg = NULL; + tsk_take_lock(&(aff4_info->read_lock)); - cnt = AFF4_read(aff4_info->handle, offset, buf, len); + const ssize_t cnt = AFF4_read(aff4_info->handle, offset, buf, len, &msg); if (cnt < 0) { + char* aff4_msgs = get_messages(msg); + AFF4_free_messages(msg); + tsk_release_lock(&(aff4_info->read_lock)); + tsk_error_reset(); tsk_error_set_errno(TSK_ERR_IMG_READ); tsk_error_set_errstr("aff4_image_read - offset: %" PRIdOFF - " - len: %" PRIuSIZE " - %s", offset, len, strerror(errno)); - tsk_release_lock(&(aff4_info->read_lock)); + " - len: %" PRIuSIZE " - %s: %s%s", + offset, len, strerror(errno), aff4_msgs ? aff4_msgs : ""); + free(aff4_msgs); return -1; } + AFF4_free_messages(msg); tsk_release_lock(&(aff4_info->read_lock)); return cnt; } static void -aff4_image_imgstat(TSK_IMG_INFO * img_info, FILE * hFile) +aff4_image_imgstat(TSK_IMG_INFO* img_info, FILE* hFile) { tsk_fprintf(hFile, "IMAGE FILE INFORMATION\n"); @@ -67,51 +109,62 @@ aff4_image_imgstat(TSK_IMG_INFO * img_info, FILE * hFile) } static void -aff4_image_close(TSK_IMG_INFO * img_info) +aff4_image_close(TSK_IMG_INFO* img_info) { - IMG_AFF4_INFO *aff4_info = (IMG_AFF4_INFO *) img_info; - - AFF4_close(aff4_info->handle); - - for (int i = 0; i < img_info->num_img; ++i) { - free(img_info->images[i]); - } - free(img_info->images); + IMG_AFF4_INFO* aff4_info = (IMG_AFF4_INFO*) img_info; + tsk_take_lock(&(aff4_info->read_lock)); + AFF4_close(aff4_info->handle, NULL); + tsk_release_lock(&(aff4_info->read_lock)); tsk_deinit_lock(&(aff4_info->read_lock)); + + free_image_names(img_info); tsk_img_free(aff4_info); } -static int aff4_check_file_signature(const char* path) +/* +static int +aff4_check_file_signature(const char* filename) { - // AFF4 images are ZIP archives, check for the ZIP signature - FILE* f; - if (!(f = fopen(path, "rb"))) { + const char exp_sig[] = "PK\03\04"; + char act_sig[4]; + + int fd = open(filename, O_RDONLY | O_BINARY); + if (fd < 0) { + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_IMG_OPEN); + tsk_error_set_errstr("aff4 signature testing failed: %s", filename); return -1; } - char sig[4]; - const size_t len = fread(sig, 1, 4, f); - if (fclose(f)) { + const ssize_t len = read(fd, act_sig, 4); + close(fd); + + if (len < 0) { + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_IMG_READ); + tsk_error_set_errstr("aff4 signature testing read failed: %s", filename); return -1; } - return len == 4 && memcmp(sig, "PK\x03\x04", 4) == 0; + return len == sizeof(exp_sig) && + memcmp(act_sig, exp_sig, sizeof(exp_sig)) == 0; } +*/ -TSK_IMG_INFO * +TSK_IMG_INFO* aff4_open(int a_num_img, - const TSK_TCHAR * const a_images[], unsigned int a_ssize) + const TSK_TCHAR* const a_images[], unsigned int a_ssize) { - IMG_AFF4_INFO *aff4_info = NULL; + IMG_AFF4_INFO* aff4_info = NULL; if ((aff4_info = - (IMG_AFF4_INFO *) tsk_img_malloc(sizeof(IMG_AFF4_INFO))) == + (IMG_AFF4_INFO*) tsk_img_malloc(sizeof(IMG_AFF4_INFO))) == NULL) { return NULL; } aff4_info->handle = -1; - TSK_IMG_INFO* img_info = (TSK_IMG_INFO *) aff4_info; + TSK_IMG_INFO* img_info = (TSK_IMG_INFO*) aff4_info; img_info->images = NULL; img_info->num_img = 0; @@ -153,10 +206,12 @@ aff4_open(int a_num_img, filename = img_info->images[0]; #endif +/* // Check the file signature switch (aff4_check_file_signature(filename)) { case -1: - // some sort of I/O failure + + case 0: tsk_error_reset(); tsk_error_set_errno(TSK_ERR_IMG_MAGIC); tsk_error_set_errstr("aff4_open: file: %" PRIttocTSK @@ -173,35 +228,55 @@ aff4_open(int a_num_img, if (tsk_verbose) tsk_fprintf(stderr, "Not an AFF4 file\n"); goto on_error; + case 1: + // ok! } +*/ // Attempt to open the file. - aff4_info->handle = AFF4_open(filename); + AFF4_Message* msg = NULL; + + aff4_info->handle = AFF4_open(filename, &msg); if (aff4_info->handle == -1) { + char* aff4_msgs = get_messages(msg); + AFF4_free_messages(msg); + tsk_error_reset(); tsk_error_set_errno(TSK_ERR_IMG_OPEN); tsk_error_set_errstr("aff4_open file: %" PRIttocTSK - ": Error opening", a_images[0]); + ": Error opening%s", a_images[0], aff4_msgs ? aff4_msgs : ""); + free(aff4_msgs); if (tsk_verbose) { tsk_fprintf(stderr, "Error opening AFF4 file\n"); } goto on_error; } + AFF4_free_messages(msg); + msg = NULL; + // get image size - img_info->size = AFF4_object_size(aff4_info->handle); + img_info->size = AFF4_object_size(aff4_info->handle, &msg); if (img_info->size == 0) { + char* aff4_msgs = get_messages(msg); + AFF4_free_messages(msg); + tsk_error_reset(); tsk_error_set_errno(TSK_ERR_IMG_OPEN); tsk_error_set_errstr("aff4_open file: %" PRIttocTSK - ": Error getting size of image", a_images[0]); + ": Error getting size of image%s", + a_images[0], aff4_msgs ? aff4_msgs : ""); + free(aff4_msgs); if (tsk_verbose) { tsk_fprintf(stderr, "Error getting size of AFF4 file\n"); } - AFF4_close(aff4_info->handle); + AFF4_close(aff4_info->handle, NULL); goto on_error; } + AFF4_free_messages(msg); + msg = NULL; + img_info->sector_size = 512; img_info->itype = TSK_IMG_TYPE_AFF4_AFF4; img_info->read = &aff4_image_read; @@ -212,19 +287,16 @@ aff4_open(int a_num_img, free(filename); #endif - // initialize the read lock + // initialize the API lock tsk_init_lock(&(aff4_info->read_lock)); + return img_info; on_error: #if defined (TSK_WIN32) free(filename); #endif - for (int i = 0; i < img_info->num_img; ++i) { - free(img_info->images[i]); - } - free(img_info->images); - + free_image_names(img_info); tsk_img_free(aff4_info); return NULL; } diff --git a/tsk/img/aff4.h b/tsk/img/aff4.h index f007e89d7b..0ead2695df 100644 --- a/tsk/img/aff4.h +++ b/tsk/img/aff4.h @@ -26,8 +26,8 @@ extern "C" { typedef struct { TSK_IMG_INFO img_info; - int handle; - tsk_lock_t read_lock; ///< Lock for reads since libaff4 is not thread safe -- only works if you have a single instance of AFF4_INFO for all threads. + AFF4_Handle* handle; + tsk_lock_t read_lock; ///< Lock for the handle } IMG_AFF4_INFO; #ifdef __cplusplus From 4e3f187fffffc769a502c4b4cbbeba2892457608 Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Wed, 27 Feb 2019 17:00:40 +0000 Subject: [PATCH 0147/1548] Fixed warnings. --- tsk/img/aff4.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/tsk/img/aff4.c b/tsk/img/aff4.c index 489e9504f0..9849a3aa41 100644 --- a/tsk/img/aff4.c +++ b/tsk/img/aff4.c @@ -85,7 +85,7 @@ aff4_image_read(TSK_IMG_INFO* img_info, TSK_OFF_T offset, char* buf, tsk_error_reset(); tsk_error_set_errno(TSK_ERR_IMG_READ); tsk_error_set_errstr("aff4_image_read - offset: %" PRIdOFF - " - len: %" PRIuSIZE " - %s: %s%s", + " - len: %" PRIuSIZE " - %s: %s", offset, len, strerror(errno), aff4_msgs ? aff4_msgs : ""); free(aff4_msgs); return -1; @@ -162,13 +162,13 @@ aff4_open(int a_num_img, NULL) { return NULL; } - aff4_info->handle = -1; + aff4_info->handle = NULL; TSK_IMG_INFO* img_info = (TSK_IMG_INFO*) aff4_info; img_info->images = NULL; img_info->num_img = 0; - char* filename = NULL; + const char* filename = NULL; // copy the image filename into the img_info img_info->images = (TSK_TCHAR**) tsk_malloc(sizeof(TSK_TCHAR*)); @@ -187,12 +187,12 @@ aff4_open(int a_num_img, // libaff4 only deals with UTF-8... if Win32 convert wchar_t to utf-8. #if defined (TSK_WIN32) - filename = tsk_malloc(len); - if (filename == NULL) { + char* fn = tsk_malloc(len); + if (fn == NULL) { goto on_error; } - UTF8* utf8 = (UTF8*) filename; + UTF8* utf8 = (UTF8*) fn; const UTF16* utf16 = (UTF16*) a_images[0]; const int ret = tsk_UTF16toUTF8_lclorder(&utf16, utf16 + len, &utf8, utf8 + len, TSKstrictConversion); @@ -202,6 +202,8 @@ aff4_open(int a_num_img, tsk_error_set_errstr("aff4_open: Unable to convert filename to UTF-8"); goto on_error; } + + filename = fn; #else filename = img_info->images[0]; #endif @@ -237,7 +239,7 @@ aff4_open(int a_num_img, AFF4_Message* msg = NULL; aff4_info->handle = AFF4_open(filename, &msg); - if (aff4_info->handle == -1) { + if (!aff4_info->handle) { char* aff4_msgs = get_messages(msg); AFF4_free_messages(msg); From 477d6d82e2cae48e18eb71b39e4ea50df708d439 Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Fri, 8 Mar 2019 13:18:40 +0000 Subject: [PATCH 0148/1548] Don't start messages with a newline. Also don't allocate an unnecessary byte. --- tsk/img/aff4.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tsk/img/aff4.c b/tsk/img/aff4.c index 9849a3aa41..3883ec646c 100644 --- a/tsk/img/aff4.c +++ b/tsk/img/aff4.c @@ -32,18 +32,19 @@ static char* get_messages(AFF4_Message* msg) { return NULL; } - char* ret = (char*) tsk_malloc(len + 1); + char* ret = (char*) tsk_malloc(len); // copy the messages to one string char* p = ret; size_t mlen; + for (const AFF4_Message* m = msg; m; m = m->next) { - *p = '\n'; mlen = strlen(m->message); - strcpy(++p, m->message); + strcpy(p, m->message); p += mlen; + *p++ = '\n'; } - ret[len] = '\0'; + ret[len-1] = '\0'; return ret; } From 8e8f36353fcb1a1c19cb1fb9e1aa1a89f435c331 Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Fri, 8 Mar 2019 15:05:25 +0000 Subject: [PATCH 0149/1548] Be super paranoid about null termination of error message strings. --- configure.ac | 2 +- tsk/img/aff4.c | 43 ++++++++++++++++++++++++++++--------------- tsk/tsk_config.h.in | 3 +++ 3 files changed, 32 insertions(+), 16 deletions(-) diff --git a/configure.ac b/configure.ac index 18aeab8ada..cd96b56509 100644 --- a/configure.ac +++ b/configure.ac @@ -65,7 +65,7 @@ AC_FUNC_UTIME_NULL AC_FUNC_VPRINTF dnl AC_CHECK_FUNCS([dup2 gethostname isascii iswprint memset munmap regcomp select setlocale strcasecmp strchr strdup strerror strndup strrchr strtol strtoul strtoull utime wcwidth]) AC_CHECK_FUNCS([ishexnumber err errx warn warnx vasprintf getrusage]) -AC_CHECK_FUNCS([strlcpy strlcat]) +AC_CHECK_FUNCS([strlcpy strlcat strnlen]) AX_PTHREAD([ AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]) diff --git a/tsk/img/aff4.c b/tsk/img/aff4.c index 3883ec646c..aee6d3714f 100644 --- a/tsk/img/aff4.c +++ b/tsk/img/aff4.c @@ -21,31 +21,44 @@ #include +#ifndef HAVE_STRNLEN +static size_t strnlen(const char* s, size_t maxlen) { + const char* z = memchr(s, 0, maxlen); + return z ? z-s : n; +} +#endif + static char* get_messages(AFF4_Message* msg) { - // find total message length - size_t len = 0; - for (const AFF4_Message* m = msg; m; m = m->next) { - len += strlen(m->message) + 1; - } + // count the messages + size_t count = 0; + for (const AFF4_Message* m = msg; m; m = m->next, ++count); - if (len == 0) { - return NULL; + if (count == 0) { + return NULL; } - char* ret = (char*) tsk_malloc(len); + // get message lengths and total length + const size_t maxlen = 1024; + size_t* lengths = tsk_malloc(count * sizeof(size_t)); + size_t total_len = 0; + + int i = 0; + for (const AFF4_Message* m = msg; m; m = m->next, ++i) { + total_len += lengths[i] = strnlen(m->message, maxlen); + } // copy the messages to one string + char* ret = (char*) tsk_malloc(total_len + count); char* p = ret; - size_t mlen; - - for (const AFF4_Message* m = msg; m; m = m->next) { - mlen = strlen(m->message); - strcpy(p, m->message); - p += mlen; + i = 0; + for (const AFF4_Message* m = msg; m; m = m->next, ++i) { + strncpy(p, m->message, lengths[i]); + p += lengths[i]; *p++ = '\n'; } - ret[len-1] = '\0'; + *(p-1) = '\0'; + free(lengths); return ret; } diff --git a/tsk/tsk_config.h.in b/tsk/tsk_config.h.in index e032de0163..47c677b434 100644 --- a/tsk/tsk_config.h.in +++ b/tsk/tsk_config.h.in @@ -148,6 +148,9 @@ /* Define to 1 if you have the 'strlcpy' function. */ #undef HAVE_STRLCPY +/* Define to 1 if you have the `strnlen' function. */ +#undef HAVE_STRNLEN + /* Define to 1 if you have the header file. */ #undef HAVE_SYS_PARAM_H From a58b1f7506282bb12c129b32701522f5e079f684 Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Tue, 12 Mar 2019 14:41:28 +0000 Subject: [PATCH 0150/1548] Moved strnlen implementation to tsk_os.c. --- tsk/base/Makefile.am | 2 +- tsk/base/tsk_os.c | 21 +++++++++++++++++++++ tsk/base/tsk_os.h | 3 +++ tsk/img/aff4.c | 7 ------- 4 files changed, 25 insertions(+), 8 deletions(-) create mode 100644 tsk/base/tsk_os.c diff --git a/tsk/base/Makefile.am b/tsk/base/Makefile.am index 4b6883a4f6..4e6f0e33a8 100644 --- a/tsk/base/Makefile.am +++ b/tsk/base/Makefile.am @@ -3,7 +3,7 @@ AM_CPPFLAGS = -I../.. noinst_LTLIBRARIES = libtskbase.la libtskbase_la_SOURCES = md5c.c mymalloc.c sha1c.c \ crc.c crc.h \ - tsk_endian.c tsk_error.c tsk_list.c tsk_parse.c tsk_printf.c \ + tsk_endian.c tsk_error.c tsk_list.c tsk_os.c tsk_parse.c tsk_printf.c \ tsk_unicode.c tsk_version.c tsk_stack.c XGetopt.c tsk_base_i.h \ tsk_lock.c tsk_error_win32.cpp tsk_unicode.h diff --git a/tsk/base/tsk_os.c b/tsk/base/tsk_os.c new file mode 100644 index 0000000000..5829354ad4 --- /dev/null +++ b/tsk/base/tsk_os.c @@ -0,0 +1,21 @@ +/* + * The Sleuth Kit + * + * Brian Carrier [carrier sleuthkit [dot] org] + * Copyright (c) 2006-2011 Brian Carrier. All Rights reserved + * + * This software is distributed under the Common Public License 1.0 + */ + +#include "tsk_base_i.h" +#include "tsk_base.h" + +#include + +#ifndef HAVE_STRNLEN +size_t +strnlen(const char* s, size_t maxlen) { + const char* z = memchr(s, 0, maxlen); + return z ? z-s : n; +} +#endif diff --git a/tsk/base/tsk_os.h b/tsk/base/tsk_os.h index eb2f8270b3..04608b92a4 100644 --- a/tsk/base/tsk_os.h +++ b/tsk/base/tsk_os.h @@ -119,6 +119,9 @@ typedef int32_t ssize_t; #endif +#ifndef HAVE_STRNLEN +size_t strnlen(const char* s, size_t maxlen); +#endif /* When TSK deals with the outside world (printing / input), the data will * be in either UTF-16 or UTF-8 (Windows or Unix). TSK_TCHAR is defined diff --git a/tsk/img/aff4.c b/tsk/img/aff4.c index aee6d3714f..154f5f19f2 100644 --- a/tsk/img/aff4.c +++ b/tsk/img/aff4.c @@ -21,13 +21,6 @@ #include -#ifndef HAVE_STRNLEN -static size_t strnlen(const char* s, size_t maxlen) { - const char* z = memchr(s, 0, maxlen); - return z ? z-s : n; -} -#endif - static char* get_messages(AFF4_Message* msg) { // count the messages size_t count = 0; From 00f497b3cb8fcfe232382f6baa29fe00e065c26f Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Tue, 12 Mar 2019 14:47:14 +0000 Subject: [PATCH 0151/1548] const --- tsk/base/tsk_os.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tsk/base/tsk_os.c b/tsk/base/tsk_os.c index 5829354ad4..a2d9d3c00d 100644 --- a/tsk/base/tsk_os.c +++ b/tsk/base/tsk_os.c @@ -15,7 +15,7 @@ #ifndef HAVE_STRNLEN size_t strnlen(const char* s, size_t maxlen) { - const char* z = memchr(s, 0, maxlen); + const char* const z = memchr(s, 0, maxlen); return z ? z-s : n; } #endif From d57f7484e9d915037016cd0c99f95d3bca1c91bd Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Tue, 12 Mar 2019 14:57:40 +0000 Subject: [PATCH 0152/1548] Added comment. --- tsk/base/tsk_os.h | 1 + 1 file changed, 1 insertion(+) diff --git a/tsk/base/tsk_os.h b/tsk/base/tsk_os.h index 04608b92a4..a3c47cb9c5 100644 --- a/tsk/base/tsk_os.h +++ b/tsk/base/tsk_os.h @@ -119,6 +119,7 @@ typedef int32_t ssize_t; #endif +/* strnlen is a POSIX function and not part of the C stdlib */ #ifndef HAVE_STRNLEN size_t strnlen(const char* s, size_t maxlen); #endif From 0de8035ea3b4ad0ded0a3bb768f600fd59d95f2d Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Tue, 9 Apr 2019 15:13:12 +0100 Subject: [PATCH 0153/1548] Adjustments for strnlen linkage. --- tsk/base/tsk_os.c | 3 ++- tsk/base/tsk_os.h | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/tsk/base/tsk_os.c b/tsk/base/tsk_os.c index a2d9d3c00d..3bca73b362 100644 --- a/tsk/base/tsk_os.c +++ b/tsk/base/tsk_os.c @@ -10,9 +10,10 @@ #include "tsk_base_i.h" #include "tsk_base.h" +#ifndef HAVE_STRNLEN + #include -#ifndef HAVE_STRNLEN size_t strnlen(const char* s, size_t maxlen) { const char* const z = memchr(s, 0, maxlen); diff --git a/tsk/base/tsk_os.h b/tsk/base/tsk_os.h index a3c47cb9c5..25ab25bb6e 100644 --- a/tsk/base/tsk_os.h +++ b/tsk/base/tsk_os.h @@ -121,7 +121,13 @@ typedef int32_t ssize_t; /* strnlen is a POSIX function and not part of the C stdlib */ #ifndef HAVE_STRNLEN +#ifdef __cplusplus +extern "C" { +#endif size_t strnlen(const char* s, size_t maxlen); +#ifdef __cplusplus +} +#endif #endif /* When TSK deals with the outside world (printing / input), the data will From c004c453986cbd93590de669fa086e6d0fa6cafa Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Tue, 9 Apr 2019 22:43:55 +0100 Subject: [PATCH 0154/1548] Put strnlen replacement into tsk_base_i.c and declaration into tsk_base_i.h, to ensure that tsk_config.h (and thus HAVE_STRNLEN) has been seen already. --- tsk/base/Makefile.am | 25 ++++++++++++++++++++----- tsk/base/tsk_base_i.h | 4 ++++ tsk/base/tsk_os.c | 22 ---------------------- tsk/base/tsk_os.h | 11 ----------- 4 files changed, 24 insertions(+), 38 deletions(-) delete mode 100644 tsk/base/tsk_os.c diff --git a/tsk/base/Makefile.am b/tsk/base/Makefile.am index 4e6f0e33a8..219d64d483 100644 --- a/tsk/base/Makefile.am +++ b/tsk/base/Makefile.am @@ -1,11 +1,26 @@ AM_CPPFLAGS = -I../.. noinst_LTLIBRARIES = libtskbase.la -libtskbase_la_SOURCES = md5c.c mymalloc.c sha1c.c \ - crc.c crc.h \ - tsk_endian.c tsk_error.c tsk_list.c tsk_os.c tsk_parse.c tsk_printf.c \ - tsk_unicode.c tsk_version.c tsk_stack.c XGetopt.c tsk_base_i.h \ - tsk_lock.c tsk_error_win32.cpp tsk_unicode.h +libtskbase_la_SOURCES = \ + crc.c \ + crc.h \ + md5c.c \ + mymalloc.c \ + sha1c.c \ + tsk_base_i.c \ + tsk_base_i.h \ + tsk_endian.c \ + tsk_error.c \ + tsk_error_win32.cpp \ + tsk_list.c \ + tsk_lock.c \ + tsk_parse.c \ + tsk_printf.c \ + tsk_stack.c \ + tsk_unicode.c \ + tsk_unicode.h \ + tsk_version.c \ + XGetopt.c EXTRA_DIST = .indent.pro diff --git a/tsk/base/tsk_base_i.h b/tsk/base/tsk_base_i.h index ffa5cf3459..489decb880 100644 --- a/tsk/base/tsk_base_i.h +++ b/tsk/base/tsk_base_i.h @@ -203,6 +203,10 @@ extern "C" { #define TSK_IS_CNTRL(x) \ (((x) < 0x20) && ((x) >= 0x00)) +/* strnlen is a POSIX function and not part of the C stdlib */ +#ifndef HAVE_STRNLEN +extern size_t strnlen(const char* s, size_t maxlen); +#endif #ifdef __cplusplus } diff --git a/tsk/base/tsk_os.c b/tsk/base/tsk_os.c deleted file mode 100644 index 3bca73b362..0000000000 --- a/tsk/base/tsk_os.c +++ /dev/null @@ -1,22 +0,0 @@ -/* - * The Sleuth Kit - * - * Brian Carrier [carrier sleuthkit [dot] org] - * Copyright (c) 2006-2011 Brian Carrier. All Rights reserved - * - * This software is distributed under the Common Public License 1.0 - */ - -#include "tsk_base_i.h" -#include "tsk_base.h" - -#ifndef HAVE_STRNLEN - -#include - -size_t -strnlen(const char* s, size_t maxlen) { - const char* const z = memchr(s, 0, maxlen); - return z ? z-s : n; -} -#endif diff --git a/tsk/base/tsk_os.h b/tsk/base/tsk_os.h index 25ab25bb6e..6ab702bd6a 100644 --- a/tsk/base/tsk_os.h +++ b/tsk/base/tsk_os.h @@ -119,17 +119,6 @@ typedef int32_t ssize_t; #endif -/* strnlen is a POSIX function and not part of the C stdlib */ -#ifndef HAVE_STRNLEN -#ifdef __cplusplus -extern "C" { -#endif -size_t strnlen(const char* s, size_t maxlen); -#ifdef __cplusplus -} -#endif -#endif - /* When TSK deals with the outside world (printing / input), the data will * be in either UTF-16 or UTF-8 (Windows or Unix). TSK_TCHAR is defined * as the data type needed and the following function map to the required From e1c50fe5853cb3ebe50aeae94b7d9e9d1b1d17ce Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Wed, 10 Apr 2019 12:09:07 +0100 Subject: [PATCH 0155/1548] Added tsk_base_i.c. --- tsk/base/tsk_base_i.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 tsk/base/tsk_base_i.c diff --git a/tsk/base/tsk_base_i.c b/tsk/base/tsk_base_i.c new file mode 100644 index 0000000000..7c0a51c59b --- /dev/null +++ b/tsk/base/tsk_base_i.c @@ -0,0 +1,22 @@ +/* + * The Sleuth Kit + * + * Brian Carrier [carrier sleuthkit [dot] org] + * Copyright (c) 2006-2011 Brian Carrier. All Rights reserved + * + * This software is distributed under the Common Public License 1.0 + */ + +#include "tsk_base_i.h" + +#ifndef HAVE_STRNLEN + +#include + +size_t +strnlen(const char* s, size_t maxlen) { + const char* const z = memchr(s, 0, maxlen); + return z ? z-s : n; +} + +#endif From daccf9c8309c16fd58cdd1963b1343ea3f38aa84 Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Fri, 12 Apr 2019 20:06:16 +0100 Subject: [PATCH 0156/1548] Removed trailing whitespace. --- tsk/img/aff4.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tsk/img/aff4.h b/tsk/img/aff4.h index 0ead2695df..2de81d4819 100644 --- a/tsk/img/aff4.h +++ b/tsk/img/aff4.h @@ -7,7 +7,7 @@ * Brian Carrier. */ -/* +/* * Header files for AFF4-specific data structures and functions. */ From 566ac59ebc2e32aafe87934ae0a0f14e6a589274 Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Fri, 9 Sep 2022 11:40:50 +0100 Subject: [PATCH 0157/1548] Formatting. --- tsk/img/tsk_img.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tsk/img/tsk_img.h b/tsk/img/tsk_img.h index 650097a628..a0fb01058b 100644 --- a/tsk/img/tsk_img.h +++ b/tsk/img/tsk_img.h @@ -71,13 +71,13 @@ extern "C" { TSK_IMG_TYPE_AFF_AFM = 0x0010, ///< AFM AFF Format TSK_IMG_TYPE_AFF_ANY = 0x0020, ///< Any format supported by AFFLIB (including beta ones) - TSK_IMG_TYPE_EWF_EWF = 0x0040, ///< EWF version + TSK_IMG_TYPE_EWF_EWF = 0x0040, ///< EWF version TSK_IMG_TYPE_VMDK_VMDK = 0x0080, ///< VMDK version - TSK_IMG_TYPE_VHD_VHD = 0x0100, ///< VHD version - TSK_IMG_TYPE_AFF4_AFF4 = 0x200, ///< AFF4 version - TSK_IMG_TYPE_EXTERNAL = 0x1000, ///< external defined format which at least implements TSK_IMG_INFO, used by pytsk - TSK_IMG_TYPE_POOL = 0x4000, ///< Pool - TSK_IMG_TYPE_LOGICAL = 0x8000, ///< Logical directory + TSK_IMG_TYPE_VHD_VHD = 0x0100, ///< VHD version + TSK_IMG_TYPE_AFF4_AFF4 = 0x0200, ///< AFF4 version + TSK_IMG_TYPE_EXTERNAL = 0x1000, ///< external defined format which at least implements TSK_IMG_INFO, used by pytsk + TSK_IMG_TYPE_POOL = 0x4000, ///< Pool + TSK_IMG_TYPE_LOGICAL = 0x8000, ///< Logical directory TSK_IMG_TYPE_UNSUPP = 0xffff ///< Unsupported disk image type } TSK_IMG_TYPE_ENUM; From b9a1427684d6b894070a50835cb42849fa3c16f2 Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Fri, 9 Sep 2022 11:55:13 +0100 Subject: [PATCH 0158/1548] Removed stray conflict boundary. --- tsk/img/aff4.c | 1 - 1 file changed, 1 deletion(-) diff --git a/tsk/img/aff4.c b/tsk/img/aff4.c index 154f5f19f2..4e01c7c383 100644 --- a/tsk/img/aff4.c +++ b/tsk/img/aff4.c @@ -62,7 +62,6 @@ static void free_image_names(TSK_IMG_INFO* img_info) { free(img_info->images); } ->>>>>>> ff70c2d76 (Adjustments to aff4 handle for updated libaff4 C API.) static ssize_t aff4_image_read(TSK_IMG_INFO* img_info, TSK_OFF_T offset, char* buf, size_t len) From 78dff1d36e5783ae446fc924e4d01c591d0d0d09 Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Fri, 12 Jul 2019 13:30:28 +0100 Subject: [PATCH 0159/1548] Cleanup. --- tsk/img/aff4.c | 41 ++++++++++------------------------------- 1 file changed, 10 insertions(+), 31 deletions(-) diff --git a/tsk/img/aff4.c b/tsk/img/aff4.c index 4e01c7c383..41fa65cce8 100644 --- a/tsk/img/aff4.c +++ b/tsk/img/aff4.c @@ -55,13 +55,6 @@ static char* get_messages(AFF4_Message* msg) { return ret; } -static void free_image_names(TSK_IMG_INFO* img_info) { - for (int i = 0; i < img_info->num_img; ++i) { - free(img_info->images[i]); - } - free(img_info->images); -} - static ssize_t aff4_image_read(TSK_IMG_INFO* img_info, TSK_OFF_T offset, char* buf, size_t len) @@ -124,7 +117,6 @@ aff4_image_close(TSK_IMG_INFO* img_info) tsk_release_lock(&(aff4_info->read_lock)); tsk_deinit_lock(&(aff4_info->read_lock)); - free_image_names(img_info); tsk_img_free(aff4_info); } @@ -174,23 +166,11 @@ aff4_open(int a_num_img, img_info->images = NULL; img_info->num_img = 0; - const char* filename = NULL; - - // copy the image filename into the img_info - img_info->images = (TSK_TCHAR**) tsk_malloc(sizeof(TSK_TCHAR*)); - if (img_info->images == NULL) { - goto on_error; - } - - const size_t len = TSTRLEN(a_images[0]) + 1; - img_info->images[0] = (TSK_TCHAR*) tsk_malloc(sizeof(TSK_TCHAR) * len); - if (img_info->images[0] == NULL) { - goto on_error; + // a_num_img should be 1; libaff4 handles image assembly + if (!tsk_img_copy_image_names(img_info, a_images, a_num_img)) { + goto on_error; } - TSTRNCPY(img_info->images[0], a_images[0], len); - img_info->num_img = 1; // libaff4 handles image assembly - // libaff4 only deals with UTF-8... if Win32 convert wchar_t to utf-8. #if defined (TSK_WIN32) char* fn = tsk_malloc(len); @@ -209,9 +189,9 @@ aff4_open(int a_num_img, goto on_error; } - filename = fn; + const char* filename = fn; #else - filename = img_info->images[0]; + const char* filename = a_images[0]; #endif /* @@ -260,6 +240,10 @@ aff4_open(int a_num_img, goto on_error; } +#if defined (TSK_WIN32) + free(fn); +#endif + AFF4_free_messages(msg); msg = NULL; @@ -291,10 +275,6 @@ aff4_open(int a_num_img, img_info->close = &aff4_image_close; img_info->imgstat = &aff4_image_imgstat; -#if defined (TSK_WIN32) - free(filename); -#endif - // initialize the API lock tsk_init_lock(&(aff4_info->read_lock)); @@ -302,9 +282,8 @@ aff4_open(int a_num_img, on_error: #if defined (TSK_WIN32) - free(filename); + free(fn); #endif - free_image_names(img_info); tsk_img_free(aff4_info); return NULL; } From ed1d76f49afb58004b83710ffad7ba01363791df Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Fri, 12 Jul 2019 14:31:25 +0100 Subject: [PATCH 0160/1548] Restored accidentally deleted line. --- tsk/img/aff4.c | 1 + 1 file changed, 1 insertion(+) diff --git a/tsk/img/aff4.c b/tsk/img/aff4.c index 41fa65cce8..b54ee97c0f 100644 --- a/tsk/img/aff4.c +++ b/tsk/img/aff4.c @@ -173,6 +173,7 @@ aff4_open(int a_num_img, // libaff4 only deals with UTF-8... if Win32 convert wchar_t to utf-8. #if defined (TSK_WIN32) + const size_t len = TSTRLEN(a_images[0]) + 1; char* fn = tsk_malloc(len); if (fn == NULL) { goto on_error; From 18723c1b19ba19bdf834469d5c9621c30ee94341 Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Tue, 16 Jul 2019 14:59:41 +0100 Subject: [PATCH 0161/1548] Cleaned up image opening error handling. --- tsk/img/aff4.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tsk/img/aff4.c b/tsk/img/aff4.c index b54ee97c0f..54d12223a4 100644 --- a/tsk/img/aff4.c +++ b/tsk/img/aff4.c @@ -263,7 +263,6 @@ aff4_open(int a_num_img, if (tsk_verbose) { tsk_fprintf(stderr, "Error getting size of AFF4 file\n"); } - AFF4_close(aff4_info->handle, NULL); goto on_error; } @@ -285,6 +284,9 @@ aff4_open(int a_num_img, #if defined (TSK_WIN32) free(fn); #endif + if (aff4_info->handle) { + AFF4_close(aff4_info->handle, NULL); + } tsk_img_free(aff4_info); return NULL; } From fdfc720cab0ab76e8d3152949a963654ffc332e4 Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Tue, 16 Jul 2019 13:45:46 +0100 Subject: [PATCH 0162/1548] * tsk_img_open() now errors out if num_img < 0 * tsk_img_open() now errors out if num_img != 1 for AFF4 --- tsk/img/aff4.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/tsk/img/aff4.c b/tsk/img/aff4.c index 54d12223a4..46f9e772db 100644 --- a/tsk/img/aff4.c +++ b/tsk/img/aff4.c @@ -154,6 +154,16 @@ TSK_IMG_INFO* aff4_open(int a_num_img, const TSK_TCHAR* const a_images[], unsigned int a_ssize) { + if (a_num_img != 1) { + tsk_error_set_errstr("aff4_open file: %" PRIttocTSK + ": expected one image filename, was given %d", a_images[0], a_num_img); + + if (tsk_verbose != 0) { + tsk_fprintf(stderr, "aff4 requires exactly 1 image filename for opening\n"); + } + return NULL; + } + IMG_AFF4_INFO* aff4_info = NULL; if ((aff4_info = (IMG_AFF4_INFO*) tsk_img_malloc(sizeof(IMG_AFF4_INFO))) == @@ -166,7 +176,6 @@ aff4_open(int a_num_img, img_info->images = NULL; img_info->num_img = 0; - // a_num_img should be 1; libaff4 handles image assembly if (!tsk_img_copy_image_names(img_info, a_images, a_num_img)) { goto on_error; } From 04e0574374bf894dc843e60eb89e85e7c783a533 Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Fri, 6 Sep 2024 17:03:12 +0100 Subject: [PATCH 0163/1548] Update Java autoconf macros. --- configure.ac | 4 +- m4/ac_prog_java.m4 | 83 --------------------------- m4/ac_prog_java_works.m4 | 101 --------------------------------- m4/ac_prog_javac.m4 | 45 --------------- m4/ac_prog_javac_works.m4 | 36 ------------ m4/ax_prog_java.m4 | 115 ++++++++++++++++++++++++++++++++++++++ m4/ax_prog_java_works.m4 | 91 ++++++++++++++++++++++++++++++ m4/ax_prog_javac.m4 | 79 ++++++++++++++++++++++++++ m4/ax_prog_javac_works.m4 | 72 ++++++++++++++++++++++++ 9 files changed, 359 insertions(+), 267 deletions(-) delete mode 100644 m4/ac_prog_java.m4 delete mode 100644 m4/ac_prog_java_works.m4 delete mode 100644 m4/ac_prog_javac.m4 delete mode 100644 m4/ac_prog_javac_works.m4 create mode 100644 m4/ax_prog_java.m4 create mode 100644 m4/ax_prog_java_works.m4 create mode 100644 m4/ax_prog_javac.m4 create mode 100644 m4/ax_prog_javac_works.m4 diff --git a/configure.ac b/configure.ac index bf0a6c2e7f..a36a20b6ba 100644 --- a/configure.ac +++ b/configure.ac @@ -206,7 +206,7 @@ AM_CONDITIONAL([OFFLINE], [test "x$offline" = xtrue]) dnl Test for the various java things that we need for bindings AS_IF([test "x$enable_java" != "xno"], [ dnl javac is needed to compile the JAR file - AC_PROG_JAVAC + AX_PROG_JAVAC if test "x$JAVAC" != x; then AX_JNI_INCLUDE_DIR for JNI_INCLUDE_DIR in $JNI_INCLUDE_DIRS @@ -219,7 +219,7 @@ AS_IF([test "x$enable_java" != "xno"], [ dnl java is needed by ant dnl we had one report of a system with javac and not java - AC_PROG_JAVA + AX_PROG_JAVA dnl Test is ant is available AC_PATH_PROG([ANT_FOUND], [ant], []) diff --git a/m4/ac_prog_java.m4 b/m4/ac_prog_java.m4 deleted file mode 100644 index 1ba1688702..0000000000 --- a/m4/ac_prog_java.m4 +++ /dev/null @@ -1,83 +0,0 @@ -dnl @synopsis AC_PROG_JAVA -dnl -dnl Here is a summary of the main macros: -dnl -dnl AC_PROG_JAVAC: finds a Java compiler. -dnl -dnl AC_PROG_JAVA: finds a Java virtual machine. -dnl -dnl AC_CHECK_CLASS: finds if we have the given class (beware of -dnl CLASSPATH!). -dnl -dnl AC_CHECK_RQRD_CLASS: finds if we have the given class and stops -dnl otherwise. -dnl -dnl AC_TRY_COMPILE_JAVA: attempt to compile user given source. -dnl -dnl AC_TRY_RUN_JAVA: attempt to compile and run user given source. -dnl -dnl AC_JAVA_OPTIONS: adds Java configure options. -dnl -dnl AC_PROG_JAVA tests an existing Java virtual machine. It uses the -dnl environment variable JAVA then tests in sequence various common -dnl Java virtual machines. For political reasons, it starts with the -dnl free ones. You *must* call [AC_PROG_JAVAC] before. -dnl -dnl If you want to force a specific VM: -dnl -dnl - at the configure.in level, set JAVA=yourvm before calling -dnl AC_PROG_JAVA -dnl -dnl (but after AC_INIT) -dnl -dnl - at the configure level, setenv JAVA -dnl -dnl You can use the JAVA variable in your Makefile.in, with @JAVA@. -dnl -dnl *Warning*: its success or failure can depend on a proper setting of -dnl the CLASSPATH env. variable. -dnl -dnl TODO: allow to exclude virtual machines (rationale: most Java -dnl programs cannot run with some VM like kaffe). -dnl -dnl Note: This is part of the set of autoconf M4 macros for Java -dnl programs. It is VERY IMPORTANT that you download the whole set, -dnl some macros depend on other. Unfortunately, the autoconf archive -dnl does not support the concept of set of macros, so I had to break it -dnl for submission. -dnl -dnl A Web page, with a link to the latest CVS snapshot is at -dnl . -dnl -dnl This is a sample configure.in Process this file with autoconf to -dnl produce a configure script. -dnl -dnl AC_INIT(UnTag.java) -dnl -dnl dnl Checks for programs. -dnl AC_CHECK_CLASSPATH -dnl AC_PROG_JAVAC -dnl AC_PROG_JAVA -dnl -dnl dnl Checks for classes -dnl AC_CHECK_RQRD_CLASS(org.xml.sax.Parser) -dnl AC_CHECK_RQRD_CLASS(com.jclark.xml.sax.Driver) -dnl -dnl AC_OUTPUT(Makefile) -dnl -dnl @category Java -dnl @author Stephane Bortzmeyer -dnl @version 2000-07-19 -dnl @license GPLWithACException - -AC_DEFUN([AC_PROG_JAVA],[ -AC_REQUIRE([AC_EXEEXT])dnl -if test x$JAVAPREFIX = x; then - test x$JAVA = x && AC_CHECK_PROGS(JAVA, kaffe$EXEEXT java$EXEEXT) -else - test x$JAVA = x && AC_CHECK_PROGS(JAVA, kaffe$EXEEXT java$EXEEXT, $JAVAPREFIX) -fi -test x$JAVA = x && AC_MSG_WARN([no acceptable Java virtual machine found in \$PATH]) -AC_PROG_JAVA_WORKS -AC_PROVIDE([$0])dnl -]) diff --git a/m4/ac_prog_java_works.m4 b/m4/ac_prog_java_works.m4 deleted file mode 100644 index 1de52a169c..0000000000 --- a/m4/ac_prog_java_works.m4 +++ /dev/null @@ -1,101 +0,0 @@ -dnl @synopsis AC_PROG_JAVA_WORKS -dnl -dnl Internal use ONLY. -dnl -dnl Note: This is part of the set of autoconf M4 macros for Java -dnl programs. It is VERY IMPORTANT that you download the whole set, -dnl some macros depend on other. Unfortunately, the autoconf archive -dnl does not support the concept of set of macros, so I had to break it -dnl for submission. The general documentation, as well as the sample -dnl configure.in, is included in the AC_PROG_JAVA macro. -dnl -dnl @category Java -dnl @author Stephane Bortzmeyer -dnl @version 2000-07-19 -dnl @license GPLWithACException - -AC_DEFUN([AC_PROG_JAVA_WORKS], [ -AC_CHECK_PROG(uudecode, uudecode$EXEEXT, yes) -if test x$JAVA != x; then -if test x$uudecode = xyes; then -AC_CACHE_CHECK([if uudecode can decode base 64 file], ac_cv_prog_uudecode_base64, [ -dnl /** -dnl * Test.java: used to test if java compiler works. -dnl */ -dnl public class Test -dnl { -dnl -dnl public static void -dnl main( String[] argv ) -dnl { -dnl System.exit (0); -dnl } -dnl -dnl } -cat << \EOF > Test.uue -begin-base64 644 Test.class -yv66vgADAC0AFQcAAgEABFRlc3QHAAQBABBqYXZhL2xhbmcvT2JqZWN0AQAE -bWFpbgEAFihbTGphdmEvbGFuZy9TdHJpbmc7KVYBAARDb2RlAQAPTGluZU51 -bWJlclRhYmxlDAAKAAsBAARleGl0AQAEKEkpVgoADQAJBwAOAQAQamF2YS9s -YW5nL1N5c3RlbQEABjxpbml0PgEAAygpVgwADwAQCgADABEBAApTb3VyY2VG -aWxlAQAJVGVzdC5qYXZhACEAAQADAAAAAAACAAkABQAGAAEABwAAACEAAQAB -AAAABQO4AAyxAAAAAQAIAAAACgACAAAACgAEAAsAAQAPABAAAQAHAAAAIQAB -AAEAAAAFKrcAErEAAAABAAgAAAAKAAIAAAAEAAQABAABABMAAAACABQ= -==== -EOF -if uudecode$EXEEXT Test.uue; then - ac_cv_prog_uudecode_base64=yes -else - echo "configure: __oline__: uudecode had trouble decoding base 64 file 'Test.uue'" >&AC_FD_CC - echo "configure: failed file was:" >&AC_FD_CC - cat Test.uue >&AC_FD_CC - ac_cv_prog_uudecode_base64=no -fi -rm -f Test.uue]) -fi -if test x$ac_cv_prog_uudecode_base64 != xyes; then - rm -f Test.class - AC_MSG_WARN([I have to compile Test.class from scratch]) - if test x$ac_cv_prog_javac_works = xno; then - AC_MSG_WARN([Cannot compile java source. $JAVAC does not work properly]) - fi - if test x$ac_cv_prog_javac_works = x; then - AC_PROG_JAVAC - fi -fi -AC_CACHE_CHECK(if $JAVA works, ac_cv_prog_java_works, [ -JAVA_TEST=Test.java -CLASS_TEST=Test.class -TEST=Test -changequote(, )dnl -cat << \EOF > $JAVA_TEST -/* [#]line __oline__ "configure" */ -public class -Test { -public static void main (String args[]) { - System.exit(0); -} } -EOF -changequote([, ])dnl -if test x$ac_cv_prog_uudecode_base64 != xyes; then - if AC_TRY_COMMAND($JAVAC $JAVACFLAGS $JAVA_TEST) && test -s $CLASS_TEST; then - : - else - echo "configure: failed program was:" >&AC_FD_CC - cat $JAVA_TEST >&AC_FD_CC - AC_MSG_WARN(The Java compiler $JAVAC failed (see config.log, check the CLASSPATH?)) - fi -fi - if AC_TRY_COMMAND($JAVA $JAVAFLAGS $TEST) >/dev/null 2>&1; then - ac_cv_prog_java_works=yes -else - echo "configure: failed program was:" >&AC_FD_CC - cat $JAVA_TEST >&AC_FD_CC - AC_MSG_WARN(The Java VM $JAVA failed (see config.log, check the CLASSPATH?)) -fi -rm -fr $JAVA_TEST $CLASS_TEST Test.uue]) -AC_PROVIDE([$0])dnl -fi -] -) - diff --git a/m4/ac_prog_javac.m4 b/m4/ac_prog_javac.m4 deleted file mode 100644 index ad6cc48e64..0000000000 --- a/m4/ac_prog_javac.m4 +++ /dev/null @@ -1,45 +0,0 @@ -dnl @synopsis AC_PROG_JAVAC -dnl -dnl AC_PROG_JAVAC tests an existing Java compiler. It uses the -dnl environment variable JAVAC then tests in sequence various common -dnl Java compilers. For political reasons, it starts with the free -dnl ones. -dnl -dnl If you want to force a specific compiler: -dnl -dnl - at the configure.in level, set JAVAC=yourcompiler before calling -dnl AC_PROG_JAVAC -dnl -dnl - at the configure level, setenv JAVAC -dnl -dnl You can use the JAVAC variable in your Makefile.in, with @JAVAC@. -dnl -dnl *Warning*: its success or failure can depend on a proper setting of -dnl the CLASSPATH env. variable. -dnl -dnl TODO: allow to exclude compilers (rationale: most Java programs -dnl cannot compile with some compilers like guavac). -dnl -dnl Note: This is part of the set of autoconf M4 macros for Java -dnl programs. It is VERY IMPORTANT that you download the whole set, -dnl some macros depend on other. Unfortunately, the autoconf archive -dnl does not support the concept of set of macros, so I had to break it -dnl for submission. The general documentation, as well as the sample -dnl configure.in, is included in the AC_PROG_JAVA macro. -dnl -dnl @category Java -dnl @author Stephane Bortzmeyer -dnl @version 2000-07-19 -dnl @license GPLWithACException - -AC_DEFUN([AC_PROG_JAVAC],[ -AC_REQUIRE([AC_EXEEXT])dnl -if test "x$JAVAPREFIX" = x; then - test "x$JAVAC" = x && AC_CHECK_PROGS(JAVAC, "gcj$EXEEXT -C" guavac$EXEEXT jikes$EXEEXT javac$EXEEXT) -else - test "x$JAVAC" = x && AC_CHECK_PROGS(JAVAC, "gcj$EXEEXT -C" guavac$EXEEXT jikes$EXEEXT javac$EXEEXT, $JAVAPREFIX) -fi -test "x$JAVAC" = x && AC_MSG_WARN([no acceptable Java compiler found in \$PATH]) -AC_PROG_JAVAC_WORKS -AC_PROVIDE([$0])dnl -]) diff --git a/m4/ac_prog_javac_works.m4 b/m4/ac_prog_javac_works.m4 deleted file mode 100644 index b923332da2..0000000000 --- a/m4/ac_prog_javac_works.m4 +++ /dev/null @@ -1,36 +0,0 @@ -dnl @synopsis AC_PROG_JAVAC_WORKS -dnl -dnl Internal use ONLY. -dnl -dnl Note: This is part of the set of autoconf M4 macros for Java -dnl programs. It is VERY IMPORTANT that you download the whole set, -dnl some macros depend on other. Unfortunately, the autoconf archive -dnl does not support the concept of set of macros, so I had to break it -dnl for submission. The general documentation, as well as the sample -dnl configure.in, is included in the AC_PROG_JAVA macro. -dnl -dnl @category Java -dnl @author Stephane Bortzmeyer -dnl @version 2000-07-19 -dnl @license GPLWithACException - -AC_DEFUN([AC_PROG_JAVAC_WORKS],[ -AC_CACHE_CHECK([if $JAVAC works], ac_cv_prog_javac_works, [ -JAVA_TEST=Test.java -CLASS_TEST=Test.class -cat << \EOF > $JAVA_TEST -/* [#]line __oline__ "configure" */ -public class Test { -} -EOF -if AC_TRY_COMMAND($JAVAC $JAVACFLAGS $JAVA_TEST) >/dev/null 2>&1; then - ac_cv_prog_javac_works=yes -else - AC_MSG_WARN([The Java compiler $JAVAC failed (see config.log, check the CLASSPATH?)]) - echo "configure: failed program was:" >&AC_FD_CC - cat $JAVA_TEST >&AC_FD_CC -fi -rm -f $JAVA_TEST $CLASS_TEST -]) -AC_PROVIDE([$0])dnl -]) diff --git a/m4/ax_prog_java.m4 b/m4/ax_prog_java.m4 new file mode 100644 index 0000000000..c2e6964e2c --- /dev/null +++ b/m4/ax_prog_java.m4 @@ -0,0 +1,115 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_prog_java.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_PROG_JAVA +# +# DESCRIPTION +# +# Here is a summary of the main macros: +# +# AX_PROG_JAVAC: finds a Java compiler. +# +# AX_PROG_JAVA: finds a Java virtual machine. +# +# AX_CHECK_CLASS: finds if we have the given class (beware of CLASSPATH!). +# +# AX_CHECK_RQRD_CLASS: finds if we have the given class and stops +# otherwise. +# +# AX_TRY_COMPILE_JAVA: attempt to compile user given source. +# +# AX_TRY_RUN_JAVA: attempt to compile and run user given source. +# +# AX_JAVA_OPTIONS: adds Java configure options. +# +# AX_PROG_JAVA tests an existing Java virtual machine. It uses the +# environment variable JAVA then tests in sequence various common Java +# virtual machines. For political reasons, it starts with the free ones. +# You *must* call [AX_PROG_JAVAC] before. +# +# If you want to force a specific VM: +# +# - at the configure.in level, set JAVA=yourvm before calling AX_PROG_JAVA +# +# (but after AC_INIT) +# +# - at the configure level, setenv JAVA +# +# You can use the JAVA variable in your Makefile.in, with @JAVA@. +# +# *Warning*: its success or failure can depend on a proper setting of the +# CLASSPATH env. variable. +# +# TODO: allow to exclude virtual machines (rationale: most Java programs +# cannot run with some VM like kaffe). +# +# Note: This is part of the set of autoconf M4 macros for Java programs. +# It is VERY IMPORTANT that you download the whole set, some macros depend +# on other. Unfortunately, the autoconf archive does not support the +# concept of set of macros, so I had to break it for submission. +# +# A Web page, with a link to the latest CVS snapshot is at +# . +# +# This is a sample configure.in Process this file with autoconf to produce +# a configure script. +# +# AC_INIT(UnTag.java) +# +# dnl Checks for programs. +# AC_CHECK_CLASSPATH +# AX_PROG_JAVAC +# AX_PROG_JAVA +# +# dnl Checks for classes +# AX_CHECK_RQRD_CLASS(org.xml.sax.Parser) +# AX_CHECK_RQRD_CLASS(com.jclark.xml.sax.Driver) +# +# AC_OUTPUT(Makefile) +# +# LICENSE +# +# Copyright (c) 2008 Stephane Bortzmeyer +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 10 + +AU_ALIAS([AC_PROG_JAVA], [AX_PROG_JAVA]) +AC_DEFUN([AX_PROG_JAVA],[ +m4_define([m4_ax_prog_java_list], [kaffe java])dnl +AS_IF([test "x$JAVAPREFIX" = x], + [test x$JAVA = x && AC_CHECK_PROGS([JAVA], [m4_ax_prog_java_list])], + [test x$JAVA = x && AC_CHECK_PROGS([JAVA], [m4_ax_prog_java_list], [], [$JAVAPREFIX/bin])]) +test x$JAVA = x && AC_MSG_ERROR([no acceptable Java virtual machine found in \$PATH]) +m4_undefine([m4_ax_prog_java_list])dnl +AX_PROG_JAVA_WORKS +AC_PROVIDE([$0])dnl +]) diff --git a/m4/ax_prog_java_works.m4 b/m4/ax_prog_java_works.m4 new file mode 100644 index 0000000000..bc7052619e --- /dev/null +++ b/m4/ax_prog_java_works.m4 @@ -0,0 +1,91 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_prog_java_works.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_PROG_JAVA_WORKS +# +# DESCRIPTION +# +# Internal use ONLY. +# +# Note: This is part of the set of autoconf M4 macros for Java programs. +# It is VERY IMPORTANT that you download the whole set, some macros depend +# on other. Unfortunately, the autoconf archive does not support the +# concept of set of macros, so I had to break it for submission. The +# general documentation, as well as the sample configure.in, is included +# in the AX_PROG_JAVA macro. +# +# LICENSE +# +# Copyright (c) 2008 Stephane Bortzmeyer +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 11 + +AU_ALIAS([AC_PROG_JAVA_WORKS], [AX_PROG_JAVA_WORKS]) +AC_DEFUN([AX_PROG_JAVA_WORKS], [ + if test x$ac_cv_prog_javac_works = xno; then + AC_MSG_ERROR([Cannot compile java source. $JAVAC does not work properly]) + fi + if test x$ac_cv_prog_javac_works = x; then + AX_PROG_JAVAC + fi +AC_CACHE_CHECK(if $JAVA works, ac_cv_prog_java_works, [ +JAVA_TEST=Test.java +CLASS_TEST=Test.class +TEST=Test +changequote(, )dnl +cat << \EOF > $JAVA_TEST +/* [#]line __oline__ "configure" */ +public class Test { +public static void main (String args[]) { + System.exit (0); +} } +EOF +changequote([, ])dnl + if AC_TRY_COMMAND($JAVAC $JAVACFLAGS $JAVA_TEST) && test -s $CLASS_TEST; then + : + else + echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD + cat $JAVA_TEST >&AS_MESSAGE_LOG_FD + AC_MSG_ERROR(The Java compiler $JAVAC failed (see config.log, check the CLASSPATH?)) + fi +if AC_TRY_COMMAND($JAVA -classpath . $JAVAFLAGS $TEST) >/dev/null 2>&1; then + ac_cv_prog_java_works=yes +else + echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD + cat $JAVA_TEST >&AS_MESSAGE_LOG_FD + AC_MSG_ERROR(The Java VM $JAVA failed (see config.log, check the CLASSPATH?)) +fi +rm -f $JAVA_TEST $CLASS_TEST +]) +AC_PROVIDE([$0])dnl +] +) diff --git a/m4/ax_prog_javac.m4 b/m4/ax_prog_javac.m4 new file mode 100644 index 0000000000..8abb733fce --- /dev/null +++ b/m4/ax_prog_javac.m4 @@ -0,0 +1,79 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_prog_javac.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_PROG_JAVAC +# +# DESCRIPTION +# +# AX_PROG_JAVAC tests an existing Java compiler. It uses the environment +# variable JAVAC then tests in sequence various common Java compilers. For +# political reasons, it starts with the free ones. +# +# If you want to force a specific compiler: +# +# - at the configure.in level, set JAVAC=yourcompiler before calling +# AX_PROG_JAVAC +# +# - at the configure level, setenv JAVAC +# +# You can use the JAVAC variable in your Makefile.in, with @JAVAC@. +# +# *Warning*: its success or failure can depend on a proper setting of the +# CLASSPATH env. variable. +# +# TODO: allow to exclude compilers (rationale: most Java programs cannot +# compile with some compilers like guavac). +# +# Note: This is part of the set of autoconf M4 macros for Java programs. +# It is VERY IMPORTANT that you download the whole set, some macros depend +# on other. Unfortunately, the autoconf archive does not support the +# concept of set of macros, so I had to break it for submission. The +# general documentation, as well as the sample configure.in, is included +# in the AX_PROG_JAVA macro. +# +# LICENSE +# +# Copyright (c) 2008 Stephane Bortzmeyer +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 8 + +AU_ALIAS([AC_PROG_JAVAC], [AX_PROG_JAVAC]) +AC_DEFUN([AX_PROG_JAVAC],[ +m4_define([m4_ax_prog_javac_list],["gcj -C" guavac jikes javac])dnl +AS_IF([test "x$JAVAPREFIX" = x], + [test "x$JAVAC" = x && AC_CHECK_PROGS([JAVAC], [m4_ax_prog_javac_list])], + [test "x$JAVAC" = x && AC_CHECK_PROGS([JAVAC], [m4_ax_prog_javac_list], [], [$JAVAPREFIX/bin])]) +m4_undefine([m4_ax_prog_javac_list])dnl +test "x$JAVAC" = x && AC_MSG_ERROR([no acceptable Java compiler found in \$PATH]) +AX_PROG_JAVAC_WORKS +AC_PROVIDE([$0])dnl +]) diff --git a/m4/ax_prog_javac_works.m4 b/m4/ax_prog_javac_works.m4 new file mode 100644 index 0000000000..9b48149d80 --- /dev/null +++ b/m4/ax_prog_javac_works.m4 @@ -0,0 +1,72 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_prog_javac_works.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_PROG_JAVAC_WORKS +# +# DESCRIPTION +# +# Internal use ONLY. +# +# Note: This is part of the set of autoconf M4 macros for Java programs. +# It is VERY IMPORTANT that you download the whole set, some macros depend +# on other. Unfortunately, the autoconf archive does not support the +# concept of set of macros, so I had to break it for submission. The +# general documentation, as well as the sample configure.in, is included +# in the AX_PROG_JAVA macro. +# +# LICENSE +# +# Copyright (c) 2008 Stephane Bortzmeyer +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 7 + +AU_ALIAS([AC_PROG_JAVAC_WORKS], [AX_PROG_JAVAC_WORKS]) +AC_DEFUN([AX_PROG_JAVAC_WORKS],[ +AC_CACHE_CHECK([if $JAVAC works], ac_cv_prog_javac_works, [ +JAVA_TEST=Test.java +CLASS_TEST=Test.class +cat << \EOF > $JAVA_TEST +/* [#]line __oline__ "configure" */ +public class Test { +} +EOF +if AC_TRY_COMMAND($JAVAC $JAVACFLAGS $JAVA_TEST) >/dev/null 2>&1; then + ac_cv_prog_javac_works=yes +else + AC_MSG_ERROR([The Java compiler $JAVAC failed (see config.log, check the CLASSPATH?)]) + echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD + cat $JAVA_TEST >&AS_MESSAGE_LOG_FD +fi +rm -f $JAVA_TEST $CLASS_TEST +]) +AC_PROVIDE([$0])dnl +]) From 8e1397c0fca6d618b49fd22eb9f9a212dfd276a2 Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Fri, 6 Sep 2024 17:07:52 +0100 Subject: [PATCH 0164/1548] Updated AX_PTHREAD autoconf macro. --- m4/ax_pthread.m4 | 483 +++++++++++++++++++++++++++++++++++------------ 1 file changed, 361 insertions(+), 122 deletions(-) diff --git a/m4/ax_pthread.m4 b/m4/ax_pthread.m4 index 63896322dd..9f35d13914 100644 --- a/m4/ax_pthread.m4 +++ b/m4/ax_pthread.m4 @@ -1,5 +1,5 @@ # =========================================================================== -# http://www.gnu.org/software/autoconf-archive/ax_pthread.html +# https://www.gnu.org/software/autoconf-archive/ax_pthread.html # =========================================================================== # # SYNOPSIS @@ -14,24 +14,32 @@ # flags that are needed. (The user can also force certain compiler # flags/libs to be tested by setting these environment variables.) # -# Also sets PTHREAD_CC to any special C compiler that is needed for -# multi-threaded programs (defaults to the value of CC otherwise). (This -# is necessary on AIX to use the special cc_r compiler alias.) +# Also sets PTHREAD_CC and PTHREAD_CXX to any special C compiler that is +# needed for multi-threaded programs (defaults to the value of CC +# respectively CXX otherwise). (This is necessary on e.g. AIX to use the +# special cc_r/CC_r compiler alias.) # # NOTE: You are assumed to not only compile your program with these flags, -# but also link it with them as well. e.g. you should link with +# but also to link with them as well. For example, you might link with # $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS +# $PTHREAD_CXX $CXXFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS # -# If you are only building threads programs, you may wish to use these +# If you are only building threaded programs, you may wish to use these # variables in your default LIBS, CFLAGS, and CC: # # LIBS="$PTHREAD_LIBS $LIBS" # CFLAGS="$CFLAGS $PTHREAD_CFLAGS" +# CXXFLAGS="$CXXFLAGS $PTHREAD_CFLAGS" # CC="$PTHREAD_CC" +# CXX="$PTHREAD_CXX" # # In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant -# has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to that name -# (e.g. PTHREAD_CREATE_UNDETACHED on AIX). +# has a nonstandard name, this macro defines PTHREAD_CREATE_JOINABLE to +# that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX). +# +# Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the +# PTHREAD_PRIO_INHERIT symbol is defined when compiling with +# PTHREAD_CFLAGS. # # ACTION-IF-FOUND is a list of shell commands to run if a threads library # is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it @@ -45,9 +53,13 @@ # Alejandro Forero Cuervo to the autoconf macro repository. We are also # grateful for the helpful feedback of numerous users. # +# Updated for Autoconf 2.68 by Daniel Richard G. +# # LICENSE # # Copyright (c) 2008 Steven G. Johnson +# Copyright (c) 2011 Daniel Richard G. +# Copyright (c) 2019 Marc Stevens # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the @@ -60,7 +72,7 @@ # Public License for more details. # # You should have received a copy of the GNU General Public License along -# with this program. If not, see . +# with this program. If not, see . # # As a special exception, the respective Autoconf Macro's copyright owner # gives unlimited permission to copy, distribute and modify the configure @@ -75,36 +87,41 @@ # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. -#serial 11 +#serial 31 AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD]) AC_DEFUN([AX_PTHREAD], [ AC_REQUIRE([AC_CANONICAL_HOST]) -AC_LANG_SAVE -AC_LANG_C +AC_REQUIRE([AC_PROG_CC]) +AC_REQUIRE([AC_PROG_SED]) +AC_LANG_PUSH([C]) ax_pthread_ok=no # We used to check for pthread.h first, but this fails if pthread.h -# requires special compiler flags (e.g. on True64 or Sequent). +# requires special compiler flags (e.g. on Tru64 or Sequent). # It gets checked for in the link test anyway. # First of all, check if the user has set any of the PTHREAD_LIBS, # etcetera environment variables, and if threads linking works using # them: -if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then - save_CFLAGS="$CFLAGS" +if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then + ax_pthread_save_CC="$CC" + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + AS_IF([test "x$PTHREAD_CC" != "x"], [CC="$PTHREAD_CC"]) + AS_IF([test "x$PTHREAD_CXX" != "x"], [CXX="$PTHREAD_CXX"]) CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - save_LIBS="$LIBS" LIBS="$PTHREAD_LIBS $LIBS" - AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS]) - AC_TRY_LINK_FUNC(pthread_join, ax_pthread_ok=yes) - AC_MSG_RESULT($ax_pthread_ok) - if test x"$ax_pthread_ok" = xno; then + AC_MSG_CHECKING([for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS]) + AC_LINK_IFELSE([AC_LANG_CALL([], [pthread_join])], [ax_pthread_ok=yes]) + AC_MSG_RESULT([$ax_pthread_ok]) + if test "x$ax_pthread_ok" = "xno"; then PTHREAD_LIBS="" PTHREAD_CFLAGS="" fi - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" + CC="$ax_pthread_save_CC" + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" fi # We must check for the threads library under a number of different @@ -112,12 +129,14 @@ fi # (e.g. DEC) have both -lpthread and -lpthreads, where one of the # libraries is broken (non-POSIX). -# Create a list of thread flags to try. Items starting with a "-" are -# C compiler flags, and other items are library names, except for "none" -# which indicates that we try without any flags at all, and "pthread-config" -# which is a program returning the flags for the Pth emulation library. +# Create a list of thread flags to try. Items with a "," contain both +# C compiler flags (before ",") and linker flags (after ","). Other items +# starting with a "-" are C compiler flags, and remaining items are +# library names, except for "none" which indicates that we try without +# any flags at all, and "pthread-config" which is a program returning +# the flags for the Pth emulation library. -ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread lpthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" +ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" # The ordering *is* (sometimes) important. Some notes on the # individual items follow: @@ -126,68 +145,163 @@ ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread lpthread -pth # none: in case threads are in libc; should be tried before -Kthread and # other compiler flags to prevent continual compiler warnings # -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) -# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) -# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) -# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads) -# -pthreads: Solaris/gcc -# -mthreads: Mingw32/gcc, Lynx/gcc +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64 +# (Note: HP C rejects this with "bad form for `-t' option") +# -pthreads: Solaris/gcc (Note: HP C also rejects) # -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it -# doesn't hurt to check since this sometimes defines pthreads too; -# also defines -D_REENTRANT) -# ... -mt is also the pthreads flag for HP/aCC +# doesn't hurt to check since this sometimes defines pthreads and +# -D_REENTRANT too), HP C (must be checked before -lpthread, which +# is present but should not be used directly; and before -mthreads, +# because the compiler interprets this as "-mt" + "-hreads") +# -mthreads: Mingw32/gcc, Lynx/gcc # pthread: Linux, etcetera # --thread-safe: KAI C++ # pthread-config: use pthread-config program (for GNU Pth library) -case "${host_cpu}-${host_os}" in - *solaris*) +case $host_os in + + freebsd*) + + # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) + # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) + + ax_pthread_flags="-kthread lthread $ax_pthread_flags" + ;; + + hpux*) + + # From the cc(1) man page: "[-mt] Sets various -D flags to enable + # multi-threading and also sets -lpthread." + + ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags" + ;; + + openedition*) + + # IBM z/OS requires a feature-test macro to be defined in order to + # enable POSIX threads at all, so give the user a hint if this is + # not set. (We don't define these ourselves, as they can affect + # other portions of the system API in unpredictable ways.) + + AC_EGREP_CPP([AX_PTHREAD_ZOS_MISSING], + [ +# if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS) + AX_PTHREAD_ZOS_MISSING +# endif + ], + [AC_MSG_WARN([IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support.])]) + ;; + + solaris*) # On Solaris (at least, for some versions), libc contains stubbed # (non-functional) versions of the pthreads routines, so link-based - # tests will erroneously succeed. (We need to link with -pthreads/-mt/ - # -lpthread.) (The stubs are missing pthread_cleanup_push, or rather - # a function called by this macro, so we could check for that, but - # who knows whether they'll stub that too in a future libc.) So, - # we'll just look for -pthreads and -lpthread first: + # tests will erroneously succeed. (N.B.: The stubs are missing + # pthread_cleanup_push, or rather a function called by this macro, + # so we could check for that, but who knows whether they'll stub + # that too in a future libc.) So we'll check first for the + # standard Solaris way of linking pthreads (-mt -lpthread). - ax_pthread_flags="-pthreads pthread -mt -pthread $ax_pthread_flags" + ax_pthread_flags="-mt,-lpthread pthread $ax_pthread_flags" ;; +esac + +# Are we compiling with Clang? + +AC_CACHE_CHECK([whether $CC is Clang], + [ax_cv_PTHREAD_CLANG], + [ax_cv_PTHREAD_CLANG=no + # Note that Autoconf sets GCC=yes for Clang as well as GCC + if test "x$GCC" = "xyes"; then + AC_EGREP_CPP([AX_PTHREAD_CC_IS_CLANG], + [/* Note: Clang 2.7 lacks __clang_[a-z]+__ */ +# if defined(__clang__) && defined(__llvm__) + AX_PTHREAD_CC_IS_CLANG +# endif + ], + [ax_cv_PTHREAD_CLANG=yes]) + fi + ]) +ax_pthread_clang="$ax_cv_PTHREAD_CLANG" + + +# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC) + +# Note that for GCC and Clang -pthread generally implies -lpthread, +# except when -nostdlib is passed. +# This is problematic using libtool to build C++ shared libraries with pthread: +# [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25460 +# [2] https://bugzilla.redhat.com/show_bug.cgi?id=661333 +# [3] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=468555 +# To solve this, first try -pthread together with -lpthread for GCC + +AS_IF([test "x$GCC" = "xyes"], + [ax_pthread_flags="-pthread,-lpthread -pthread -pthreads $ax_pthread_flags"]) + +# Clang takes -pthread (never supported any other flag), but we'll try with -lpthread first - *-darwin*) - ax_pthread_flags="-pthread $ax_pthread_flags" - ;; +AS_IF([test "x$ax_pthread_clang" = "xyes"], + [ax_pthread_flags="-pthread,-lpthread -pthread"]) + + +# The presence of a feature test macro requesting re-entrant function +# definitions is, on some systems, a strong hint that pthreads support is +# correctly enabled + +case $host_os in + darwin* | hpux* | linux* | osf* | solaris*) + ax_pthread_check_macro="_REENTRANT" + ;; + + aix*) + ax_pthread_check_macro="_THREAD_SAFE" + ;; + + *) + ax_pthread_check_macro="--" + ;; esac +AS_IF([test "x$ax_pthread_check_macro" = "x--"], + [ax_pthread_check_cond=0], + [ax_pthread_check_cond="!defined($ax_pthread_check_macro)"]) -if test x"$ax_pthread_ok" = xno; then -for flag in $ax_pthread_flags; do - case $flag in +if test "x$ax_pthread_ok" = "xno"; then +for ax_pthread_try_flag in $ax_pthread_flags; do + + case $ax_pthread_try_flag in none) AC_MSG_CHECKING([whether pthreads work without any flags]) ;; + *,*) + PTHREAD_CFLAGS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\1/"` + PTHREAD_LIBS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\2/"` + AC_MSG_CHECKING([whether pthreads work with "$PTHREAD_CFLAGS" and "$PTHREAD_LIBS"]) + ;; + -*) - AC_MSG_CHECKING([whether pthreads work with $flag]) - PTHREAD_CFLAGS="$flag" + AC_MSG_CHECKING([whether pthreads work with $ax_pthread_try_flag]) + PTHREAD_CFLAGS="$ax_pthread_try_flag" ;; - pthread-config) - AC_CHECK_PROG(ax_pthread_config, pthread-config, yes, no) - if test x"$ax_pthread_config" = xno; then continue; fi - PTHREAD_CFLAGS="`pthread-config --cflags`" - PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" - ;; + pthread-config) + AC_CHECK_PROG([ax_pthread_config], [pthread-config], [yes], [no]) + AS_IF([test "x$ax_pthread_config" = "xno"], [continue]) + PTHREAD_CFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" + ;; *) - AC_MSG_CHECKING([for the pthreads library -l$flag]) - PTHREAD_LIBS="-l$flag" + AC_MSG_CHECKING([for the pthreads library -l$ax_pthread_try_flag]) + PTHREAD_LIBS="-l$ax_pthread_try_flag" ;; esac - save_LIBS="$LIBS" - save_CFLAGS="$CFLAGS" - LIBS="$PTHREAD_LIBS $LIBS" + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" # Check for various functions. We must include pthread.h, # since some functions may be macros. (On the Sequent, we @@ -198,86 +312,211 @@ for flag in $ax_pthread_flags; do # pthread_cleanup_push because it is one of the few pthread # functions on Solaris that doesn't have a non-functional libc stub. # We try pthread_create on general principles. - AC_TRY_LINK([#include - static void routine(void* a) {a=0;} - static void* start_routine(void* a) {return a;}], - [pthread_t th; pthread_attr_t attr; - pthread_create(&th,0,start_routine,0); - pthread_join(th, 0); - pthread_attr_init(&attr); - pthread_cleanup_push(routine, 0); - pthread_cleanup_pop(0); ], - [ax_pthread_ok=yes]) - - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" - - AC_MSG_RESULT($ax_pthread_ok) - if test "x$ax_pthread_ok" = xyes; then - break; - fi + + AC_LINK_IFELSE([AC_LANG_PROGRAM([#include +# if $ax_pthread_check_cond +# error "$ax_pthread_check_macro must be defined" +# endif + static void *some_global = NULL; + static void routine(void *a) + { + /* To avoid any unused-parameter or + unused-but-set-parameter warning. */ + some_global = a; + } + static void *start_routine(void *a) { return a; }], + [pthread_t th; pthread_attr_t attr; + pthread_create(&th, 0, start_routine, 0); + pthread_join(th, 0); + pthread_attr_init(&attr); + pthread_cleanup_push(routine, 0); + pthread_cleanup_pop(0) /* ; */])], + [ax_pthread_ok=yes], + []) + + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" + + AC_MSG_RESULT([$ax_pthread_ok]) + AS_IF([test "x$ax_pthread_ok" = "xyes"], [break]) PTHREAD_LIBS="" PTHREAD_CFLAGS="" done fi + +# Clang needs special handling, because older versions handle the -pthread +# option in a rather... idiosyncratic way + +if test "x$ax_pthread_clang" = "xyes"; then + + # Clang takes -pthread; it has never supported any other flag + + # (Note 1: This will need to be revisited if a system that Clang + # supports has POSIX threads in a separate library. This tends not + # to be the way of modern systems, but it's conceivable.) + + # (Note 2: On some systems, notably Darwin, -pthread is not needed + # to get POSIX threads support; the API is always present and + # active. We could reasonably leave PTHREAD_CFLAGS empty. But + # -pthread does define _REENTRANT, and while the Darwin headers + # ignore this macro, third-party headers might not.) + + # However, older versions of Clang make a point of warning the user + # that, in an invocation where only linking and no compilation is + # taking place, the -pthread option has no effect ("argument unused + # during compilation"). They expect -pthread to be passed in only + # when source code is being compiled. + # + # Problem is, this is at odds with the way Automake and most other + # C build frameworks function, which is that the same flags used in + # compilation (CFLAGS) are also used in linking. Many systems + # supported by AX_PTHREAD require exactly this for POSIX threads + # support, and in fact it is often not straightforward to specify a + # flag that is used only in the compilation phase and not in + # linking. Such a scenario is extremely rare in practice. + # + # Even though use of the -pthread flag in linking would only print + # a warning, this can be a nuisance for well-run software projects + # that build with -Werror. So if the active version of Clang has + # this misfeature, we search for an option to squash it. + + AC_CACHE_CHECK([whether Clang needs flag to prevent "argument unused" warning when linking with -pthread], + [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG], + [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown + # Create an alternate version of $ac_link that compiles and + # links in two steps (.c -> .o, .o -> exe) instead of one + # (.c -> exe), because the warning occurs only in the second + # step + ax_pthread_save_ac_link="$ac_link" + ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g' + ax_pthread_link_step=`AS_ECHO(["$ac_link"]) | sed "$ax_pthread_sed"` + ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)" + ax_pthread_save_CFLAGS="$CFLAGS" + for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do + AS_IF([test "x$ax_pthread_try" = "xunknown"], [break]) + CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS" + ac_link="$ax_pthread_save_ac_link" + AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])], + [ac_link="$ax_pthread_2step_ac_link" + AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])], + [break]) + ]) + done + ac_link="$ax_pthread_save_ac_link" + CFLAGS="$ax_pthread_save_CFLAGS" + AS_IF([test "x$ax_pthread_try" = "x"], [ax_pthread_try=no]) + ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try" + ]) + + case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in + no | unknown) ;; + *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;; + esac + +fi # $ax_pthread_clang = yes + + + # Various other checks: -if test "x$ax_pthread_ok" = xyes; then - save_LIBS="$LIBS" - LIBS="$PTHREAD_LIBS $LIBS" - save_CFLAGS="$CFLAGS" +if test "x$ax_pthread_ok" = "xyes"; then + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. - AC_MSG_CHECKING([for joinable pthread attribute]) - attr_name=unknown - for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do - AC_TRY_LINK([#include ], [int attr=$attr; return attr;], - [attr_name=$attr; break]) - done - AC_MSG_RESULT($attr_name) - if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then - AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name, - [Define to necessary symbol if this constant - uses a non-standard name on your system.]) - fi + AC_CACHE_CHECK([for joinable pthread attribute], + [ax_cv_PTHREAD_JOINABLE_ATTR], + [ax_cv_PTHREAD_JOINABLE_ATTR=unknown + for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], + [int attr = $ax_pthread_attr; return attr /* ; */])], + [ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break], + []) + done + ]) + AS_IF([test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \ + test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \ + test "x$ax_pthread_joinable_attr_defined" != "xyes"], + [AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE], + [$ax_cv_PTHREAD_JOINABLE_ATTR], + [Define to necessary symbol if this constant + uses a non-standard name on your system.]) + ax_pthread_joinable_attr_defined=yes + ]) - AC_MSG_CHECKING([if more special flags are required for pthreads]) - flag=no - case "${host_cpu}-${host_os}" in - *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";; - *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";; - esac - AC_MSG_RESULT(${flag}) - if test "x$flag" != xno; then - PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS" - fi + AC_CACHE_CHECK([whether more special flags are required for pthreads], + [ax_cv_PTHREAD_SPECIAL_FLAGS], + [ax_cv_PTHREAD_SPECIAL_FLAGS=no + case $host_os in + solaris*) + ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS" + ;; + esac + ]) + AS_IF([test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \ + test "x$ax_pthread_special_flags_added" != "xyes"], + [PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS" + ax_pthread_special_flags_added=yes]) - LIBS="$save_LIBS" - CFLAGS="$save_CFLAGS" + AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT], + [ax_cv_PTHREAD_PRIO_INHERIT], + [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[int i = PTHREAD_PRIO_INHERIT; + return i;]])], + [ax_cv_PTHREAD_PRIO_INHERIT=yes], + [ax_cv_PTHREAD_PRIO_INHERIT=no]) + ]) + AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \ + test "x$ax_pthread_prio_inherit_defined" != "xyes"], + [AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], [1], [Have PTHREAD_PRIO_INHERIT.]) + ax_pthread_prio_inherit_defined=yes + ]) - # More AIX lossage: must compile with xlc_r or cc_r - if test x"$GCC" != xyes; then - AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC}) - else - PTHREAD_CC=$CC - fi -else - PTHREAD_CC="$CC" + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" + + # More AIX lossage: compile with *_r variant + if test "x$GCC" != "xyes"; then + case $host_os in + aix*) + AS_CASE(["x/$CC"], + [x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6], + [#handle absolute path differently from PATH based program lookup + AS_CASE(["x$CC"], + [x/*], + [ + AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"]) + AS_IF([test "x${CXX}" != "x"], [AS_IF([AS_EXECUTABLE_P([${CXX}_r])],[PTHREAD_CXX="${CXX}_r"])]) + ], + [ + AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC]) + AS_IF([test "x${CXX}" != "x"], [AC_CHECK_PROGS([PTHREAD_CXX],[${CXX}_r],[$CXX])]) + ] + ) + ]) + ;; + esac + fi fi -AC_SUBST(PTHREAD_LIBS) -AC_SUBST(PTHREAD_CFLAGS) -AC_SUBST(PTHREAD_CC) +test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" +test -n "$PTHREAD_CXX" || PTHREAD_CXX="$CXX" + +AC_SUBST([PTHREAD_LIBS]) +AC_SUBST([PTHREAD_CFLAGS]) +AC_SUBST([PTHREAD_CC]) +AC_SUBST([PTHREAD_CXX]) # Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: -if test x"$ax_pthread_ok" = xyes; then - ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1]) +if test "x$ax_pthread_ok" = "xyes"; then + ifelse([$1],,[AC_DEFINE([HAVE_PTHREAD],[1],[Define if you have POSIX threads libraries and header files.])],[$1]) : else ax_pthread_ok=no $2 fi -AC_LANG_RESTORE +AC_LANG_POP ])dnl AX_PTHREAD From b5bcc68db2e873c424ab129916aa773295a61a34 Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Fri, 6 Sep 2024 17:09:53 +0100 Subject: [PATCH 0165/1548] Ran autoupdate. Removed sections marked obsolete. We can rely on having C90 headers by now. --- configure.ac | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/configure.ac b/configure.ac index a36a20b6ba..c2d11cea84 100644 --- a/configure.ac +++ b/configure.ac @@ -1,15 +1,15 @@ dnl -*- Autoconf -*- dnl Process this file with autoconf to produce a configure script. -AC_PREREQ(2.59) +AC_PREREQ([2.71]) -AC_INIT(sleuthkit, 4.12.1) +AC_INIT([sleuthkit],[4.12.1]) AC_CONFIG_AUX_DIR([config]) AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_SRCDIR([tsk/base/tsk_base.h]) AC_CONFIG_HEADERS([tsk/tsk_config.h]) AM_INIT_AUTOMAKE([foreign subdir-objects tar-ustar]) -AM_PROG_LIBTOOL +LT_INIT AM_MAINTAINER_MODE dnl Checks for programs. @@ -25,7 +25,6 @@ AC_PATH_PROG(PERL, perl) TSK_CHECK_PROG_PKGCONFIG dnl Checks for header files. -AC_HEADER_STDC dnl AC_HEADER_MAJOR dnl AC_HEADER_SYS_WAIT dnl AC_CHECK_HEADERS([fcntl.h inttypes.h limits.h locale.h memory.h netinet/in.h stdint.h stdlib.h string.h sys/ioctl.h sys/param.h sys/time.h unistd.h utime.h wchar.h wctype.h]) @@ -39,7 +38,7 @@ AC_TYPE_MODE_T AC_TYPE_OFF_T AC_TYPE_SIZE_T dnl AC_CHECK_MEMBERS([struct stat.st_rdev]) -dnl AC_HEADER_TIME + dnl AC_STRUCT_TM dnl check for large file support From b936db1d4e94afa0b19470fdc4d7434a51d4a72f Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Fri, 6 Sep 2024 17:16:02 +0100 Subject: [PATCH 0166/1548] Whitspace. --- configure.ac | 1 - 1 file changed, 1 deletion(-) diff --git a/configure.ac b/configure.ac index c2d11cea84..1daa5c1f6c 100644 --- a/configure.ac +++ b/configure.ac @@ -38,7 +38,6 @@ AC_TYPE_MODE_T AC_TYPE_OFF_T AC_TYPE_SIZE_T dnl AC_CHECK_MEMBERS([struct stat.st_rdev]) - dnl AC_STRUCT_TM dnl check for large file support From 4133467b05af7cdb150f8a75418761d09458ecd5 Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Fri, 6 Sep 2024 17:23:37 +0100 Subject: [PATCH 0167/1548] Added Catch2 checks to configure.ac. --- configure.ac | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/configure.ac b/configure.ac index bf0a6c2e7f..7f3f7cf47c 100644 --- a/configure.ac +++ b/configure.ac @@ -192,6 +192,11 @@ AS_IF([test "x$enable_cppunit" != "xno"], [ AM_CONDITIONAL([HAVE_CPPUNIT],[test "x$ac_cv_cppunit" = xyes]) +dnl check for Catch2 +AX_PKG_CHECK_MODULES([CATCH2], [], [catch2-with-main], [with_catch2=yes], [with_catch2=no]) +CATCH2_CPPFLAGS="-DCATCH_CONFIG_ENABLE_ALL_STRINGMAKERS" +AC_SUBST([CATCH2_CPPFLAGS]) + dnl check for user online input AC_ARG_ENABLE([offline], [ AS_HELP_STRING([--enable-offline],[Turn on offline mode])], @@ -359,6 +364,7 @@ Building: zlib support: $ax_zlib Features: + Catch2 support: $with_catch2 cppunit support: $ac_cv_cppunit Java/JNI support: $ax_java_support Multithreading: $ax_multithread From a7686f33fab78f699eed72c983cf8214bbe9889c Mon Sep 17 00:00:00 2001 From: Joel Uckelman Date: Fri, 6 Sep 2024 17:40:05 +0100 Subject: [PATCH 0168/1548] Converted image file split tests to use Catch2. --- unit_tests/img/Makefile.am | 11 +-- unit_tests/img/mult_files_test.cpp | 103 ++++++++++++++--------------- unit_tests/img/mult_files_test.h | 25 ------- 3 files changed, 56 insertions(+), 83 deletions(-) delete mode 100644 unit_tests/img/mult_files_test.h diff --git a/unit_tests/img/Makefile.am b/unit_tests/img/Makefile.am index 6a2cf883dd..7021b338d4 100644 --- a/unit_tests/img/Makefile.am +++ b/unit_tests/img/Makefile.am @@ -1,10 +1,11 @@ -AM_CPPFLAGS = -I../.. $(CPPUNIT_CFLAGS) -AM_CXXFLAGS += $(CPPUNIT_CFLAGS) -LDADD = ../../tsk/libtsk.la $(CPPUNIT_LIBS) -LDFLAGS = -static +AM_CPPFLAGS = -I../.. check_PROGRAMS = test_img -test_img_SOURCES= ../runner.cpp mult_files_test.cpp ../../tsk/img/mult_files.cpp + +test_img_CPPFLAGS = $(AM_CPPFLAGS) $(CATCH2_CPPFLAGS) +test_img_CFLAGS = $(AM_CFLAGS) $(CATCH2_CFLAGS) +test_img_LDADD = ../../tsk/libtsk.la $(CATCH2_LIBS) +test_img_SOURCES = mult_files_test.cpp ../../tsk/img/mult_files.cpp TESTS = $(check_PROGRAMS) diff --git a/unit_tests/img/mult_files_test.cpp b/unit_tests/img/mult_files_test.cpp index 9edd5d12ee..66c5f1cf3c 100644 --- a/unit_tests/img/mult_files_test.cpp +++ b/unit_tests/img/mult_files_test.cpp @@ -1,11 +1,8 @@ -#include "mult_files_test.h" - #include "tsk/img/mult_files.h" -// Registers the fixture into the 'registry' -CPPUNIT_TEST_SUITE_REGISTRATION(MultFilesTest); +#include -void MultFilesTest::testSegmentsAlphabetic() { +TEST_CASE("testSegmentsAlphabetic") { TSK_OSTRINGSTREAM os; TSK_STRING base = _TSK_T("x"); @@ -13,23 +10,23 @@ void MultFilesTest::testSegmentsAlphabetic() { const TSK_STRING name = base + sep; const auto pfunc = getSegmentPattern((name + _TSK_T("aaa")).c_str()); - CPPUNIT_ASSERT(pfunc(1, os) == name + _TSK_T("aab")); + CHECK(pfunc(1, os) == name + _TSK_T("aab")); os.str(_TSK_T("")); - CPPUNIT_ASSERT(pfunc(25, os) == name + _TSK_T("aaz")); + CHECK(pfunc(25, os) == name + _TSK_T("aaz")); os.str(_TSK_T("")); - CPPUNIT_ASSERT(pfunc(26, os) == name + _TSK_T("aba")); + CHECK(pfunc(26, os) == name + _TSK_T("aba")); os.str(_TSK_T("")); - CPPUNIT_ASSERT(pfunc(51, os) == name + _TSK_T("abz")); + CHECK(pfunc(51, os) == name + _TSK_T("abz")); os.str(_TSK_T("")); - CPPUNIT_ASSERT(pfunc(52, os) == name + _TSK_T("aca")); + CHECK(pfunc(52, os) == name + _TSK_T("aca")); os.str(_TSK_T("")); - CPPUNIT_ASSERT(pfunc(675, os) == name + _TSK_T("azz")); + CHECK(pfunc(675, os) == name + _TSK_T("azz")); os.str(_TSK_T("")); - CPPUNIT_ASSERT(pfunc(676, os) == name + _TSK_T("baa")); + CHECK(pfunc(676, os) == name + _TSK_T("baa")); os.str(_TSK_T("")); - CPPUNIT_ASSERT(pfunc(17575, os) == name + _TSK_T("zzz")); + CHECK(pfunc(17575, os) == name + _TSK_T("zzz")); os.str(_TSK_T("")); - CPPUNIT_ASSERT(pfunc(17576, os) == _TSK_T("")); + CHECK(pfunc(17576, os) == _TSK_T("")); os.str(_TSK_T("")); } @@ -37,59 +34,59 @@ void MultFilesTest::testSegmentsAlphabetic() { const TSK_STRING name = base + sep; const auto pfunc = getSegmentPattern((name + _TSK_T("aaaa")).c_str()); - CPPUNIT_ASSERT(pfunc(1, os) == name + _TSK_T("aaab")); + CHECK(pfunc(1, os) == name + _TSK_T("aaab")); os.str(_TSK_T("")); - CPPUNIT_ASSERT(pfunc(25, os) == name + _TSK_T("aaaz")); + CHECK(pfunc(25, os) == name + _TSK_T("aaaz")); os.str(_TSK_T("")); - CPPUNIT_ASSERT(pfunc(26, os) == name + _TSK_T("aaba")); + CHECK(pfunc(26, os) == name + _TSK_T("aaba")); os.str(_TSK_T("")); - CPPUNIT_ASSERT(pfunc(51, os) == name + _TSK_T("aabz")); + CHECK(pfunc(51, os) == name + _TSK_T("aabz")); os.str(_TSK_T("")); - CPPUNIT_ASSERT(pfunc(52, os) == name + _TSK_T("aaca")); + CHECK(pfunc(52, os) == name + _TSK_T("aaca")); os.str(_TSK_T("")); - CPPUNIT_ASSERT(pfunc(675, os) == name + _TSK_T("aazz")); + CHECK(pfunc(675, os) == name + _TSK_T("aazz")); os.str(_TSK_T("")); - CPPUNIT_ASSERT(pfunc(676, os) == name + _TSK_T("abaa")); + CHECK(pfunc(676, os) == name + _TSK_T("abaa")); os.str(_TSK_T("")); - CPPUNIT_ASSERT(pfunc(17575, os) == name + _TSK_T("azzz")); + CHECK(pfunc(17575, os) == name + _TSK_T("azzz")); os.str(_TSK_T("")); - CPPUNIT_ASSERT(pfunc(17576, os) == name + _TSK_T("baaa")); + CHECK(pfunc(17576, os) == name + _TSK_T("baaa")); os.str(_TSK_T("")); } } -void MultFilesTest::testSegmentsBin() { +TEST_CASE("testSegmentsBin") { TSK_OSTRINGSTREAM os; const auto pfunc = getSegmentPattern(_TSK_T("file.bin")); - CPPUNIT_ASSERT(pfunc(1, os) == _TSK_T("file(2).bin")); + CHECK(pfunc(1, os) == _TSK_T("file(2).bin")); os.str(_TSK_T("")); - CPPUNIT_ASSERT(pfunc(9, os) == _TSK_T("file(10).bin")); + CHECK(pfunc(9, os) == _TSK_T("file(10).bin")); os.str(_TSK_T("")); - CPPUNIT_ASSERT(pfunc(99, os) == _TSK_T("file(100).bin")); + CHECK(pfunc(99, os) == _TSK_T("file(100).bin")); os.str(_TSK_T("")); - CPPUNIT_ASSERT(pfunc(999, os) == _TSK_T("file(1000).bin")); + CHECK(pfunc(999, os) == _TSK_T("file(1000).bin")); } -void MultFilesTest::testSegmentsDmg() { +TEST_CASE("testSegmentsDmg") { TSK_OSTRINGSTREAM os; const auto pfunc = getSegmentPattern(_TSK_T("file.dmg")); - CPPUNIT_ASSERT(pfunc(1, os) == _TSK_T("file.002.dmgpart")); + CHECK(pfunc(1, os) == _TSK_T("file.002.dmgpart")); os.str(_TSK_T("")); - CPPUNIT_ASSERT(pfunc(9, os) == _TSK_T("file.010.dmgpart")); + CHECK(pfunc(9, os) == _TSK_T("file.010.dmgpart")); os.str(_TSK_T("")); - CPPUNIT_ASSERT(pfunc(99, os) == _TSK_T("file.100.dmgpart")); + CHECK(pfunc(99, os) == _TSK_T("file.100.dmgpart")); os.str(_TSK_T("")); - CPPUNIT_ASSERT(pfunc(999, os) == _TSK_T("file.1000.dmgpart")); + CHECK(pfunc(999, os) == _TSK_T("file.1000.dmgpart")); } -void MultFilesTest::testSegmentsNone() { +TEST_CASE("testSegmentsNone") { const auto pfunc = getSegmentPattern(_TSK_T("some.img")); - CPPUNIT_ASSERT(!pfunc); + CHECK(!pfunc); } -void MultFilesTest::testSegmentsNumericOneBased() { +TEST_CASE("testSegmentsNumericOneBased") { TSK_OSTRINGSTREAM os; TSK_STRING base = _TSK_T("file"); @@ -97,30 +94,30 @@ void MultFilesTest::testSegmentsNumericOneBased() { const TSK_STRING name = base + sep; const auto pfunc = getSegmentPattern((name + _TSK_T("001")).c_str()); os.str(_TSK_T("")); - CPPUNIT_ASSERT(pfunc(1, os) == name + _TSK_T("002")); + CHECK(pfunc(1, os) == name + _TSK_T("002")); os.str(_TSK_T("")); - CPPUNIT_ASSERT(pfunc(9, os) == name + _TSK_T("010")); + CHECK(pfunc(9, os) == name + _TSK_T("010")); os.str(_TSK_T("")); - CPPUNIT_ASSERT(pfunc(99, os) == name + _TSK_T("100")); + CHECK(pfunc(99, os) == name + _TSK_T("100")); os.str(_TSK_T("")); - CPPUNIT_ASSERT(pfunc(999, os) == name + _TSK_T("1000")); + CHECK(pfunc(999, os) == name + _TSK_T("1000")); } for (TSK_TCHAR sep: {_TSK_T('.'), _TSK_T('_')}) { const TSK_STRING name = base + sep; const auto pfunc = getSegmentPattern((name + _TSK_T("00001")).c_str()); os.str(_TSK_T("")); - CPPUNIT_ASSERT(pfunc(1, os) == name + _TSK_T("00002")); + CHECK(pfunc(1, os) == name + _TSK_T("00002")); os.str(_TSK_T("")); - CPPUNIT_ASSERT(pfunc(9, os) == name + _TSK_T("00010")); + CHECK(pfunc(9, os) == name + _TSK_T("00010")); os.str(_TSK_T("")); - CPPUNIT_ASSERT(pfunc(99, os) == name + _TSK_T("00100")); + CHECK(pfunc(99, os) == name + _TSK_T("00100")); os.str(_TSK_T("")); - CPPUNIT_ASSERT(pfunc(999, os) == name + _TSK_T("01000")); + CHECK(pfunc(999, os) == name + _TSK_T("01000")); } } -void MultFilesTest::testSegmentsNumericZeroBased() { +TEST_CASE("testSegmentsNumericZeroBased") { TSK_OSTRINGSTREAM os; TSK_STRING base = _TSK_T("file"); @@ -128,25 +125,25 @@ void MultFilesTest::testSegmentsNumericZeroBased() { const TSK_STRING name = base + sep; const auto pfunc = getSegmentPattern((name + _TSK_T("000")).c_str()); os.str(_TSK_T("")); - CPPUNIT_ASSERT(pfunc(1, os) == name + _TSK_T("001")); + CHECK(pfunc(1, os) == name + _TSK_T("001")); os.str(_TSK_T("")); - CPPUNIT_ASSERT(pfunc(10, os) == name + _TSK_T("010")); + CHECK(pfunc(10, os) == name + _TSK_T("010")); os.str(_TSK_T("")); - CPPUNIT_ASSERT(pfunc(100, os) == name + _TSK_T("100")); + CHECK(pfunc(100, os) == name + _TSK_T("100")); os.str(_TSK_T("")); - CPPUNIT_ASSERT(pfunc(1000, os) == name + _TSK_T("1000")); + CHECK(pfunc(1000, os) == name + _TSK_T("1000")); } for (TSK_TCHAR sep: {_TSK_T('.'), _TSK_T('_')}) { const TSK_STRING name = base + sep; const auto pfunc = getSegmentPattern((name + _TSK_T("00000")).c_str()); os.str(_TSK_T("")); - CPPUNIT_ASSERT(pfunc(1, os) == name + _TSK_T("00001")); + CHECK(pfunc(1, os) == name + _TSK_T("00001")); os.str(_TSK_T("")); - CPPUNIT_ASSERT(pfunc(10, os) == name + _TSK_T("00010")); + CHECK(pfunc(10, os) == name + _TSK_T("00010")); os.str(_TSK_T("")); - CPPUNIT_ASSERT(pfunc(100, os) == name + _TSK_T("00100")); + CHECK(pfunc(100, os) == name + _TSK_T("00100")); os.str(_TSK_T("")); - CPPUNIT_ASSERT(pfunc(1000, os) == name + _TSK_T("01000")); + CHECK(pfunc(1000, os) == name + _TSK_T("01000")); } } diff --git a/unit_tests/img/mult_files_test.h b/unit_tests/img/mult_files_test.h deleted file mode 100644 index c9a16e0980..0000000000 --- a/unit_tests/img/mult_files_test.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef MULT_FILES_TEST_H -#define MULT_FILES_TEST_H - -#include - -class MultFilesTest : public CppUnit::TestFixture { - CPPUNIT_TEST_SUITE(MultFilesTest); - CPPUNIT_TEST(testSegmentsAlphabetic); - CPPUNIT_TEST(testSegmentsBin); - CPPUNIT_TEST(testSegmentsDmg); - CPPUNIT_TEST(testSegmentsNone); - CPPUNIT_TEST(testSegmentsNumericOneBased); - CPPUNIT_TEST(testSegmentsNumericZeroBased); - CPPUNIT_TEST_SUITE_END(); - -public: - void testSegmentsAlphabetic(); - void testSegmentsBin(); - void testSegmentsDmg(); - void testSegmentsNone(); - void testSegmentsNumericOneBased(); - void testSegmentsNumericZeroBased(); -}; - -#endif From a1deb97ef0be526402fcd957ab107b49ae5cd176 Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Fri, 6 Sep 2024 09:53:25 -0700 Subject: [PATCH 0169/1548] move to codecov with unit tests --- ...pile-check-codecov.yml => compile-mac_linux-codecov.yml} | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) rename .github/workflows/{compile-check-codecov.yml => compile-mac_linux-codecov.yml} (96%) diff --git a/.github/workflows/compile-check-codecov.yml b/.github/workflows/compile-mac_linux-codecov.yml similarity index 96% rename from .github/workflows/compile-check-codecov.yml rename to .github/workflows/compile-mac_linux-codecov.yml index c210216827..2f4e60d723 100644 --- a/.github/workflows/compile-check-codecov.yml +++ b/.github/workflows/compile-mac_linux-codecov.yml @@ -136,7 +136,11 @@ jobs: bash ./bootstrap ./configure CFLAGS='-g -O0 -fprofile-arcs -ftest-coverage' CXXFLAGS='-g -O0 -fprofile-arcs -ftest-coverage' --enable-silent-rules --quiet make clean - make $MAKE_OPTS check || (echo ==error== ; cat test-suite.log; exit 1) + make $MAKE_OPTS + + - name: Run C++ unit-test with codecov + if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.platform, 'x64') + (cd unit-tests; make $MAKE_OPTS check ) || (echo ==error== ; cat test-suite.log; exit 1) echo test results: for fn in */*.log ; do echo $fn: ; cat $fn ; done From fbc4f54d65ec69987155b0dbeec8c0e5aef8b092 Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Fri, 6 Sep 2024 10:06:37 -0700 Subject: [PATCH 0170/1548] move to codecov with unit tests --- .github/workflows/compile-mac_linux-codecov.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/compile-mac_linux-codecov.yml b/.github/workflows/compile-mac_linux-codecov.yml index 2f4e60d723..3ff2c86990 100644 --- a/.github/workflows/compile-mac_linux-codecov.yml +++ b/.github/workflows/compile-mac_linux-codecov.yml @@ -140,6 +140,7 @@ jobs: - name: Run C++ unit-test with codecov if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.platform, 'x64') + run: | (cd unit-tests; make $MAKE_OPTS check ) || (echo ==error== ; cat test-suite.log; exit 1) echo test results: for fn in */*.log ; do echo $fn: ; cat $fn ; done From d8d59a5088227eae8b253d25787c7c5614189006 Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Fri, 6 Sep 2024 10:15:33 -0700 Subject: [PATCH 0171/1548] changed fetch-depth: to 0 per codecov --- .github/workflows/compile-mac_linux-codecov.yml | 15 ++++++++++----- .github/workflows/compile-windows.yml | 10 +++++++++- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/.github/workflows/compile-mac_linux-codecov.yml b/.github/workflows/compile-mac_linux-codecov.yml index 3ff2c86990..3fa78865f2 100644 --- a/.github/workflows/compile-mac_linux-codecov.yml +++ b/.github/workflows/compile-mac_linux-codecov.yml @@ -37,6 +37,7 @@ jobs: uses: actions/checkout@v4 with: submodules: recursive + fetch-depth: 0 - name: Prep the VM (MacOS) if: startsWith(matrix.os, 'macos') @@ -129,8 +130,7 @@ jobs: # A separate .gcda file is created for each object file compiled with this option. # It contains arc transition counts, value profile counts, and some summary information. - - name: Prepare C++ checks with codecov - if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.platform, 'x64') + - name: Prepare C++ executable for running unit tests with codecov run: | sudo pip3 install coverage bash ./bootstrap @@ -138,8 +138,7 @@ jobs: make clean make $MAKE_OPTS - - name: Run C++ unit-test with codecov - if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.platform, 'x64') + - name: Run C++ unit-test run: | (cd unit-tests; make $MAKE_OPTS check ) || (echo ==error== ; cat test-suite.log; exit 1) echo test results: @@ -166,7 +165,8 @@ jobs: run: | bash <(curl -s https://codecov.io/bash) - - name: upload codecov report + - name: newstyle upload codecov report (unexplicably fails) + # commented out because it unexplicitly fails if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.platform, 'x64') && false uses: codecov/codecov-action@v4 with: @@ -185,3 +185,8 @@ jobs: - uses: ammaraskar/gcc-problem-matcher@0.2.0 name: GCC Problem Matcher + + - name: List all files + shell: bash + run: | + find . -ls diff --git a/.github/workflows/compile-windows.yml b/.github/workflows/compile-windows.yml index 51696da418..b3d67bd2fe 100644 --- a/.github/workflows/compile-windows.yml +++ b/.github/workflows/compile-windows.yml @@ -22,6 +22,9 @@ jobs: steps: # https://github.com/actions/checkout - uses: actions/checkout@v4 + with: + submodules: recursive + fetch-depth: 0 - uses: actions/setup-dotnet@v1 - uses: microsoft/setup-msbuild@v1.1 @@ -65,7 +68,7 @@ jobs: - name: bash printenv shell: bash run: | - printenv + printenv | sort - name: Build TSK run: | @@ -80,3 +83,8 @@ jobs: cd case-uco\java ant -q cd ..\.. + + - name: List all files + shell: bash + run: | + find . -ls From 724f66e0a2f613ee546f85a504d029fc07ab83ac Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Fri, 6 Sep 2024 10:18:31 -0700 Subject: [PATCH 0172/1548] change sudo pip3 install coverage to remove sudo; if this does not work, we will create a virtual environment. --- .github/workflows/compile-mac_linux-codecov.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/compile-mac_linux-codecov.yml b/.github/workflows/compile-mac_linux-codecov.yml index 3fa78865f2..73a62f8c80 100644 --- a/.github/workflows/compile-mac_linux-codecov.yml +++ b/.github/workflows/compile-mac_linux-codecov.yml @@ -132,7 +132,7 @@ jobs: - name: Prepare C++ executable for running unit tests with codecov run: | - sudo pip3 install coverage + pip3 install coverage bash ./bootstrap ./configure CFLAGS='-g -O0 -fprofile-arcs -ftest-coverage' CXXFLAGS='-g -O0 -fprofile-arcs -ftest-coverage' --enable-silent-rules --quiet make clean From aa25e10e51d75bf2283a8ee5e0eb6775b3fa61ed Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Fri, 6 Sep 2024 10:22:07 -0700 Subject: [PATCH 0173/1548] not sure if we need coverage, but now it is in its own place --- .github/workflows/compile-mac_linux-codecov.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/compile-mac_linux-codecov.yml b/.github/workflows/compile-mac_linux-codecov.yml index 73a62f8c80..1d75be4217 100644 --- a/.github/workflows/compile-mac_linux-codecov.yml +++ b/.github/workflows/compile-mac_linux-codecov.yml @@ -132,7 +132,6 @@ jobs: - name: Prepare C++ executable for running unit tests with codecov run: | - pip3 install coverage bash ./bootstrap ./configure CFLAGS='-g -O0 -fprofile-arcs -ftest-coverage' CXXFLAGS='-g -O0 -fprofile-arcs -ftest-coverage' --enable-silent-rules --quiet make clean @@ -163,6 +162,9 @@ jobs: env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} run: | + python3 -m venv venv + source venv/bin/activate + pip3 install coverage bash <(curl -s https://codecov.io/bash) - name: newstyle upload codecov report (unexplicably fails) From 7d5f69b88b9e8219a882be9f869e08c4ed05e8e1 Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Fri, 6 Sep 2024 17:31:33 -0700 Subject: [PATCH 0174/1548] changed brew install cppunit to brew install catch2 --- .github/workflows/compile-check-codecov.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/compile-check-codecov.yml b/.github/workflows/compile-check-codecov.yml index c210216827..666d789622 100644 --- a/.github/workflows/compile-check-codecov.yml +++ b/.github/workflows/compile-check-codecov.yml @@ -41,7 +41,7 @@ jobs: - name: Prep the VM (MacOS) if: startsWith(matrix.os, 'macos') run: | - brew install cppunit + brew install catch2 - name: Prep the VM (ubuntu) if: startsWith(matrix.os, 'ubuntu') From f71cacdf2a3acac8fce098d81c2fc3ca2ff4799f Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Sat, 7 Sep 2024 06:53:18 -0700 Subject: [PATCH 0175/1548] changed brew install cppunit to brew install catch2 --- .github/workflows/compile-mac_linux-codecov.yml | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/.github/workflows/compile-mac_linux-codecov.yml b/.github/workflows/compile-mac_linux-codecov.yml index 1d75be4217..46c405c6fd 100644 --- a/.github/workflows/compile-mac_linux-codecov.yml +++ b/.github/workflows/compile-mac_linux-codecov.yml @@ -39,11 +39,6 @@ jobs: submodules: recursive fetch-depth: 0 - - name: Prep the VM (MacOS) - if: startsWith(matrix.os, 'macos') - run: | - brew install cppunit - - name: Prep the VM (ubuntu) if: startsWith(matrix.os, 'ubuntu') run: | @@ -61,7 +56,7 @@ jobs: - name: "Configure for MacOS" if: startsWith(matrix.os, 'macos') run: | - brew install wget libtool autoconf automake libtool libxml2 libewf pkg-config + brew install wget libtool autoconf automake libtool libxml2 libewf pkg-config cppunit bash ./bootstrap - name: "Configure for Ubuntu" From ffa2f971212d734172dbd4ac94715180af355f3c Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Sat, 7 Sep 2024 06:57:10 -0700 Subject: [PATCH 0176/1548] cprint every cppunit file --- .github/workflows/compile-mac_linux-codecov.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/compile-mac_linux-codecov.yml b/.github/workflows/compile-mac_linux-codecov.yml index 46c405c6fd..8b50544797 100644 --- a/.github/workflows/compile-mac_linux-codecov.yml +++ b/.github/workflows/compile-mac_linux-codecov.yml @@ -57,6 +57,7 @@ jobs: if: startsWith(matrix.os, 'macos') run: | brew install wget libtool autoconf automake libtool libxml2 libewf pkg-config cppunit + find / -type f -print | grep cppunit bash ./bootstrap - name: "Configure for Ubuntu" From 70beeb78a3e00f8d215074daf5b61e58be979734 Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Sat, 7 Sep 2024 07:08:40 -0700 Subject: [PATCH 0177/1548] manual add for weekend since catch2 is coming --- .github/workflows/compile-mac_linux-codecov.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/compile-mac_linux-codecov.yml b/.github/workflows/compile-mac_linux-codecov.yml index 8b50544797..9b5f98e1d4 100644 --- a/.github/workflows/compile-mac_linux-codecov.yml +++ b/.github/workflows/compile-mac_linux-codecov.yml @@ -133,8 +133,9 @@ jobs: make clean make $MAKE_OPTS - - name: Run C++ unit-test + - name: Run C++ cppunit unit-test run: | + export CPPFLAGS="$CPPFLAGS $(pkg-config cppunit --cflags)" (cd unit-tests; make $MAKE_OPTS check ) || (echo ==error== ; cat test-suite.log; exit 1) echo test results: for fn in */*.log ; do echo $fn: ; cat $fn ; done From 5270e87bc4a1849b70b5c183bada9c6a32c8c1d2 Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Sat, 7 Sep 2024 07:18:15 -0700 Subject: [PATCH 0178/1548] manual add for weekend since catch2 is coming --- .github/workflows/compile-mac_linux-codecov.yml | 1 - unit_tests/Makefile.am | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/compile-mac_linux-codecov.yml b/.github/workflows/compile-mac_linux-codecov.yml index 9b5f98e1d4..d06626af69 100644 --- a/.github/workflows/compile-mac_linux-codecov.yml +++ b/.github/workflows/compile-mac_linux-codecov.yml @@ -135,7 +135,6 @@ jobs: - name: Run C++ cppunit unit-test run: | - export CPPFLAGS="$CPPFLAGS $(pkg-config cppunit --cflags)" (cd unit-tests; make $MAKE_OPTS check ) || (echo ==error== ; cat test-suite.log; exit 1) echo test results: for fn in */*.log ; do echo $fn: ; cat $fn ; done diff --git a/unit_tests/Makefile.am b/unit_tests/Makefile.am index 3af3952531..73c13caffa 100644 --- a/unit_tests/Makefile.am +++ b/unit_tests/Makefile.am @@ -1,4 +1,4 @@ -AM_CPPFLAGS = -I.. -I$(srcdir)/.. +AM_CPPFLAGS = -I.. -I$(srcdir)/.. -I/System/Volumes/Data/opt/homebrew/Cellar/cppunit/1.15.1/include/ AM_CFLAGS += $(PTHREAD_CFLAGS) AM_CXXFLAGS += -Wno-unused-command-line-argument $(PTHREAD_CFLAGS) LDADD = ../tsk/libtsk.la From e7f17e87647faf9b8f04b33973c59c94ccb07431 Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Sat, 7 Sep 2024 07:27:23 -0700 Subject: [PATCH 0179/1548] manual add for weekend since catch2 is coming --- unit_tests/Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unit_tests/Makefile.am b/unit_tests/Makefile.am index 73c13caffa..bb550bdc66 100644 --- a/unit_tests/Makefile.am +++ b/unit_tests/Makefile.am @@ -2,7 +2,7 @@ AM_CPPFLAGS = -I.. -I$(srcdir)/.. -I/System/Volumes/Data/opt/homebrew/Cellar/cp AM_CFLAGS += $(PTHREAD_CFLAGS) AM_CXXFLAGS += -Wno-unused-command-line-argument $(PTHREAD_CFLAGS) LDADD = ../tsk/libtsk.la -LDFLAGS += -static $(PTHREAD_LIBS) -lcppunit +LDFLAGS += -static $(PTHREAD_LIBS) -L/opt/homebrew/Cellar/cppunit/1.15.1/lib -lcppunit SUBDIRS = base img From e9208fd61a8d0c4f29380d600fa0b93d20cd4b3b Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Sun, 8 Sep 2024 07:43:04 -0700 Subject: [PATCH 0180/1548] another try on codecov --- .../workflows/compile-mac_linux-codecov.yml | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/.github/workflows/compile-mac_linux-codecov.yml b/.github/workflows/compile-mac_linux-codecov.yml index d06626af69..0d01cc0bff 100644 --- a/.github/workflows/compile-mac_linux-codecov.yml +++ b/.github/workflows/compile-mac_linux-codecov.yml @@ -1,4 +1,4 @@ -# This file based on https://gist.github.com/mwouts/9842452d020c08faf9e84a3bba38a66f + This file based on https://gist.github.com/mwouts/9842452d020c08faf9e84a3bba38a66f # See: https://help.github.com/en/actions/reference/software-installed-on-github-hosted-runners # 2022-08-06 - slg - Updated os to be 'macos-latest', 'ubuntu-20.04', 'ubuntu-22.04' # See https://github.com/actions/virtual-environments for details. @@ -32,6 +32,15 @@ jobs: NOHARDFAIL: TRUE steps: + - name: Set variables + run: | + echo "run_codecov=false" >> $GITHUB_ENV + + - name: Set codecov + if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.platform, 'x64') && true + run: | + echo "run_codecov=true >> $GITHUB_ENV + # https://github.com/actions/checkout - name: Checkout uses: actions/checkout@v4 @@ -126,22 +135,20 @@ jobs: # A separate .gcda file is created for each object file compiled with this option. # It contains arc transition counts, value profile counts, and some summary information. - - name: Prepare C++ executable for running unit tests with codecov + - name: Prepare C++ executable and make check run: | bash ./bootstrap ./configure CFLAGS='-g -O0 -fprofile-arcs -ftest-coverage' CXXFLAGS='-g -O0 -fprofile-arcs -ftest-coverage' --enable-silent-rules --quiet make clean - make $MAKE_OPTS - - - name: Run C++ cppunit unit-test - run: | - (cd unit-tests; make $MAKE_OPTS check ) || (echo ==error== ; cat test-suite.log; exit 1) + make $MAKE_OPTS check + (cd unit-tests; make $MAKE_OPTS check) echo test results: for fn in */*.log ; do echo $fn: ; cat $fn ; done - - name: Run gcov - if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.platform, 'x64') + - name: Run C++ unit test and gcov + if: env.run_codecov == 'true' run: | + (cd unit-tests; ./runner) echo move the .gcno and .gcda files into place find . -name '.libs' -type d -exec bash -c "cd {} ; pwd ; mv -vf *.gc* .." \; echo gcno: @@ -154,7 +161,7 @@ jobs: ls -l tests - name: oldstyle upload codecov report - if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.platform, 'x64') && true + if: env.run_codecov == 'true' env: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} run: | From d22774e8437c801bd087c033988637c2c588352a Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Sun, 8 Sep 2024 07:45:01 -0700 Subject: [PATCH 0181/1548] another try on codecov --- .github/workflows/compile-mac_linux-codecov.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/compile-mac_linux-codecov.yml b/.github/workflows/compile-mac_linux-codecov.yml index 0d01cc0bff..ea91686a98 100644 --- a/.github/workflows/compile-mac_linux-codecov.yml +++ b/.github/workflows/compile-mac_linux-codecov.yml @@ -1,4 +1,4 @@ - This file based on https://gist.github.com/mwouts/9842452d020c08faf9e84a3bba38a66f +# This file based on https://gist.github.com/mwouts/9842452d020c08faf9e84a3bba38a66f # See: https://help.github.com/en/actions/reference/software-installed-on-github-hosted-runners # 2022-08-06 - slg - Updated os to be 'macos-latest', 'ubuntu-20.04', 'ubuntu-22.04' # See https://github.com/actions/virtual-environments for details. From f45a5043bd9569415487dcc48a19a59f3ab6904e Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Sun, 8 Sep 2024 12:14:26 -0400 Subject: [PATCH 0182/1548] corrected typo on ubuntu-22.04 x64 --- .github/workflows/compile-mac_linux-codecov.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/compile-mac_linux-codecov.yml b/.github/workflows/compile-mac_linux-codecov.yml index ea91686a98..85f6d1dfc3 100644 --- a/.github/workflows/compile-mac_linux-codecov.yml +++ b/.github/workflows/compile-mac_linux-codecov.yml @@ -39,7 +39,7 @@ jobs: - name: Set codecov if: startsWith(matrix.os, 'ubuntu') && startsWith(matrix.platform, 'x64') && true run: | - echo "run_codecov=true >> $GITHUB_ENV + echo "run_codecov=true" >> $GITHUB_ENV # https://github.com/actions/checkout - name: Checkout From 211a55c8871d5c9868d8978bf94db8e5772346ba Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Sun, 8 Sep 2024 12:45:55 -0400 Subject: [PATCH 0183/1548] unit-tests -> unit_tests --- .github/workflows/compile-mac_linux-codecov.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/compile-mac_linux-codecov.yml b/.github/workflows/compile-mac_linux-codecov.yml index 85f6d1dfc3..cca6520615 100644 --- a/.github/workflows/compile-mac_linux-codecov.yml +++ b/.github/workflows/compile-mac_linux-codecov.yml @@ -141,14 +141,14 @@ jobs: ./configure CFLAGS='-g -O0 -fprofile-arcs -ftest-coverage' CXXFLAGS='-g -O0 -fprofile-arcs -ftest-coverage' --enable-silent-rules --quiet make clean make $MAKE_OPTS check - (cd unit-tests; make $MAKE_OPTS check) + (cd unit_tests; make $MAKE_OPTS check) echo test results: for fn in */*.log ; do echo $fn: ; cat $fn ; done - name: Run C++ unit test and gcov if: env.run_codecov == 'true' run: | - (cd unit-tests; ./runner) + (cd unit_tests; ./runner) echo move the .gcno and .gcda files into place find . -name '.libs' -type d -exec bash -c "cd {} ; pwd ; mv -vf *.gc* .." \; echo gcno: From 341308b60d8f74c51d34ec909f14303ad86535aa Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Tue, 10 Sep 2024 10:47:23 -0400 Subject: [PATCH 0184/1548] have appveyor indicate os release and autoconf version --- appveyor.yml | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 4c27c86db1..c0d15c2c83 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,6 +1,6 @@ version: 4.6.0.{build} -environment: +environment: matrix: - job_name: Windows Build @@ -15,9 +15,9 @@ matrix: # job-specific configurations -for: +for: - - + - matrix: only: - job_name: Windows Build @@ -55,13 +55,15 @@ for: test_script: - cmd: ant -q -f bindings/java test - - + - matrix: only: - job_name: Linux Build install: - sudo apt install -y autoconf + - cat /etc/os-release + - autoconf --version build_script: - ./bootstrap @@ -71,7 +73,7 @@ for: test_script: - make -j check VERBOSE=1 - - + - matrix: only: - job_name: macOS Build From 7b32d4a0dbdf9299826607800de05601b2a2870a Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Tue, 10 Sep 2024 14:51:18 -0400 Subject: [PATCH 0185/1548] updated appveyor syntax to image: and updated Ubuntu to Ubuntu2204 --- appveyor.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index c0d15c2c83..d2c1bc2f46 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -2,13 +2,12 @@ version: 4.6.0.{build} environment: matrix: - - job_name: Windows Build - appveyor_build_worker_image: Visual Studio 2019 + image: Visual Studio 2019 - job_name: Linux Build - appveyor_build_worker_image: Ubuntu + image: Ubuntu2204 - job_name: macOS Build - appveyor_build_worker_image: macos-catalina + image: macos-catalina matrix: fast_finish: true From 96013951216cd88b74712a1161fab9baf876f76b Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Tue, 10 Sep 2024 15:13:54 -0400 Subject: [PATCH 0186/1548] updated appveyor syntax to image: and updated Ubuntu to Ubuntu2204 --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index d2c1bc2f46..421f7bb402 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -60,8 +60,8 @@ for: - job_name: Linux Build install: - - sudo apt install -y autoconf - cat /etc/os-release + - sudo apt install -y autoconf - autoconf --version build_script: From 696b074bb960983c627ae540070ecdf24c7ada7f Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Tue, 10 Sep 2024 15:41:19 -0400 Subject: [PATCH 0187/1548] move back to Ubuntu and manually install autoconf-2.71 --- appveyor.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 421f7bb402..21ea31c6f6 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -5,7 +5,7 @@ environment: - job_name: Windows Build image: Visual Studio 2019 - job_name: Linux Build - image: Ubuntu2204 + image: Ubuntu - job_name: macOS Build image: macos-catalina @@ -61,8 +61,10 @@ for: install: - cat /etc/os-release - - sudo apt install -y autoconf - autoconf --version + - sudo apt install -y autoconf + - wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.71.tar.gz + - (tar -xf autoconf-2.71.tar.gz && cd autoconf-2.71 && ./configure && make && sudo make install) build_script: - ./bootstrap From f42bba02d1d74ce0c80e66a02424d04a7e5b7a4e Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Tue, 10 Sep 2024 16:20:14 -0400 Subject: [PATCH 0188/1548] move back to Ubuntu and manually install autoconf-2.71 --- appveyor.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 21ea31c6f6..c21a39d0ae 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -3,13 +3,14 @@ version: 4.6.0.{build} environment: matrix: - job_name: Windows Build - image: Visual Studio 2019 + appveyor_build_worker_image: Visual Studio 2019 - job_name: Linux Build - image: Ubuntu + appveyor_build_worker_image: Ubuntu - job_name: macOS Build - image: macos-catalina + appveyor_build_worker_image: macos-catalina matrix: + fast_finish: true @@ -60,13 +61,13 @@ for: - job_name: Linux Build install: - - cat /etc/os-release - - autoconf --version - sudo apt install -y autoconf - - wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.71.tar.gz - - (tar -xf autoconf-2.71.tar.gz && cd autoconf-2.71 && ./configure && make && sudo make install) build_script: + - cat /etc/os-release + - wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.71.tar.gz + - (tar -xf autoconf-2.71.tar.gz && cd autoconf-2.71 && ./configure && make && sudo make install) + - autoconf --version - ./bootstrap - ./configure - make -j From 670c79ab934f7d993a6be39ad1bf6d3cf499a09c Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Tue, 10 Sep 2024 19:09:27 -0400 Subject: [PATCH 0189/1548] works with catch2 --- .github/workflows/compile-mac_linux-codecov.yml | 10 +++++----- tsk/tsk_config.h.in | 9 ++++++--- unit_tests/Makefile.am | 2 +- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/.github/workflows/compile-mac_linux-codecov.yml b/.github/workflows/compile-mac_linux-codecov.yml index b6dab2f8ff..2e8ac5193f 100644 --- a/.github/workflows/compile-mac_linux-codecov.yml +++ b/.github/workflows/compile-mac_linux-codecov.yml @@ -98,7 +98,7 @@ jobs: - name: C++ checks not optimizaiton with address-sanitizer (Mac and Linux) if: false run: | - ./configure --enable-address-sanitizer + ./configure --enable-address-sanitizer --disable-silent-rules make $MAKE_OPTS all make $MAKE_OPTS bulk_extractor make check || (cat test-suite.log; exit 1) @@ -120,11 +120,10 @@ jobs: if: false && startsWith(matrix.os, 'ubuntu-DISABLED') run: | bash ./bootstrap - ./configure --enable-thread-sanitizer --enable-silent-rules --quiet + ./configure --enable-thread-sanitizer --disable-silent-rules --quiet + cat config.h make clean make $MAKE_OPTS all - pushd src - make $MAKE_OPTS bulk_extractor make check || (cat test-suite.log; exit 1) popd make distclean @@ -142,7 +141,8 @@ jobs: - name: Prepare C++ executable and make check run: | bash ./bootstrap - ./configure CFLAGS='-g -O0 -fprofile-arcs -ftest-coverage' CXXFLAGS='-g -O0 -fprofile-arcs -ftest-coverage' --enable-silent-rules --quiet + ./configure CFLAGS='-g -O0 -fprofile-arcs -ftest-coverage' CXXFLAGS='-g -O0 -fprofile-arcs -ftest-coverage' --disable-silent-rules + cat config.h make clean make $MAKE_OPTS check (cd unit_tests; make $MAKE_OPTS check) diff --git a/tsk/tsk_config.h.in b/tsk/tsk_config.h.in index 47c677b434..23ff0581df 100644 --- a/tsk/tsk_config.h.in +++ b/tsk/tsk_config.h.in @@ -48,10 +48,10 @@ /* Define to 1 if you have the 'ishexnumber' function. */ #undef HAVE_ISHEXNUMBER -/* Define to 1 if you have the `aff4' library (-laff4). */ +/* Define to 1 if you have the 'aff4' library (-laff4). */ #undef HAVE_LIBAFF4 -/* Define to 1 if you have the `afflib' library (-lafflib). */ +/* Define to 1 if you have the 'afflib' library (-lafflib). */ #undef HAVE_LIBAFFLIB /* Define to 1 if you have the 'bfio' library (-lbfio). */ @@ -106,6 +106,9 @@ /* Define if you have POSIX threads libraries and header files. */ #undef HAVE_PTHREAD +/* Have PTHREAD_PRIO_INHERIT. */ +#undef HAVE_PTHREAD_PRIO_INHERIT + /* Define to 1 if you have the header file. */ #undef HAVE_QUEUE @@ -148,7 +151,7 @@ /* Define to 1 if you have the 'strlcpy' function. */ #undef HAVE_STRLCPY -/* Define to 1 if you have the `strnlen' function. */ +/* Define to 1 if you have the 'strnlen' function. */ #undef HAVE_STRNLEN /* Define to 1 if you have the header file. */ diff --git a/unit_tests/Makefile.am b/unit_tests/Makefile.am index bb550bdc66..d3f91ff9f8 100644 --- a/unit_tests/Makefile.am +++ b/unit_tests/Makefile.am @@ -1,4 +1,4 @@ -AM_CPPFLAGS = -I.. -I$(srcdir)/.. -I/System/Volumes/Data/opt/homebrew/Cellar/cppunit/1.15.1/include/ +AM_CPPFLAGS = -I.. -I$(srcdir)/.. $(CATCH2_CPPFLAGS) AM_CFLAGS += $(PTHREAD_CFLAGS) AM_CXXFLAGS += -Wno-unused-command-line-argument $(PTHREAD_CFLAGS) LDADD = ../tsk/libtsk.la From 10c4a8617686ec1eb2d95be396910dab040b35bc Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Tue, 10 Sep 2024 19:12:29 -0400 Subject: [PATCH 0190/1548] works with catch2 --- .github/workflows/compile-mac_linux-codecov.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/compile-mac_linux-codecov.yml b/.github/workflows/compile-mac_linux-codecov.yml index 2e8ac5193f..212a6902c7 100644 --- a/.github/workflows/compile-mac_linux-codecov.yml +++ b/.github/workflows/compile-mac_linux-codecov.yml @@ -121,7 +121,6 @@ jobs: run: | bash ./bootstrap ./configure --enable-thread-sanitizer --disable-silent-rules --quiet - cat config.h make clean make $MAKE_OPTS all make check || (cat test-suite.log; exit 1) From 48f2c5d35a7a18ebe3bbb5a421b815b0958244ce Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Tue, 10 Sep 2024 19:18:59 -0400 Subject: [PATCH 0191/1548] works with catch2 --- .github/workflows/compile-mac_linux-codecov.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/compile-mac_linux-codecov.yml b/.github/workflows/compile-mac_linux-codecov.yml index 212a6902c7..37627b413b 100644 --- a/.github/workflows/compile-mac_linux-codecov.yml +++ b/.github/workflows/compile-mac_linux-codecov.yml @@ -141,7 +141,6 @@ jobs: run: | bash ./bootstrap ./configure CFLAGS='-g -O0 -fprofile-arcs -ftest-coverage' CXXFLAGS='-g -O0 -fprofile-arcs -ftest-coverage' --disable-silent-rules - cat config.h make clean make $MAKE_OPTS check (cd unit_tests; make $MAKE_OPTS check) From d529ca6d11452c68246fbe290ebf34176084ace0 Mon Sep 17 00:00:00 2001 From: Simson Garfinkel Date: Tue, 10 Sep 2024 20:47:03 -0400 Subject: [PATCH 0192/1548] complete migration to catch2 --- .../workflows/compile-mac_linux-codecov.yml | 8 +- Makefile.am | 11 +- configure.ac | 48 - m4/cppunit.m4 | 92 - tsk/img/aff.c | 13 +- tsk/img/aff.h | 9 +- unit_tests/Makefile.am | 8 +- unit_tests/base/errors_test.h | 36 - unit_tests/catch.hpp | 17937 ++++++++++++++++ unit_tests/{base => }/errors_test.cpp | 91 +- unit_tests/{img => }/mult_files_test.cpp | 12 +- unit_tests/runner.cpp | 29 +- 12 files changed, 17994 insertions(+), 300 deletions(-) delete mode 100644 m4/cppunit.m4 delete mode 100644 unit_tests/base/errors_test.h create mode 100644 unit_tests/catch.hpp rename unit_tests/{base => }/errors_test.cpp (59%) rename unit_tests/{img => }/mult_files_test.cpp (94%) diff --git a/.github/workflows/compile-mac_linux-codecov.yml b/.github/workflows/compile-mac_linux-codecov.yml index 37627b413b..83c68cb252 100644 --- a/.github/workflows/compile-mac_linux-codecov.yml +++ b/.github/workflows/compile-mac_linux-codecov.yml @@ -50,12 +50,12 @@ jobs: - name: Prep the VM (MacOS) if: startsWith(matrix.os, 'macos') run: | - brew install catch2 + echo nothing to do - name: Prep the VM (ubuntu) if: startsWith(matrix.os, 'ubuntu') run: | - sudo apt-get install libcppunit-dev catch2 + sudo apt install -y autoconf automake g++ flex libexpat1-dev libre2-dev libssl-dev libtool libxml2-utils make pkg-config zlib1g-dev - name: Get disk images run: | @@ -69,14 +69,12 @@ jobs: - name: "Configure for MacOS" if: startsWith(matrix.os, 'macos') run: | - brew install wget libtool autoconf automake libtool libxml2 libewf pkg-config cppunit - find / -type f -print | grep cppunit + brew install wget libtool autoconf automake libtool libxml2 libewf pkg-config bash ./bootstrap - name: "Configure for Ubuntu" if: startsWith(matrix.os, 'ubuntu') run: | - sudo apt install -y autoconf automake g++ flex libexpat1-dev libre2-dev libssl-dev libtool libxml2-utils make pkg-config zlib1g-dev catch2 bash ./bootstrap - name: Version Numbers diff --git a/Makefile.am b/Makefile.am index df6dc229c1..76de5f37bd 100644 --- a/Makefile.am +++ b/Makefile.am @@ -32,21 +32,16 @@ EXTRA_DIST = README_win32.txt README.md INSTALL.txt ChangeLog.txt NEWS.txt API-C ACLOCAL_AMFLAGS = -I m4 -# directories to compile -if HAVE_CPPUNIT - UNIT_TESTS=unit_tests -endif - # Compile java bindings if all of the dependencies existed if X_JNI JAVA_BINDINGS=bindings/java JAVA_CASEUCO=case-uco/java -else +else JAVA_BINDINGS= JAVA_CASEUCO= endif -SUBDIRS = tsk tools tests samples man $(UNIT_TESTS) $(JAVA_BINDINGS) $(JAVA_CASEUCO) +SUBDIRS = tsk tools tests samples man unit_tests $(JAVA_BINDINGS) $(JAVA_CASEUCO) nobase_include_HEADERS = tsk/libtsk.h tsk/tsk_incs.h \ tsk/base/tsk_base.h tsk/base/tsk_os.h \ @@ -71,7 +66,7 @@ nobase_include_HEADERS = tsk/libtsk.h tsk/tsk_incs.h \ nobase_dist_data_DATA = tsk/sorter/default.sort tsk/sorter/freebsd.sort \ tsk/sorter/images.sort tsk/sorter/linux.sort tsk/sorter/openbsd.sort \ - tsk/sorter/solaris.sort tsk/sorter/windows.sort + tsk/sorter/solaris.sort tsk/sorter/windows.sort api-docs: doxygen tsk/docs/Doxyfile diff --git a/configure.ac b/configure.ac index 9bb594e4a4..3807f0669e 100644 --- a/configure.ac +++ b/configure.ac @@ -48,7 +48,6 @@ AC_FUNC_ALLOCA AC_FUNC_ERROR_AT_LINE dnl AC_FUNC_FORK AC_FUNC_FSEEKO -AC_PROG_GCC_TRADITIONAL AC_FUNC_LSTAT AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK dnl AC_FUNC_MALLOC @@ -151,52 +150,6 @@ AS_IF([test "x$ax_libbfio" = "xyes"], [TSK_OPT_DEP_CHECK([libvslvm], [LVM], [libvslvm], [libvslvm.h], [vslvm], [libvslvm_get_version])], [ax_libvslvm=no]) -dnl check for cppunit -AC_ARG_ENABLE([cppunit], - [AS_HELP_STRING([--disable-cppunit], [Build without cppunit tests])]) - -ac_cv_cppunit=no -AS_IF([test "x$enable_cppunit" != "xno"], [ - AS_IF([test "x$ac_cv_prog_PKGCONFIG" = "xyes"], - [ - dnl IGNOREs keep cppunit out of .pc file, as it's for testing only - TSK_PKG_CHECK_MODULES([CPPUNIT], [], [cppunit >= 1.12.1], [ac_cv_cppunit=yes], [ac_cv_cppunit=no], [IGNORE], [IGNORE]) - ] - ) - - AS_IF([test "x$ac_cv_cppunit" != "xyes"], - [AM_PATH_CPPUNIT(1.12.1) - AS_IF([test "x$no_cppunit" = x], [ac_cv_cppunit=yes])] - ) - - AC_MSG_CHECKING([for TestRunner in -lcppunit]) - - SAVED_CFLAGS="$CFLAGS" - SAVED_LDFLAGS="$LDFLAGS" - CFLAGS="$CPPUNIT_CLFAGS" - LDFLAGS="$CPPUNIT_LIBS" - - AC_LANG_PUSH([C++]) - AC_LINK_IFELSE([AC_LANG_PROGRAM( - [[#include ]], - [[CppUnit::TextUi::TestRunner();]])], - [ax_cv_cppunit=yes], - [ax_cv_cppunit=no]) - AC_LANG_POP([C++]) - - CFLAGS="$SAVED_CFLAGS" - LDFLAGS="$SAVED_LDFLAGS" - - AC_MSG_RESULT([$ax_cv_cppunit]) -]) - -AM_CONDITIONAL([HAVE_CPPUNIT],[test "x$ac_cv_cppunit" = xyes]) - -dnl check for Catch2 -AX_PKG_CHECK_MODULES([CATCH2], [], [catch2-with-main], [with_catch2=yes], [with_catch2=no]) -CATCH2_CPPFLAGS="-DCATCH_CONFIG_ENABLE_ALL_STRINGMAKERS" -AC_SUBST([CATCH2_CPPFLAGS]) - dnl check for user online input AC_ARG_ENABLE([offline], [ AS_HELP_STRING([--enable-offline],[Turn on offline mode])], @@ -373,7 +326,6 @@ Building: Features: Catch2 support: $with_catch2 - cppunit support: $ac_cv_cppunit Java/JNI support: $ax_java_support Multithreading: $ax_multithread ]) diff --git a/m4/cppunit.m4 b/m4/cppunit.m4 deleted file mode 100644 index 41f067b6d4..0000000000 --- a/m4/cppunit.m4 +++ /dev/null @@ -1,92 +0,0 @@ -dnl -dnl AM_PATH_CPPUNIT(MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) -dnl -AC_DEFUN([AM_PATH_CPPUNIT], -[ - -AC_ARG_WITH(cppunit-prefix,[ --with-cppunit-prefix=PFX Prefix where CppUnit is installed (optional)], - cppunit_config_prefix="$withval", cppunit_config_prefix="") -AC_ARG_WITH(cppunit-exec-prefix,[ --with-cppunit-exec-prefix=PFX Exec prefix where CppUnit is installed (optional)], - cppunit_config_exec_prefix="$withval", cppunit_config_exec_prefix="") - - if test x$cppunit_config_exec_prefix != x ; then - cppunit_config_args="$cppunit_config_args --exec-prefix=$cppunit_config_exec_prefix" - if test x${CPPUNIT_CONFIG+set} != xset ; then - CPPUNIT_CONFIG=$cppunit_config_exec_prefix/bin/cppunit-config - fi - fi - if test x$cppunit_config_prefix != x ; then - cppunit_config_args="$cppunit_config_args --prefix=$cppunit_config_prefix" - if test x${CPPUNIT_CONFIG+set} != xset ; then - CPPUNIT_CONFIG=$cppunit_config_prefix/bin/cppunit-config - fi - fi - - AC_PATH_PROG(CPPUNIT_CONFIG, cppunit-config, no) - cppunit_version_min=$1 - - AC_MSG_CHECKING(for Cppunit - version >= $cppunit_version_min) - no_cppunit="" - if test "$CPPUNIT_CONFIG" = "no" ; then - AC_MSG_RESULT(no) - no_cppunit=yes - else - CPPUNIT_CFLAGS=`$CPPUNIT_CONFIG --cflags` - CPPUNIT_LIBS=`$CPPUNIT_CONFIG --libs` - cppunit_version=`$CPPUNIT_CONFIG --version` - - cppunit_major_version=`echo $cppunit_version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` - cppunit_minor_version=`echo $cppunit_version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` - cppunit_micro_version=`echo $cppunit_version | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` - - cppunit_major_min=`echo $cppunit_version_min | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\1/'` - if test "x${cppunit_major_min}" = "x" ; then - cppunit_major_min=0 - fi - - cppunit_minor_min=`echo $cppunit_version_min | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\2/'` - if test "x${cppunit_minor_min}" = "x" ; then - cppunit_minor_min=0 - fi - - cppunit_micro_min=`echo $cppunit_version_min | \ - sed 's/\([[0-9]]*\).\([[0-9]]*\).\([[0-9]]*\)/\3/'` - if test "x${cppunit_micro_min}" = "x" ; then - cppunit_micro_min=0 - fi - - cppunit_version_proper=`expr \ - $cppunit_major_version \> $cppunit_major_min \| \ - $cppunit_major_version \= $cppunit_major_min \& \ - $cppunit_minor_version \> $cppunit_minor_min \| \ - $cppunit_major_version \= $cppunit_major_min \& \ - $cppunit_minor_version \= $cppunit_minor_min \& \ - $cppunit_micro_version \>= $cppunit_micro_min ` - - if test "$cppunit_version_proper" = "1" ; then - AC_MSG_RESULT([$cppunit_major_version.$cppunit_minor_version.$cppunit_micro_version]) - else - AC_MSG_RESULT(no) - no_cppunit=yes - fi - fi - - if test "x$no_cppunit" = x ; then - ifelse([$2], , :, [$2]) - else - CPPUNIT_CFLAGS="" - CPPUNIT_LIBS="" - ifelse([$3], , :, [$3]) - fi - - AC_SUBST(CPPUNIT_CFLAGS) - AC_SUBST(CPPUNIT_LIBS) -]) - - - diff --git a/tsk/img/aff.c b/tsk/img/aff.c index c5dabc17d6..ff6df20ad0 100644 --- a/tsk/img/aff.c +++ b/tsk/img/aff.c @@ -60,7 +60,7 @@ aff_read(TSK_IMG_INFO * img_info, TSK_OFF_T offset, char *buf, size_t len) return -1; } - /* AFF will return 0 if the page does not exist -- fill the + /* AFF will return 0 if the page does not exist -- fill the * buffer with zeros in this case */ if (cnt == 0) { // @@@ We could improve this if there is an AFF call @@ -214,7 +214,6 @@ aff_imgstat(TSK_IMG_INFO * img_info, FILE * hFile) static void aff_close(TSK_IMG_INFO * img_info) { - int i; IMG_AFF_INFO *aff_info = (IMG_AFF_INFO *) img_info; af_close(aff_info->af_file); tsk_img_free(aff_info); @@ -226,7 +225,7 @@ aff_open(int a_num_img, const TSK_TCHAR * const images[], unsigned int a_ssize) { if (a_num_img != 1) { tsk_error_set_errstr("aff_open file: %" PRIttocTSK - ": expected one image filename, was given %d", a_images[0], a_num_img); + ": expected one image filename, was given %d", images[0], a_num_img); if (tsk_verbose) { tsk_fprintf(stderr, "aff requires exactly 1 image filename for opening\n"); @@ -299,7 +298,7 @@ aff_open(int a_num_img, const TSK_TCHAR * const images[], unsigned int a_ssize) // with the other image types and is not currently used // a_num_img should be 1 - if (!tsk_img_copy_image_names(img_info, a_images, a_num_img)) { + if (!tsk_img_copy_image_names(img_info, images, a_num_img)) { goto on_error; } @@ -336,7 +335,7 @@ aff_open(int a_num_img, const TSK_TCHAR * const images[], unsigned int a_ssize) aff_info->af_file = af_open(image, O_RDONLY | O_BINARY, 0); if (!aff_info->af_file) { - // @@@ Need to check here if the open failed because of an incorrect password. + // @@@ Need to check here if the open failed because of an incorrect password. tsk_error_reset(); tsk_error_set_errno(TSK_ERR_IMG_OPEN); tsk_error_set_errstr("aff_open file: %" PRIttocTSK @@ -347,7 +346,7 @@ aff_open(int a_num_img, const TSK_TCHAR * const images[], unsigned int a_ssize) } goto on_error; } - // verify that a password was given and we can read encrypted data. + // verify that a password was given and we can read encrypted data. if (af_cannot_decrypt(aff_info->af_file)) { tsk_error_reset(); tsk_error_set_errno(TSK_ERR_IMG_PASSWD); @@ -370,7 +369,7 @@ aff_open(int a_num_img, const TSK_TCHAR * const images[], unsigned int a_ssize) on_error: free(image); - if (af_file) { + if (aff_info->af_file) { af_close(aff_info->af_file); } tsk_img_free(aff_info); diff --git a/tsk/img/aff.h b/tsk/img/aff.h index df8b3faa59..7ac5a096f8 100644 --- a/tsk/img/aff.h +++ b/tsk/img/aff.h @@ -2,13 +2,13 @@ * The Sleuth Kit * * Brian Carrier [carrier sleuthkit [dot] org] - * Copyright (c) 2005-2011 Brian Carrier. All rights reserved + * Copyright (c) 2005-2011 Brian Carrier. All rights reserved * * This software is distributed under the Common Public License 1.0 */ -/* - * Header files for AFF-specific data structures and functions. +/* + * Header files for AFF-specific data structures and functions. */ #ifndef _AFF_H @@ -30,8 +30,7 @@ extern "C" { #endif -extern TSK_IMG_INFO *aff_open(const TSK_TCHAR * const images[], - unsigned int a_ssize); + extern TSK_IMG_INFO *aff_open(int num_img, const TSK_TCHAR * const images[], unsigned int a_ssize); /** \internal * Stores AFF-specific data diff --git a/unit_tests/Makefile.am b/unit_tests/Makefile.am index d3f91ff9f8..64d181a22d 100644 --- a/unit_tests/Makefile.am +++ b/unit_tests/Makefile.am @@ -2,10 +2,6 @@ AM_CPPFLAGS = -I.. -I$(srcdir)/.. $(CATCH2_CPPFLAGS) AM_CFLAGS += $(PTHREAD_CFLAGS) AM_CXXFLAGS += -Wno-unused-command-line-argument $(PTHREAD_CFLAGS) LDADD = ../tsk/libtsk.la -LDFLAGS += -static $(PTHREAD_LIBS) -L/opt/homebrew/Cellar/cppunit/1.15.1/lib -lcppunit - - -SUBDIRS = base img +LDFLAGS += -static $(PTHREAD_LIBS) +runner_SOURCES = runner.cpp mult_files_test.cpp errors_test.cpp catch.hpp check_PROGRAMS = runner - -runner_SOURCES = runner.cpp base/errors_test.cpp diff --git a/unit_tests/base/errors_test.h b/unit_tests/base/errors_test.h deleted file mode 100644 index e7dfbc4cf6..0000000000 --- a/unit_tests/base/errors_test.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * errors_test.h - * - * Created on: Oct 22, 2010 - * Author: benson - */ - -#ifndef ERRORS_TEST_H_ -#define ERRORS_TEST_H_ - -#include - -class ErrorsTest : public CppUnit::TestFixture -{ - CPPUNIT_TEST_SUITE( ErrorsTest ); - CPPUNIT_TEST(testInitialState); - CPPUNIT_TEST(testLengthChecks); -#ifdef HAVE_PTHREAD - CPPUNIT_TEST(testMultithreaded); -#endif - CPPUNIT_TEST_SUITE_END(); - -public: - void setUp(); - void tearDown(); - - void testConstructor(); - void testInitialState(); - void testLengthChecks(); -#ifdef HAVE_PTHREAD - void testMultithreaded(); -#endif -}; - - -#endif /* ERRORS_TEST_H_ */ diff --git a/unit_tests/catch.hpp b/unit_tests/catch.hpp new file mode 100644 index 0000000000..36eaeb27f7 --- /dev/null +++ b/unit_tests/catch.hpp @@ -0,0 +1,17937 @@ +/* + * Catch v2.13.6 + * Generated: 2021-04-16 18:23:38.044268 + * ---------------------------------------------------------- + * This file has been merged from multiple headers. Please don't edit it directly + * Copyright (c) 2021 Two Blue Cubes Ltd. All rights reserved. + * + * Distributed under the Boost Software License, Version 1.0. (See accompanying + * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + */ +#ifndef TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED +#define TWOBLUECUBES_SINGLE_INCLUDE_CATCH_HPP_INCLUDED +// start catch.hpp + + +#define CATCH_VERSION_MAJOR 2 +#define CATCH_VERSION_MINOR 13 +#define CATCH_VERSION_PATCH 6 + +#ifdef __clang__ +# pragma clang system_header +#elif defined __GNUC__ +# pragma GCC system_header +#endif + +// start catch_suppress_warnings.h + +#ifdef __clang__ +# ifdef __ICC // icpc defines the __clang__ macro +# pragma warning(push) +# pragma warning(disable: 161 1682) +# else // __ICC +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wpadded" +# pragma clang diagnostic ignored "-Wswitch-enum" +# pragma clang diagnostic ignored "-Wcovered-switch-default" +# endif +#elif defined __GNUC__ + // Because REQUIREs trigger GCC's -Wparentheses, and because still + // supported version of g++ have only buggy support for _Pragmas, + // Wparentheses have to be suppressed globally. +# pragma GCC diagnostic ignored "-Wparentheses" // See #674 for details + +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wunused-variable" +# pragma GCC diagnostic ignored "-Wpadded" +#endif +// end catch_suppress_warnings.h +#if defined(CATCH_CONFIG_MAIN) || defined(CATCH_CONFIG_RUNNER) +# define CATCH_IMPL +# define CATCH_CONFIG_ALL_PARTS +#endif + +// In the impl file, we want to have access to all parts of the headers +// Can also be used to sanely support PCHs +#if defined(CATCH_CONFIG_ALL_PARTS) +# define CATCH_CONFIG_EXTERNAL_INTERFACES +# if defined(CATCH_CONFIG_DISABLE_MATCHERS) +# undef CATCH_CONFIG_DISABLE_MATCHERS +# endif +# if !defined(CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER) +# define CATCH_CONFIG_ENABLE_CHRONO_STRINGMAKER +# endif +#endif + +#if !defined(CATCH_CONFIG_IMPL_ONLY) +// start catch_platform.h + +// See e.g.: +// https://opensource.apple.com/source/CarbonHeaders/CarbonHeaders-18.1/TargetConditionals.h.auto.html +#ifdef __APPLE__ +# include +# if (defined(TARGET_OS_OSX) && TARGET_OS_OSX == 1) || \ + (defined(TARGET_OS_MAC) && TARGET_OS_MAC == 1) +# define CATCH_PLATFORM_MAC +# elif (defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE == 1) +# define CATCH_PLATFORM_IPHONE +# endif + +#elif defined(linux) || defined(__linux) || defined(__linux__) +# define CATCH_PLATFORM_LINUX + +#elif defined(WIN32) || defined(__WIN32__) || defined(_WIN32) || defined(_MSC_VER) || defined(__MINGW32__) +# define CATCH_PLATFORM_WINDOWS +#endif + +// end catch_platform.h + +#ifdef CATCH_IMPL +# ifndef CLARA_CONFIG_MAIN +# define CLARA_CONFIG_MAIN_NOT_DEFINED +# define CLARA_CONFIG_MAIN +# endif +#endif + +// start catch_user_interfaces.h + +namespace Catch { + unsigned int rngSeed(); +} + +// end catch_user_interfaces.h +// start catch_tag_alias_autoregistrar.h + +// start catch_common.h + +// start catch_compiler_capabilities.h + +// Detect a number of compiler features - by compiler +// The following features are defined: +// +// CATCH_CONFIG_COUNTER : is the __COUNTER__ macro supported? +// CATCH_CONFIG_WINDOWS_SEH : is Windows SEH supported? +// CATCH_CONFIG_POSIX_SIGNALS : are POSIX signals supported? +// CATCH_CONFIG_DISABLE_EXCEPTIONS : Are exceptions enabled? +// **************** +// Note to maintainers: if new toggles are added please document them +// in configuration.md, too +// **************** + +// In general each macro has a _NO_ form +// (e.g. CATCH_CONFIG_NO_POSIX_SIGNALS) which disables the feature. +// Many features, at point of detection, define an _INTERNAL_ macro, so they +// can be combined, en-mass, with the _NO_ forms later. + +#ifdef __cplusplus + +# if (__cplusplus >= 201402L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 201402L) +# define CATCH_CPP14_OR_GREATER +# endif + +# if (__cplusplus >= 201703L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) +# define CATCH_CPP17_OR_GREATER +# endif + +#endif + +// Only GCC compiler should be used in this block, so other compilers trying to +// mask themselves as GCC should be ignored. +#if defined(__GNUC__) && !defined(__clang__) && !defined(__ICC) && !defined(__CUDACC__) && !defined(__LCC__) +# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION _Pragma( "GCC diagnostic push" ) +# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION _Pragma( "GCC diagnostic pop" ) + +# define CATCH_INTERNAL_IGNORE_BUT_WARN(...) (void)__builtin_constant_p(__VA_ARGS__) + +#endif + +#if defined(__clang__) + +# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION _Pragma( "clang diagnostic push" ) +# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION _Pragma( "clang diagnostic pop" ) + +// As of this writing, IBM XL's implementation of __builtin_constant_p has a bug +// which results in calls to destructors being emitted for each temporary, +// without a matching initialization. In practice, this can result in something +// like `std::string::~string` being called on an uninitialized value. +// +// For example, this code will likely segfault under IBM XL: +// ``` +// REQUIRE(std::string("12") + "34" == "1234") +// ``` +// +// Therefore, `CATCH_INTERNAL_IGNORE_BUT_WARN` is not implemented. +# if !defined(__ibmxl__) && !defined(__CUDACC__) +# define CATCH_INTERNAL_IGNORE_BUT_WARN(...) (void)__builtin_constant_p(__VA_ARGS__) /* NOLINT(cppcoreguidelines-pro-type-vararg, hicpp-vararg) */ +# endif + +# define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ + _Pragma( "clang diagnostic ignored \"-Wexit-time-destructors\"" ) \ + _Pragma( "clang diagnostic ignored \"-Wglobal-constructors\"") + +# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \ + _Pragma( "clang diagnostic ignored \"-Wparentheses\"" ) + +# define CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS \ + _Pragma( "clang diagnostic ignored \"-Wunused-variable\"" ) + +# define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \ + _Pragma( "clang diagnostic ignored \"-Wgnu-zero-variadic-macro-arguments\"" ) + +# define CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \ + _Pragma( "clang diagnostic ignored \"-Wunused-template\"" ) + +#endif // __clang__ + +//////////////////////////////////////////////////////////////////////////////// +// Assume that non-Windows platforms support posix signals by default +#if !defined(CATCH_PLATFORM_WINDOWS) + #define CATCH_INTERNAL_CONFIG_POSIX_SIGNALS +#endif + +//////////////////////////////////////////////////////////////////////////////// +// We know some environments not to support full POSIX signals +#if defined(__CYGWIN__) || defined(__QNX__) || defined(__EMSCRIPTEN__) || defined(__DJGPP__) + #define CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS +#endif + +#ifdef __OS400__ +# define CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS +# define CATCH_CONFIG_COLOUR_NONE +#endif + +//////////////////////////////////////////////////////////////////////////////// +// Android somehow still does not support std::to_string +#if defined(__ANDROID__) +# define CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING +# define CATCH_INTERNAL_CONFIG_ANDROID_LOGWRITE +#endif + +//////////////////////////////////////////////////////////////////////////////// +// Not all Windows environments support SEH properly +#if defined(__MINGW32__) +# define CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH +#endif + +//////////////////////////////////////////////////////////////////////////////// +// PS4 +#if defined(__ORBIS__) +# define CATCH_INTERNAL_CONFIG_NO_NEW_CAPTURE +#endif + +//////////////////////////////////////////////////////////////////////////////// +// Cygwin +#ifdef __CYGWIN__ + +// Required for some versions of Cygwin to declare gettimeofday +// see: http://stackoverflow.com/questions/36901803/gettimeofday-not-declared-in-this-scope-cygwin +# define _BSD_SOURCE +// some versions of cygwin (most) do not support std::to_string. Use the libstd check. +// https://gcc.gnu.org/onlinedocs/gcc-4.8.2/libstdc++/api/a01053_source.html line 2812-2813 +# if !((__cplusplus >= 201103L) && defined(_GLIBCXX_USE_C99) \ + && !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF)) + +# define CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING + +# endif +#endif // __CYGWIN__ + +//////////////////////////////////////////////////////////////////////////////// +// Visual C++ +#if defined(_MSC_VER) + +# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION __pragma( warning(push) ) +# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION __pragma( warning(pop) ) + +// Universal Windows platform does not support SEH +// Or console colours (or console at all...) +# if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP) +# define CATCH_CONFIG_COLOUR_NONE +# else +# define CATCH_INTERNAL_CONFIG_WINDOWS_SEH +# endif + +// MSVC traditional preprocessor needs some workaround for __VA_ARGS__ +// _MSVC_TRADITIONAL == 0 means new conformant preprocessor +// _MSVC_TRADITIONAL == 1 means old traditional non-conformant preprocessor +# if !defined(__clang__) // Handle Clang masquerading for msvc +# if !defined(_MSVC_TRADITIONAL) || (defined(_MSVC_TRADITIONAL) && _MSVC_TRADITIONAL) +# define CATCH_INTERNAL_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR +# endif // MSVC_TRADITIONAL +# endif // __clang__ + +#endif // _MSC_VER + +#if defined(_REENTRANT) || defined(_MSC_VER) +// Enable async processing, as -pthread is specified or no additional linking is required +# define CATCH_INTERNAL_CONFIG_USE_ASYNC +#endif // _MSC_VER + +//////////////////////////////////////////////////////////////////////////////// +// Check if we are compiled with -fno-exceptions or equivalent +#if defined(__EXCEPTIONS) || defined(__cpp_exceptions) || defined(_CPPUNWIND) +# define CATCH_INTERNAL_CONFIG_EXCEPTIONS_ENABLED +#endif + +//////////////////////////////////////////////////////////////////////////////// +// DJGPP +#ifdef __DJGPP__ +# define CATCH_INTERNAL_CONFIG_NO_WCHAR +#endif // __DJGPP__ + +//////////////////////////////////////////////////////////////////////////////// +// Embarcadero C++Build +#if defined(__BORLANDC__) + #define CATCH_INTERNAL_CONFIG_POLYFILL_ISNAN +#endif + +//////////////////////////////////////////////////////////////////////////////// + +// Use of __COUNTER__ is suppressed during code analysis in +// CLion/AppCode 2017.2.x and former, because __COUNTER__ is not properly +// handled by it. +// Otherwise all supported compilers support COUNTER macro, +// but user still might want to turn it off +#if ( !defined(__JETBRAINS_IDE__) || __JETBRAINS_IDE__ >= 20170300L ) + #define CATCH_INTERNAL_CONFIG_COUNTER +#endif + +//////////////////////////////////////////////////////////////////////////////// + +// RTX is a special version of Windows that is real time. +// This means that it is detected as Windows, but does not provide +// the same set of capabilities as real Windows does. +#if defined(UNDER_RTSS) || defined(RTX64_BUILD) + #define CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH + #define CATCH_INTERNAL_CONFIG_NO_ASYNC + #define CATCH_CONFIG_COLOUR_NONE +#endif + +#if !defined(_GLIBCXX_USE_C99_MATH_TR1) +#define CATCH_INTERNAL_CONFIG_GLOBAL_NEXTAFTER +#endif + +// Various stdlib support checks that require __has_include +#if defined(__has_include) + // Check if string_view is available and usable + #if __has_include() && defined(CATCH_CPP17_OR_GREATER) + # define CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW + #endif + + // Check if optional is available and usable + # if __has_include() && defined(CATCH_CPP17_OR_GREATER) + # define CATCH_INTERNAL_CONFIG_CPP17_OPTIONAL + # endif // __has_include() && defined(CATCH_CPP17_OR_GREATER) + + // Check if byte is available and usable + # if __has_include() && defined(CATCH_CPP17_OR_GREATER) + # include + # if __cpp_lib_byte > 0 + # define CATCH_INTERNAL_CONFIG_CPP17_BYTE + # endif + # endif // __has_include() && defined(CATCH_CPP17_OR_GREATER) + + // Check if variant is available and usable + # if __has_include() && defined(CATCH_CPP17_OR_GREATER) + # if defined(__clang__) && (__clang_major__ < 8) + // work around clang bug with libstdc++ https://bugs.llvm.org/show_bug.cgi?id=31852 + // fix should be in clang 8, workaround in libstdc++ 8.2 + # include + # if defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9) + # define CATCH_CONFIG_NO_CPP17_VARIANT + # else + # define CATCH_INTERNAL_CONFIG_CPP17_VARIANT + # endif // defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9) + # else + # define CATCH_INTERNAL_CONFIG_CPP17_VARIANT + # endif // defined(__clang__) && (__clang_major__ < 8) + # endif // __has_include() && defined(CATCH_CPP17_OR_GREATER) +#endif // defined(__has_include) + +#if defined(CATCH_INTERNAL_CONFIG_COUNTER) && !defined(CATCH_CONFIG_NO_COUNTER) && !defined(CATCH_CONFIG_COUNTER) +# define CATCH_CONFIG_COUNTER +#endif +#if defined(CATCH_INTERNAL_CONFIG_WINDOWS_SEH) && !defined(CATCH_CONFIG_NO_WINDOWS_SEH) && !defined(CATCH_CONFIG_WINDOWS_SEH) && !defined(CATCH_INTERNAL_CONFIG_NO_WINDOWS_SEH) +# define CATCH_CONFIG_WINDOWS_SEH +#endif +// This is set by default, because we assume that unix compilers are posix-signal-compatible by default. +#if defined(CATCH_INTERNAL_CONFIG_POSIX_SIGNALS) && !defined(CATCH_INTERNAL_CONFIG_NO_POSIX_SIGNALS) && !defined(CATCH_CONFIG_NO_POSIX_SIGNALS) && !defined(CATCH_CONFIG_POSIX_SIGNALS) +# define CATCH_CONFIG_POSIX_SIGNALS +#endif +// This is set by default, because we assume that compilers with no wchar_t support are just rare exceptions. +#if !defined(CATCH_INTERNAL_CONFIG_NO_WCHAR) && !defined(CATCH_CONFIG_NO_WCHAR) && !defined(CATCH_CONFIG_WCHAR) +# define CATCH_CONFIG_WCHAR +#endif + +#if !defined(CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING) && !defined(CATCH_CONFIG_NO_CPP11_TO_STRING) && !defined(CATCH_CONFIG_CPP11_TO_STRING) +# define CATCH_CONFIG_CPP11_TO_STRING +#endif + +#if defined(CATCH_INTERNAL_CONFIG_CPP17_OPTIONAL) && !defined(CATCH_CONFIG_NO_CPP17_OPTIONAL) && !defined(CATCH_CONFIG_CPP17_OPTIONAL) +# define CATCH_CONFIG_CPP17_OPTIONAL +#endif + +#if defined(CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW) && !defined(CATCH_CONFIG_NO_CPP17_STRING_VIEW) && !defined(CATCH_CONFIG_CPP17_STRING_VIEW) +# define CATCH_CONFIG_CPP17_STRING_VIEW +#endif + +#if defined(CATCH_INTERNAL_CONFIG_CPP17_VARIANT) && !defined(CATCH_CONFIG_NO_CPP17_VARIANT) && !defined(CATCH_CONFIG_CPP17_VARIANT) +# define CATCH_CONFIG_CPP17_VARIANT +#endif + +#if defined(CATCH_INTERNAL_CONFIG_CPP17_BYTE) && !defined(CATCH_CONFIG_NO_CPP17_BYTE) && !defined(CATCH_CONFIG_CPP17_BYTE) +# define CATCH_CONFIG_CPP17_BYTE +#endif + +#if defined(CATCH_CONFIG_EXPERIMENTAL_REDIRECT) +# define CATCH_INTERNAL_CONFIG_NEW_CAPTURE +#endif + +#if defined(CATCH_INTERNAL_CONFIG_NEW_CAPTURE) && !defined(CATCH_INTERNAL_CONFIG_NO_NEW_CAPTURE) && !defined(CATCH_CONFIG_NO_NEW_CAPTURE) && !defined(CATCH_CONFIG_NEW_CAPTURE) +# define CATCH_CONFIG_NEW_CAPTURE +#endif + +#if !defined(CATCH_INTERNAL_CONFIG_EXCEPTIONS_ENABLED) && !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) +# define CATCH_CONFIG_DISABLE_EXCEPTIONS +#endif + +#if defined(CATCH_INTERNAL_CONFIG_POLYFILL_ISNAN) && !defined(CATCH_CONFIG_NO_POLYFILL_ISNAN) && !defined(CATCH_CONFIG_POLYFILL_ISNAN) +# define CATCH_CONFIG_POLYFILL_ISNAN +#endif + +#if defined(CATCH_INTERNAL_CONFIG_USE_ASYNC) && !defined(CATCH_INTERNAL_CONFIG_NO_ASYNC) && !defined(CATCH_CONFIG_NO_USE_ASYNC) && !defined(CATCH_CONFIG_USE_ASYNC) +# define CATCH_CONFIG_USE_ASYNC +#endif + +#if defined(CATCH_INTERNAL_CONFIG_ANDROID_LOGWRITE) && !defined(CATCH_CONFIG_NO_ANDROID_LOGWRITE) && !defined(CATCH_CONFIG_ANDROID_LOGWRITE) +# define CATCH_CONFIG_ANDROID_LOGWRITE +#endif + +#if defined(CATCH_INTERNAL_CONFIG_GLOBAL_NEXTAFTER) && !defined(CATCH_CONFIG_NO_GLOBAL_NEXTAFTER) && !defined(CATCH_CONFIG_GLOBAL_NEXTAFTER) +# define CATCH_CONFIG_GLOBAL_NEXTAFTER +#endif + +// Even if we do not think the compiler has that warning, we still have +// to provide a macro that can be used by the code. +#if !defined(CATCH_INTERNAL_START_WARNINGS_SUPPRESSION) +# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION +#endif +#if !defined(CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION) +# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION +#endif +#if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS) +# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS +#endif +#if !defined(CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS) +# define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS +#endif +#if !defined(CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS) +# define CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS +#endif +#if !defined(CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS) +# define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS +#endif + +// The goal of this macro is to avoid evaluation of the arguments, but +// still have the compiler warn on problems inside... +#if !defined(CATCH_INTERNAL_IGNORE_BUT_WARN) +# define CATCH_INTERNAL_IGNORE_BUT_WARN(...) +#endif + +#if defined(__APPLE__) && defined(__apple_build_version__) && (__clang_major__ < 10) +# undef CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS +#elif defined(__clang__) && (__clang_major__ < 5) +# undef CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS +#endif + +#if !defined(CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS) +# define CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS +#endif + +#if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS) +#define CATCH_TRY if ((true)) +#define CATCH_CATCH_ALL if ((false)) +#define CATCH_CATCH_ANON(type) if ((false)) +#else +#define CATCH_TRY try +#define CATCH_CATCH_ALL catch (...) +#define CATCH_CATCH_ANON(type) catch (type) +#endif + +#if defined(CATCH_INTERNAL_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR) && !defined(CATCH_CONFIG_NO_TRADITIONAL_MSVC_PREPROCESSOR) && !defined(CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR) +#define CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR +#endif + +// end catch_compiler_capabilities.h +#define INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) name##line +#define INTERNAL_CATCH_UNIQUE_NAME_LINE( name, line ) INTERNAL_CATCH_UNIQUE_NAME_LINE2( name, line ) +#ifdef CATCH_CONFIG_COUNTER +# define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __COUNTER__ ) +#else +# define INTERNAL_CATCH_UNIQUE_NAME( name ) INTERNAL_CATCH_UNIQUE_NAME_LINE( name, __LINE__ ) +#endif + +#include +#include +#include + +// We need a dummy global operator<< so we can bring it into Catch namespace later +struct Catch_global_namespace_dummy {}; +std::ostream& operator<<(std::ostream&, Catch_global_namespace_dummy); + +namespace Catch { + + struct CaseSensitive { enum Choice { + Yes, + No + }; }; + + class NonCopyable { + NonCopyable( NonCopyable const& ) = delete; + NonCopyable( NonCopyable && ) = delete; + NonCopyable& operator = ( NonCopyable const& ) = delete; + NonCopyable& operator = ( NonCopyable && ) = delete; + + protected: + NonCopyable(); + virtual ~NonCopyable(); + }; + + struct SourceLineInfo { + + SourceLineInfo() = delete; + SourceLineInfo( char const* _file, std::size_t _line ) noexcept + : file( _file ), + line( _line ) + {} + + SourceLineInfo( SourceLineInfo const& other ) = default; + SourceLineInfo& operator = ( SourceLineInfo const& ) = default; + SourceLineInfo( SourceLineInfo&& ) noexcept = default; + SourceLineInfo& operator = ( SourceLineInfo&& ) noexcept = default; + + bool empty() const noexcept { return file[0] == '\0'; } + bool operator == ( SourceLineInfo const& other ) const noexcept; + bool operator < ( SourceLineInfo const& other ) const noexcept; + + char const* file; + std::size_t line; + }; + + std::ostream& operator << ( std::ostream& os, SourceLineInfo const& info ); + + // Bring in operator<< from global namespace into Catch namespace + // This is necessary because the overload of operator<< above makes + // lookup stop at namespace Catch + using ::operator<<; + + // Use this in variadic streaming macros to allow + // >> +StreamEndStop + // as well as + // >> stuff +StreamEndStop + struct StreamEndStop { + std::string operator+() const; + }; + template + T const& operator + ( T const& value, StreamEndStop ) { + return value; + } +} + +#define CATCH_INTERNAL_LINEINFO \ + ::Catch::SourceLineInfo( __FILE__, static_cast( __LINE__ ) ) + +// end catch_common.h +namespace Catch { + + struct RegistrarForTagAliases { + RegistrarForTagAliases( char const* alias, char const* tag, SourceLineInfo const& lineInfo ); + }; + +} // end namespace Catch + +#define CATCH_REGISTER_TAG_ALIAS( alias, spec ) \ + CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \ + CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \ + namespace{ Catch::RegistrarForTagAliases INTERNAL_CATCH_UNIQUE_NAME( AutoRegisterTagAlias )( alias, spec, CATCH_INTERNAL_LINEINFO ); } \ + CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION + +// end catch_tag_alias_autoregistrar.h +// start catch_test_registry.h + +// start catch_interfaces_testcase.h + +#include + +namespace Catch { + + class TestSpec; + + struct ITestInvoker { + virtual void invoke () const = 0; + virtual ~ITestInvoker(); + }; + + class TestCase; + struct IConfig; + + struct ITestCaseRegistry { + virtual ~ITestCaseRegistry(); + virtual std::vector const& getAllTests() const = 0; + virtual std::vector const& getAllTestsSorted( IConfig const& config ) const = 0; + }; + + bool isThrowSafe( TestCase const& testCase, IConfig const& config ); + bool matchTest( TestCase const& testCase, TestSpec const& testSpec, IConfig const& config ); + std::vector filterTests( std::vector const& testCases, TestSpec const& testSpec, IConfig const& config ); + std::vector const& getAllTestCasesSorted( IConfig const& config ); + +} + +// end catch_interfaces_testcase.h +// start catch_stringref.h + +#include +#include +#include +#include + +namespace Catch { + + /// A non-owning string class (similar to the forthcoming std::string_view) + /// Note that, because a StringRef may be a substring of another string, + /// it may not be null terminated. + class StringRef { + public: + using size_type = std::size_t; + using const_iterator = const char*; + + private: + static constexpr char const* const s_empty = ""; + + char const* m_start = s_empty; + size_type m_size = 0; + + public: // construction + constexpr StringRef() noexcept = default; + + StringRef( char const* rawChars ) noexcept; + + constexpr StringRef( char const* rawChars, size_type size ) noexcept + : m_start( rawChars ), + m_size( size ) + {} + + StringRef( std::string const& stdString ) noexcept + : m_start( stdString.c_str() ), + m_size( stdString.size() ) + {} + + explicit operator std::string() const { + return std::string(m_start, m_size); + } + + public: // operators + auto operator == ( StringRef const& other ) const noexcept -> bool; + auto operator != (StringRef const& other) const noexcept -> bool { + return !(*this == other); + } + + auto operator[] ( size_type index ) const noexcept -> char { + assert(index < m_size); + return m_start[index]; + } + + public: // named queries + constexpr auto empty() const noexcept -> bool { + return m_size == 0; + } + constexpr auto size() const noexcept -> size_type { + return m_size; + } + + // Returns the current start pointer. If the StringRef is not + // null-terminated, throws std::domain_exception + auto c_str() const -> char const*; + + public: // substrings and searches + // Returns a substring of [start, start + length). + // If start + length > size(), then the substring is [start, size()). + // If start > size(), then the substring is empty. + auto substr( size_type start, size_type length ) const noexcept -> StringRef; + + // Returns the current start pointer. May not be null-terminated. + auto data() const noexcept -> char const*; + + constexpr auto isNullTerminated() const noexcept -> bool { + return m_start[m_size] == '\0'; + } + + public: // iterators + constexpr const_iterator begin() const { return m_start; } + constexpr const_iterator end() const { return m_start + m_size; } + }; + + auto operator += ( std::string& lhs, StringRef const& sr ) -> std::string&; + auto operator << ( std::ostream& os, StringRef const& sr ) -> std::ostream&; + + constexpr auto operator "" _sr( char const* rawChars, std::size_t size ) noexcept -> StringRef { + return StringRef( rawChars, size ); + } +} // namespace Catch + +constexpr auto operator "" _catch_sr( char const* rawChars, std::size_t size ) noexcept -> Catch::StringRef { + return Catch::StringRef( rawChars, size ); +} + +// end catch_stringref.h +// start catch_preprocessor.hpp + + +#define CATCH_RECURSION_LEVEL0(...) __VA_ARGS__ +#define CATCH_RECURSION_LEVEL1(...) CATCH_RECURSION_LEVEL0(CATCH_RECURSION_LEVEL0(CATCH_RECURSION_LEVEL0(__VA_ARGS__))) +#define CATCH_RECURSION_LEVEL2(...) CATCH_RECURSION_LEVEL1(CATCH_RECURSION_LEVEL1(CATCH_RECURSION_LEVEL1(__VA_ARGS__))) +#define CATCH_RECURSION_LEVEL3(...) CATCH_RECURSION_LEVEL2(CATCH_RECURSION_LEVEL2(CATCH_RECURSION_LEVEL2(__VA_ARGS__))) +#define CATCH_RECURSION_LEVEL4(...) CATCH_RECURSION_LEVEL3(CATCH_RECURSION_LEVEL3(CATCH_RECURSION_LEVEL3(__VA_ARGS__))) +#define CATCH_RECURSION_LEVEL5(...) CATCH_RECURSION_LEVEL4(CATCH_RECURSION_LEVEL4(CATCH_RECURSION_LEVEL4(__VA_ARGS__))) + +#ifdef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR +#define INTERNAL_CATCH_EXPAND_VARGS(...) __VA_ARGS__ +// MSVC needs more evaluations +#define CATCH_RECURSION_LEVEL6(...) CATCH_RECURSION_LEVEL5(CATCH_RECURSION_LEVEL5(CATCH_RECURSION_LEVEL5(__VA_ARGS__))) +#define CATCH_RECURSE(...) CATCH_RECURSION_LEVEL6(CATCH_RECURSION_LEVEL6(__VA_ARGS__)) +#else +#define CATCH_RECURSE(...) CATCH_RECURSION_LEVEL5(__VA_ARGS__) +#endif + +#define CATCH_REC_END(...) +#define CATCH_REC_OUT + +#define CATCH_EMPTY() +#define CATCH_DEFER(id) id CATCH_EMPTY() + +#define CATCH_REC_GET_END2() 0, CATCH_REC_END +#define CATCH_REC_GET_END1(...) CATCH_REC_GET_END2 +#define CATCH_REC_GET_END(...) CATCH_REC_GET_END1 +#define CATCH_REC_NEXT0(test, next, ...) next CATCH_REC_OUT +#define CATCH_REC_NEXT1(test, next) CATCH_DEFER ( CATCH_REC_NEXT0 ) ( test, next, 0) +#define CATCH_REC_NEXT(test, next) CATCH_REC_NEXT1(CATCH_REC_GET_END test, next) + +#define CATCH_REC_LIST0(f, x, peek, ...) , f(x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST1) ) ( f, peek, __VA_ARGS__ ) +#define CATCH_REC_LIST1(f, x, peek, ...) , f(x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST0) ) ( f, peek, __VA_ARGS__ ) +#define CATCH_REC_LIST2(f, x, peek, ...) f(x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST1) ) ( f, peek, __VA_ARGS__ ) + +#define CATCH_REC_LIST0_UD(f, userdata, x, peek, ...) , f(userdata, x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST1_UD) ) ( f, userdata, peek, __VA_ARGS__ ) +#define CATCH_REC_LIST1_UD(f, userdata, x, peek, ...) , f(userdata, x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST0_UD) ) ( f, userdata, peek, __VA_ARGS__ ) +#define CATCH_REC_LIST2_UD(f, userdata, x, peek, ...) f(userdata, x) CATCH_DEFER ( CATCH_REC_NEXT(peek, CATCH_REC_LIST1_UD) ) ( f, userdata, peek, __VA_ARGS__ ) + +// Applies the function macro `f` to each of the remaining parameters, inserts commas between the results, +// and passes userdata as the first parameter to each invocation, +// e.g. CATCH_REC_LIST_UD(f, x, a, b, c) evaluates to f(x, a), f(x, b), f(x, c) +#define CATCH_REC_LIST_UD(f, userdata, ...) CATCH_RECURSE(CATCH_REC_LIST2_UD(f, userdata, __VA_ARGS__, ()()(), ()()(), ()()(), 0)) + +#define CATCH_REC_LIST(f, ...) CATCH_RECURSE(CATCH_REC_LIST2(f, __VA_ARGS__, ()()(), ()()(), ()()(), 0)) + +#define INTERNAL_CATCH_EXPAND1(param) INTERNAL_CATCH_EXPAND2(param) +#define INTERNAL_CATCH_EXPAND2(...) INTERNAL_CATCH_NO## __VA_ARGS__ +#define INTERNAL_CATCH_DEF(...) INTERNAL_CATCH_DEF __VA_ARGS__ +#define INTERNAL_CATCH_NOINTERNAL_CATCH_DEF +#define INTERNAL_CATCH_STRINGIZE(...) INTERNAL_CATCH_STRINGIZE2(__VA_ARGS__) +#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR +#define INTERNAL_CATCH_STRINGIZE2(...) #__VA_ARGS__ +#define INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS(param) INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_REMOVE_PARENS(param)) +#else +// MSVC is adding extra space and needs another indirection to expand INTERNAL_CATCH_NOINTERNAL_CATCH_DEF +#define INTERNAL_CATCH_STRINGIZE2(...) INTERNAL_CATCH_STRINGIZE3(__VA_ARGS__) +#define INTERNAL_CATCH_STRINGIZE3(...) #__VA_ARGS__ +#define INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS(param) (INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_REMOVE_PARENS(param)) + 1) +#endif + +#define INTERNAL_CATCH_MAKE_NAMESPACE2(...) ns_##__VA_ARGS__ +#define INTERNAL_CATCH_MAKE_NAMESPACE(name) INTERNAL_CATCH_MAKE_NAMESPACE2(name) + +#define INTERNAL_CATCH_REMOVE_PARENS(...) INTERNAL_CATCH_EXPAND1(INTERNAL_CATCH_DEF __VA_ARGS__) + +#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR +#define INTERNAL_CATCH_MAKE_TYPE_LIST2(...) decltype(get_wrapper()) +#define INTERNAL_CATCH_MAKE_TYPE_LIST(...) INTERNAL_CATCH_MAKE_TYPE_LIST2(INTERNAL_CATCH_REMOVE_PARENS(__VA_ARGS__)) +#else +#define INTERNAL_CATCH_MAKE_TYPE_LIST2(...) INTERNAL_CATCH_EXPAND_VARGS(decltype(get_wrapper())) +#define INTERNAL_CATCH_MAKE_TYPE_LIST(...) INTERNAL_CATCH_EXPAND_VARGS(INTERNAL_CATCH_MAKE_TYPE_LIST2(INTERNAL_CATCH_REMOVE_PARENS(__VA_ARGS__))) +#endif + +#define INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(...)\ + CATCH_REC_LIST(INTERNAL_CATCH_MAKE_TYPE_LIST,__VA_ARGS__) + +#define INTERNAL_CATCH_REMOVE_PARENS_1_ARG(_0) INTERNAL_CATCH_REMOVE_PARENS(_0) +#define INTERNAL_CATCH_REMOVE_PARENS_2_ARG(_0, _1) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_1_ARG(_1) +#define INTERNAL_CATCH_REMOVE_PARENS_3_ARG(_0, _1, _2) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_2_ARG(_1, _2) +#define INTERNAL_CATCH_REMOVE_PARENS_4_ARG(_0, _1, _2, _3) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_3_ARG(_1, _2, _3) +#define INTERNAL_CATCH_REMOVE_PARENS_5_ARG(_0, _1, _2, _3, _4) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_4_ARG(_1, _2, _3, _4) +#define INTERNAL_CATCH_REMOVE_PARENS_6_ARG(_0, _1, _2, _3, _4, _5) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_5_ARG(_1, _2, _3, _4, _5) +#define INTERNAL_CATCH_REMOVE_PARENS_7_ARG(_0, _1, _2, _3, _4, _5, _6) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_6_ARG(_1, _2, _3, _4, _5, _6) +#define INTERNAL_CATCH_REMOVE_PARENS_8_ARG(_0, _1, _2, _3, _4, _5, _6, _7) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_7_ARG(_1, _2, _3, _4, _5, _6, _7) +#define INTERNAL_CATCH_REMOVE_PARENS_9_ARG(_0, _1, _2, _3, _4, _5, _6, _7, _8) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_8_ARG(_1, _2, _3, _4, _5, _6, _7, _8) +#define INTERNAL_CATCH_REMOVE_PARENS_10_ARG(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_9_ARG(_1, _2, _3, _4, _5, _6, _7, _8, _9) +#define INTERNAL_CATCH_REMOVE_PARENS_11_ARG(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_10_ARG(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10) + +#define INTERNAL_CATCH_VA_NARGS_IMPL(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, N, ...) N + +#define INTERNAL_CATCH_TYPE_GEN\ + template struct TypeList {};\ + template\ + constexpr auto get_wrapper() noexcept -> TypeList { return {}; }\ + template class...> struct TemplateTypeList{};\ + template class...Cs>\ + constexpr auto get_wrapper() noexcept -> TemplateTypeList { return {}; }\ + template\ + struct append;\ + template\ + struct rewrap;\ + template class, typename...>\ + struct create;\ + template class, typename>\ + struct convert;\ + \ + template \ + struct append { using type = T; };\ + template< template class L1, typename...E1, template class L2, typename...E2, typename...Rest>\ + struct append, L2, Rest...> { using type = typename append, Rest...>::type; };\ + template< template class L1, typename...E1, typename...Rest>\ + struct append, TypeList, Rest...> { using type = L1; };\ + \ + template< template class Container, template class List, typename...elems>\ + struct rewrap, List> { using type = TypeList>; };\ + template< template class Container, template class List, class...Elems, typename...Elements>\ + struct rewrap, List, Elements...> { using type = typename append>, typename rewrap, Elements...>::type>::type; };\ + \ + template