Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package libfsfat for openSUSE:Factory checked in at 2026-08-24 12:12:07 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/libfsfat (Old) and /work/SRC/openSUSE:Factory/.libfsfat.new.1258 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "libfsfat" Mon Aug 24 12:12:07 2026 rev:14 rq:1373342 version:20260823 Changes: -------- --- /work/SRC/openSUSE:Factory/libfsfat/libfsfat.changes 2026-08-22 21:38:58.000279662 +0200 +++ /work/SRC/openSUSE:Factory/.libfsfat.new.1258/libfsfat.changes 2026-08-24 12:17:33.510685067 +0200 @@ -1,0 +2,7 @@ +Mon Aug 24 07:41:32 UTC 2026 - Jan Engelhardt <[email protected]> + +- Update to release 20260823 + * Improved error handling about timestamp reading + * A bit of EXFAT support: support for directory data stream flags + +------------------------------------------------------------------- Old: ---- libfsfat-experimental-20260822.tar.gz New: ---- libfsfat-experimental-20260823.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ libfsfat.spec ++++++ --- /var/tmp/diff_new_pack.HA6DjN/_old 2026-08-24 12:17:34.335714416 +0200 +++ /var/tmp/diff_new_pack.HA6DjN/_new 2026-08-24 12:17:34.338714523 +0200 @@ -20,7 +20,7 @@ Name: libfsfat %define lname libfsfat1 -Version: 20260822 +Version: 20260823 Release: 0 Summary: Library and tools for accessing the FAT filesystem License: LGPL-3.0-or-later ++++++ _scmsync.obsinfo ++++++ --- /var/tmp/diff_new_pack.HA6DjN/_old 2026-08-24 12:17:34.418717369 +0200 +++ /var/tmp/diff_new_pack.HA6DjN/_new 2026-08-24 12:17:34.425717618 +0200 @@ -1,5 +1,5 @@ -mtime: 1787409833 -commit: cd7644cf810477b404170bae21e7e605a68b60db80502d86baf0ff7ec66cde23 +mtime: 1787557355 +commit: ee7e87f13078860afd76726f88c8fa1ebadde6076583652ee921c6d04e90baa5 url: https://src.opensuse.org/security-forensics/libfsfat revision: master ++++++ build.specials.obscpio ++++++ ++++++ build.specials.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/.gitignore new/.gitignore --- old/.gitignore 1970-01-01 01:00:00.000000000 +0100 +++ new/.gitignore 2026-08-24 09:42:35.000000000 +0200 @@ -0,0 +1 @@ +.osc ++++++ libfsfat-experimental-20260822.tar.gz -> libfsfat-experimental-20260823.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libfsfat-20260822/common/config.h new/libfsfat-20260823/common/config.h --- old/libfsfat-20260822/common/config.h 2026-08-22 12:52:14.000000000 +0200 +++ new/libfsfat-20260823/common/config.h 2026-08-22 18:58:30.000000000 +0200 @@ -611,7 +611,7 @@ #define PACKAGE_NAME "libfsfat" /* Define to the full name and version of this package. */ -#define PACKAGE_STRING "libfsfat 20260822" +#define PACKAGE_STRING "libfsfat 20260823" /* Define to the one symbol short name of this package. */ #define PACKAGE_TARNAME "libfsfat" @@ -620,7 +620,7 @@ #define PACKAGE_URL "" /* Define to the version of this package. */ -#define PACKAGE_VERSION "20260822" +#define PACKAGE_VERSION "20260823" /* The size of 'int', as computed by sizeof. */ #define SIZEOF_INT 4 @@ -649,7 +649,7 @@ /* #undef TM_IN_SYS_TIME */ /* Version number of package */ -#define VERSION "20260822" +#define VERSION "20260823" /* Number of bits in a file offset, on hosts where this is settable. */ /* #undef _FILE_OFFSET_BITS */ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libfsfat-20260822/configure new/libfsfat-20260823/configure --- old/libfsfat-20260822/configure 2026-08-22 12:52:06.000000000 +0200 +++ new/libfsfat-20260823/configure 2026-08-22 18:58:22.000000000 +0200 @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.72 for libfsfat 20260822. +# Generated by GNU Autoconf 2.72 for libfsfat 20260823. # # Report bugs to <https://github.com/libyal/libfsfat/issues>. # @@ -614,8 +614,8 @@ # Identity of this package. PACKAGE_NAME='libfsfat' PACKAGE_TARNAME='libfsfat' -PACKAGE_VERSION='20260822' -PACKAGE_STRING='libfsfat 20260822' +PACKAGE_VERSION='20260823' +PACKAGE_STRING='libfsfat 20260823' PACKAGE_BUGREPORT='https://github.com/libyal/libfsfat/issues' PACKAGE_URL='' @@ -1700,7 +1700,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -'configure' configures libfsfat 20260822 to adapt to many kinds of systems. +'configure' configures libfsfat 20260823 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1771,7 +1771,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of libfsfat 20260822:";; + short | recursive ) echo "Configuration of libfsfat 20260823:";; esac cat <<\_ACEOF @@ -2048,7 +2048,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -libfsfat configure 20260822 +libfsfat configure 20260823 generated by GNU Autoconf 2.72 Copyright (C) 2023 Free Software Foundation, Inc. @@ -2790,7 +2790,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by libfsfat $as_me 20260822, which was +It was created by libfsfat $as_me 20260823, which was generated by GNU Autoconf 2.72. Invocation command line was $ $0$ac_configure_args_raw @@ -4487,7 +4487,7 @@ # Define the identity of the package. PACKAGE='libfsfat' - VERSION='20260822' + VERSION='20260823' printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h @@ -72502,7 +72502,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by libfsfat $as_me 20260822, which was +This file was extended by libfsfat $as_me 20260823, which was generated by GNU Autoconf 2.72. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -72570,7 +72570,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config='$ac_cs_config_escaped' ac_cs_version="\\ -libfsfat config.status 20260822 +libfsfat config.status 20260823 configured by $0, generated by GNU Autoconf 2.72, with options \\"\$ac_cs_config\\" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libfsfat-20260822/configure.ac new/libfsfat-20260823/configure.ac --- old/libfsfat-20260822/configure.ac 2026-08-22 12:42:13.000000000 +0200 +++ new/libfsfat-20260823/configure.ac 2026-08-22 18:40:46.000000000 +0200 @@ -2,7 +2,7 @@ AC_INIT( [libfsfat], - [20260822], + [20260823], [https://github.com/libyal/libfsfat/issues]) AC_CONFIG_SRCDIR( diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libfsfat-20260822/dpkg/changelog new/libfsfat-20260823/dpkg/changelog --- old/libfsfat-20260822/dpkg/changelog 2026-08-22 12:52:14.000000000 +0200 +++ new/libfsfat-20260823/dpkg/changelog 2026-08-22 18:58:30.000000000 +0200 @@ -1,5 +1,5 @@ -libfsfat (20260822-1) unstable; urgency=low +libfsfat (20260823-1) unstable; urgency=low * Auto-generated - -- Joachim Metz <[email protected]> Sat, 22 Aug 2026 12:52:13 +0200 + -- Joachim Metz <[email protected]> Sat, 22 Aug 2026 18:58:30 +0200 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libfsfat-20260822/fsfattools/mount_file_entry.c new/libfsfat-20260823/fsfattools/mount_file_entry.c --- old/libfsfat-20260822/fsfattools/mount_file_entry.c 2026-08-19 06:24:10.000000000 +0200 +++ new/libfsfat-20260823/fsfattools/mount_file_entry.c 2026-08-22 18:29:31.000000000 +0200 @@ -254,6 +254,7 @@ { static char *function = "mount_file_entry_get_creation_time"; uint64_t fat_timestamp = 0; + int result = 0; #if defined( WINAPI ) uint64_t filetime = 0; @@ -283,10 +284,12 @@ return( -1 ); } - if( libfsfat_file_entry_get_creation_time( - file_entry->fsfat_file_entry, - &fat_timestamp, - error ) != 1 ) + result = libfsfat_file_entry_get_creation_time( + file_entry->fsfat_file_entry, + &fat_timestamp, + error ); + + if( result == -1 ) { libcerror_error_set( error, @@ -297,19 +300,26 @@ return( -1 ); } -#if defined( WINAPI ) - if( fat_timestamp != 0 ) + else if( result == 0 ) { - filetime = ( fat_timestamp + 1196000640000UL ) * 100000UL; + *creation_time = 0; } - *creation_time = filetime; -#else - if( fat_timestamp != 0 ) + else { - posix_time = (int64_t) ( ( fat_timestamp + 3155328000000UL ) * 10000000UL ); - } - *creation_time = (uint64_t) posix_time; +#if defined( WINAPI ) + if( fat_timestamp != 0 ) + { + filetime = ( fat_timestamp + 1196000640000UL ) * 100000UL; + } + *creation_time = filetime; +#else + if( fat_timestamp != 0 ) + { + posix_time = (int64_t) ( ( fat_timestamp + 3155328000000UL ) * 10000000UL ); + } + *creation_time = (uint64_t) posix_time; #endif + } return( 1 ); } @@ -325,6 +335,7 @@ { static char *function = "mount_file_entry_get_access_time"; uint64_t fat_timestamp = 0; + int result = 0; #if defined( WINAPI ) uint64_t filetime = 0; @@ -354,10 +365,12 @@ return( -1 ); } - if( libfsfat_file_entry_get_access_time( - file_entry->fsfat_file_entry, - &fat_timestamp, - error ) != 1 ) + result = libfsfat_file_entry_get_access_time( + file_entry->fsfat_file_entry, + &fat_timestamp, + error ); + + if( result == -1 ) { libcerror_error_set( error, @@ -368,19 +381,26 @@ return( -1 ); } -#if defined( WINAPI ) - if( fat_timestamp != 0 ) + else if( result == 0 ) { - filetime = ( fat_timestamp + 1196000640000UL ) * 100000UL; + *access_time = 0; } - *access_time = filetime; -#else - if( fat_timestamp != 0 ) + else { - posix_time = (int64_t) ( ( fat_timestamp + 3155328000000UL ) * 10000000UL ); - } - *access_time = (uint64_t) posix_time; +#if defined( WINAPI ) + if( fat_timestamp != 0 ) + { + filetime = ( fat_timestamp + 1196000640000UL ) * 100000UL; + } + *access_time = filetime; +#else + if( fat_timestamp != 0 ) + { + posix_time = (int64_t) ( ( fat_timestamp + 3155328000000UL ) * 10000000UL ); + } + *access_time = (uint64_t) posix_time; #endif + } return( 1 ); } @@ -396,6 +416,7 @@ { static char *function = "mount_file_entry_get_modification_time"; uint64_t fat_timestamp = 0; + int result = 0; #if defined( WINAPI ) uint64_t filetime = 0; @@ -425,10 +446,12 @@ return( -1 ); } - if( libfsfat_file_entry_get_modification_time( - file_entry->fsfat_file_entry, - &fat_timestamp, - error ) != 1 ) + result = libfsfat_file_entry_get_modification_time( + file_entry->fsfat_file_entry, + &fat_timestamp, + error ); + + if( result == -1 ) { libcerror_error_set( error, @@ -439,19 +462,26 @@ return( -1 ); } -#if defined( WINAPI ) - if( fat_timestamp != 0 ) + else if( result == 0 ) { - filetime = ( fat_timestamp + 1196000640000UL ) * 100000UL; + *modification_time = 0; } - *modification_time = filetime; -#else - if( fat_timestamp != 0 ) + else { - posix_time = (int64_t) ( ( fat_timestamp + 3155328000000UL ) * 10000000UL ); - } - *modification_time = (uint64_t) posix_time; +#if defined( WINAPI ) + if( fat_timestamp != 0 ) + { + filetime = ( fat_timestamp + 1196000640000UL ) * 100000UL; + } + *modification_time = filetime; +#else + if( fat_timestamp != 0 ) + { + posix_time = (int64_t) ( ( fat_timestamp + 3155328000000UL ) * 10000000UL ); + } + *modification_time = (uint64_t) posix_time; #endif + } return( 1 ); } @@ -504,6 +534,7 @@ { static char *function = "mount_file_entry_get_file_mode"; uint16_t file_attribute_flags = 0; + int result = 0; if( file_entry == NULL ) { @@ -527,10 +558,12 @@ return( -1 ); } - if( libfsfat_file_entry_get_file_attribute_flags( - file_entry->fsfat_file_entry, - &file_attribute_flags, - error ) != 1 ) + result = libfsfat_file_entry_get_file_attribute_flags( + file_entry->fsfat_file_entry, + &file_attribute_flags, + error ); + + if( result == -1 ) { libcerror_error_set( error, @@ -541,7 +574,8 @@ return( -1 ); } - if( ( file_attribute_flags & LIBFSFAT_FILE_ATTRIBUTE_FLAG_DIRECTORY ) != 0 ) + if( ( result == 0 ) + || ( ( file_attribute_flags & LIBFSFAT_FILE_ATTRIBUTE_FLAG_DIRECTORY ) != 0 ) ) { *file_mode = S_IFDIR | 0555; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libfsfat-20260822/include/libfsfat/definitions.h new/libfsfat-20260823/include/libfsfat/definitions.h --- old/libfsfat-20260822/include/libfsfat/definitions.h 2026-08-22 12:52:14.000000000 +0200 +++ new/libfsfat-20260823/include/libfsfat/definitions.h 2026-08-22 18:58:30.000000000 +0200 @@ -24,11 +24,11 @@ #include <libfsfat/types.h> -#define LIBFSFAT_VERSION 20260822 +#define LIBFSFAT_VERSION 20260823 /* The version string */ -#define LIBFSFAT_VERSION_STRING "20260822" +#define LIBFSFAT_VERSION_STRING "20260823" /* The file access * bit 1 set to 1 for read access diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libfsfat-20260822/libfsfat/fsfat_directory_entry.h new/libfsfat-20260823/libfsfat/fsfat_directory_entry.h --- old/libfsfat-20260822/libfsfat/fsfat_directory_entry.h 2026-08-19 06:20:59.000000000 +0200 +++ new/libfsfat-20260823/libfsfat/fsfat_directory_entry.h 2026-08-22 17:02:58.000000000 +0200 @@ -183,10 +183,10 @@ */ uint8_t entry_type; - /* Unknown + /* The entry flags * Consists of 1 byte */ - uint8_t unknown1; + uint8_t entry_flags; /* Unknown * Consists of 1 byte diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libfsfat-20260822/libfsfat/libfsfat.rc new/libfsfat-20260823/libfsfat/libfsfat.rc --- old/libfsfat-20260822/libfsfat/libfsfat.rc 2026-08-22 12:52:14.000000000 +0200 +++ new/libfsfat-20260823/libfsfat/libfsfat.rc 2026-08-22 18:58:30.000000000 +0200 @@ -22,12 +22,12 @@ BLOCK "040904E4" BEGIN VALUE "FileDescription", "Library to access the File Allocation Table (FAT) file system format\0" - VALUE "FileVersion", "20260822" "\0" + VALUE "FileVersion", "20260823" "\0" VALUE "InternalName", "libfsfat.dll\0" VALUE "LegalCopyright", "(C) 2021-2026, Joachim Metz <[email protected]>\0" VALUE "OriginalFilename", "libfsfat.dll\0" VALUE "ProductName", "libfsfat\0" - VALUE "ProductVersion", "20260822" "\0" + VALUE "ProductVersion", "20260823" "\0" VALUE "Comments", "For more information visit https://github.com/libyal/libfsfat/\0" END END diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libfsfat-20260822/libfsfat/libfsfat_definitions.h new/libfsfat-20260823/libfsfat/libfsfat_definitions.h --- old/libfsfat-20260822/libfsfat/libfsfat_definitions.h 2026-08-22 12:52:14.000000000 +0200 +++ new/libfsfat-20260823/libfsfat/libfsfat_definitions.h 2026-08-22 18:58:30.000000000 +0200 @@ -37,11 +37,11 @@ * for local use of libfsfat */ #else -#define LIBFSFAT_VERSION 20260822 +#define LIBFSFAT_VERSION 20260823 /* The version string */ -#define LIBFSFAT_VERSION_STRING "20260822" +#define LIBFSFAT_VERSION_STRING "20260823" /* The file access * bit 1 set to 1 for read access diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libfsfat-20260822/libfsfat/libfsfat_directory_entry.c new/libfsfat-20260823/libfsfat/libfsfat_directory_entry.c --- old/libfsfat-20260822/libfsfat/libfsfat_directory_entry.c 2026-08-19 06:20:59.000000000 +0200 +++ new/libfsfat-20260823/libfsfat/libfsfat_directory_entry.c 2026-08-22 17:19:33.000000000 +0200 @@ -812,6 +812,8 @@ ( (fsfat_directory_entry_exfat_data_stream_t *) data )->valid_data_size, directory_entry->valid_data_size ); + directory_entry->data_stream_flags = ( (fsfat_directory_entry_exfat_data_stream_t *) data )->entry_flags; + byte_stream_copy_to_uint32_little_endian( ( (fsfat_directory_entry_exfat_data_stream_t *) data )->data_start_cluster, directory_entry->data_start_cluster ); @@ -831,9 +833,9 @@ ( (fsfat_directory_entry_exfat_allocation_bitmap_t *) data )->entry_type ) ); libcnotify_printf( - "%s: unknown1\t\t\t\t: 0x%02" PRIx8 "\n", + "%s: entry flags\t\t\t\t: 0x%02" PRIx8 "\n", function, - ( (fsfat_directory_entry_exfat_data_stream_t *) data )->unknown1 ); + ( (fsfat_directory_entry_exfat_data_stream_t *) data )->entry_flags ); libcnotify_printf( "%s: unknown2\t\t\t\t: 0x%02" PRIx8 "\n", @@ -862,6 +864,11 @@ function, value_16bit ); + libcnotify_printf( + "%s: valid data size\t\t\t: %" PRIu64 "\n", + function, + directory_entry->valid_data_size ); + byte_stream_copy_to_uint32_little_endian( ( (fsfat_directory_entry_exfat_data_stream_t *) data )->unknown4, value_32bit ); @@ -871,11 +878,6 @@ value_32bit ); libcnotify_printf( - "%s: valid data size\t\t\t: %" PRIu64 "\n", - function, - directory_entry->valid_data_size ); - - libcnotify_printf( "%s: data start cluster\t\t\t: %" PRIu32 "\n", function, directory_entry->data_start_cluster ); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libfsfat-20260822/libfsfat/libfsfat_directory_entry.h new/libfsfat-20260823/libfsfat/libfsfat_directory_entry.h --- old/libfsfat-20260822/libfsfat/libfsfat_directory_entry.h 2026-08-19 06:20:59.000000000 +0200 +++ new/libfsfat-20260823/libfsfat/libfsfat_directory_entry.h 2026-08-22 17:03:45.000000000 +0200 @@ -129,6 +129,10 @@ */ uint64_t valid_data_size; + /* The data stream flags + */ + uint8_t data_stream_flags; + /* The flags */ uint8_t flags; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libfsfat-20260822/libfsfat/libfsfat_file_entry.c new/libfsfat-20260823/libfsfat/libfsfat_file_entry.c --- old/libfsfat-20260822/libfsfat/libfsfat_file_entry.c 2026-08-19 06:20:59.000000000 +0200 +++ new/libfsfat-20260823/libfsfat/libfsfat_file_entry.c 2026-08-22 18:30:02.000000000 +0200 @@ -1997,6 +1997,17 @@ } internal_file_entry = (libfsfat_internal_file_entry_t *) file_entry; + if( internal_file_entry->directory_entry == NULL ) + { + libcerror_error_set( + error, + LIBCERROR_ERROR_DOMAIN_RUNTIME, + LIBCERROR_RUNTIME_ERROR_VALUE_MISSING, + "%s: invalid file entry - missing directory entry.", + function ); + + return( -1 ); + } if( ( ( internal_file_entry->file_attribute_flags & LIBFSFAT_FILE_ATTRIBUTE_FLAG_DEVICE ) != 0 ) && ( ( internal_file_entry->file_attribute_flags & LIBFSFAT_FILE_ATTRIBUTE_FLAG_DIRECTORY ) != 0 ) && ( ( internal_file_entry->file_attribute_flags & LIBFSFAT_FILE_ATTRIBUTE_FLAG_VOLUME_LABEL ) != 0 ) ) @@ -2031,6 +2042,7 @@ internal_file_entry->file_system, internal_file_entry->cluster_number, internal_file_entry->data_size, + internal_file_entry->directory_entry->data_stream_flags, internal_file_entry->data_extents_array, &( internal_file_entry->cluster_block_stream ), error ) != 1 ) @@ -2113,6 +2125,17 @@ } internal_file_entry = (libfsfat_internal_file_entry_t *) file_entry; + if( internal_file_entry->directory_entry == NULL ) + { + libcerror_error_set( + error, + LIBCERROR_ERROR_DOMAIN_RUNTIME, + LIBCERROR_RUNTIME_ERROR_VALUE_MISSING, + "%s: invalid file entry - missing directory entry.", + function ); + + return( -1 ); + } if( ( ( internal_file_entry->file_attribute_flags & LIBFSFAT_FILE_ATTRIBUTE_FLAG_DEVICE ) != 0 ) && ( ( internal_file_entry->file_attribute_flags & LIBFSFAT_FILE_ATTRIBUTE_FLAG_DIRECTORY ) != 0 ) && ( ( internal_file_entry->file_attribute_flags & LIBFSFAT_FILE_ATTRIBUTE_FLAG_VOLUME_LABEL ) != 0 ) ) @@ -2147,6 +2170,7 @@ internal_file_entry->file_system, internal_file_entry->cluster_number, internal_file_entry->data_size, + internal_file_entry->directory_entry->data_stream_flags, internal_file_entry->data_extents_array, &( internal_file_entry->cluster_block_stream ), error ) != 1 ) @@ -2228,6 +2252,17 @@ } internal_file_entry = (libfsfat_internal_file_entry_t *) file_entry; + if( internal_file_entry->directory_entry == NULL ) + { + libcerror_error_set( + error, + LIBCERROR_ERROR_DOMAIN_RUNTIME, + LIBCERROR_RUNTIME_ERROR_VALUE_MISSING, + "%s: invalid file entry - missing directory entry.", + function ); + + return( -1 ); + } if( ( ( internal_file_entry->file_attribute_flags & LIBFSFAT_FILE_ATTRIBUTE_FLAG_DEVICE ) != 0 ) && ( ( internal_file_entry->file_attribute_flags & LIBFSFAT_FILE_ATTRIBUTE_FLAG_DIRECTORY ) != 0 ) && ( ( internal_file_entry->file_attribute_flags & LIBFSFAT_FILE_ATTRIBUTE_FLAG_VOLUME_LABEL ) != 0 ) ) @@ -2262,6 +2297,7 @@ internal_file_entry->file_system, internal_file_entry->cluster_number, internal_file_entry->data_size, + internal_file_entry->directory_entry->data_stream_flags, internal_file_entry->data_extents_array, &( internal_file_entry->cluster_block_stream ), error ) != 1 ) @@ -2340,6 +2376,17 @@ } internal_file_entry = (libfsfat_internal_file_entry_t *) file_entry; + if( internal_file_entry->directory_entry == NULL ) + { + libcerror_error_set( + error, + LIBCERROR_ERROR_DOMAIN_RUNTIME, + LIBCERROR_RUNTIME_ERROR_VALUE_MISSING, + "%s: invalid file entry - missing directory entry.", + function ); + + return( -1 ); + } if( ( ( internal_file_entry->file_attribute_flags & LIBFSFAT_FILE_ATTRIBUTE_FLAG_DEVICE ) != 0 ) && ( ( internal_file_entry->file_attribute_flags & LIBFSFAT_FILE_ATTRIBUTE_FLAG_DIRECTORY ) != 0 ) && ( ( internal_file_entry->file_attribute_flags & LIBFSFAT_FILE_ATTRIBUTE_FLAG_VOLUME_LABEL ) != 0 ) ) @@ -2374,6 +2421,7 @@ internal_file_entry->file_system, internal_file_entry->cluster_number, internal_file_entry->data_size, + internal_file_entry->directory_entry->data_stream_flags, internal_file_entry->data_extents_array, &( internal_file_entry->cluster_block_stream ), error ) != 1 ) @@ -2519,6 +2567,17 @@ } internal_file_entry = (libfsfat_internal_file_entry_t *) file_entry; + if( internal_file_entry->directory_entry == NULL ) + { + libcerror_error_set( + error, + LIBCERROR_ERROR_DOMAIN_RUNTIME, + LIBCERROR_RUNTIME_ERROR_VALUE_MISSING, + "%s: invalid file entry - missing directory entry.", + function ); + + return( -1 ); + } #if defined( HAVE_LIBFSFAT_MULTI_THREAD_SUPPORT ) if( libcthreads_read_write_lock_grab_for_read( internal_file_entry->read_write_lock, @@ -2540,6 +2599,7 @@ internal_file_entry->file_system, internal_file_entry->cluster_number, internal_file_entry->data_size, + internal_file_entry->directory_entry->data_stream_flags, internal_file_entry->data_extents_array, &( internal_file_entry->cluster_block_stream ), error ) != 1 ) @@ -2619,6 +2679,17 @@ } internal_file_entry = (libfsfat_internal_file_entry_t *) file_entry; + if( internal_file_entry->directory_entry == NULL ) + { + libcerror_error_set( + error, + LIBCERROR_ERROR_DOMAIN_RUNTIME, + LIBCERROR_RUNTIME_ERROR_VALUE_MISSING, + "%s: invalid file entry - missing directory entry.", + function ); + + return( -1 ); + } #if defined( HAVE_LIBFSFAT_MULTI_THREAD_SUPPORT ) if( libcthreads_read_write_lock_grab_for_read( internal_file_entry->read_write_lock, @@ -2640,6 +2711,7 @@ internal_file_entry->file_system, internal_file_entry->cluster_number, internal_file_entry->data_size, + internal_file_entry->directory_entry->data_stream_flags, internal_file_entry->data_extents_array, &( internal_file_entry->cluster_block_stream ), error ) != 1 ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libfsfat-20260822/libfsfat/libfsfat_file_system.c new/libfsfat-20260823/libfsfat/libfsfat_file_system.c --- old/libfsfat-20260822/libfsfat/libfsfat_file_system.c 2026-08-19 06:20:59.000000000 +0200 +++ new/libfsfat-20260823/libfsfat/libfsfat_file_system.c 2026-08-22 18:40:04.000000000 +0200 @@ -943,6 +943,7 @@ current_file_entry->data_start_cluster = directory_entry->data_start_cluster; current_file_entry->data_size = directory_entry->data_size; current_file_entry->valid_data_size = directory_entry->valid_data_size; + current_file_entry->data_stream_flags = directory_entry->data_stream_flags; } else if( directory_entry->entry_type == LIBFSFAT_DIRECTORY_ENTRY_TYPE_EXFAT_FILE_ENTRY ) { @@ -1847,6 +1848,7 @@ current_file_entry->data_start_cluster = safe_directory_entry->data_start_cluster; current_file_entry->data_size = safe_directory_entry->data_size; current_file_entry->valid_data_size = safe_directory_entry->valid_data_size; + current_file_entry->data_stream_flags = safe_directory_entry->data_stream_flags; } else if( safe_directory_entry->entry_type == LIBFSFAT_DIRECTORY_ENTRY_TYPE_EXFAT_FILE_ENTRY_NAME ) { @@ -2067,6 +2069,7 @@ libfsfat_file_system_t *file_system, uint32_t cluster_number, size64_t size, + uint8_t data_stream_flags, libcdata_array_t *data_extents_array, libfdata_stream_t **data_stream, libcerror_error_t **error ) @@ -2077,6 +2080,7 @@ static char *function = "libfsfat_file_system_get_data_stream"; size64_t segment_size = 0; off64_t cluster_offset = 0; + off64_t next_cluster_offset = 0; off64_t segment_end_offset = 0; off64_t segment_start_offset = 0; uint32_t last_cluster_number = 0; @@ -2203,35 +2207,184 @@ goto on_error; } - while( ( cluster_number >= 2 ) - && ( cluster_number < last_cluster_number ) ) + if( ( file_system->io_handle->file_system_format == LIBFSFAT_FILE_SYSTEM_FORMAT_EXFAT ) + && ( ( data_stream_flags & 0x02 ) != 0 ) ) { - if( size == 0 ) + cluster_offset = file_system->io_handle->first_cluster_offset + ( (off64_t) ( cluster_number - 2 ) * file_system->io_handle->cluster_block_size ); + + if( libfsfat_extent_initialize( + &extent, + error ) != 1 ) { - break; + libcerror_error_set( + error, + LIBCERROR_ERROR_DOMAIN_RUNTIME, + LIBCERROR_RUNTIME_ERROR_INITIALIZE_FAILED, + "%s: unable to create extent.", + function ); + + goto on_error; } - cluster_offset = file_system->io_handle->first_cluster_offset + ( (off64_t) ( cluster_number - 2 ) * file_system->io_handle->cluster_block_size ); + extent->offset = cluster_offset; + extent->size = size; - if( libfsfat_file_system_check_if_cluster_block_first_read( - file_system, - cluster_block_tree, - cluster_number, + if( libcdata_array_append_entry( + data_extents_array, + &entry_index, + (intptr_t *) extent, + error ) != 1 ) + { + libcerror_error_set( + error, + LIBCERROR_ERROR_DOMAIN_RUNTIME, + LIBCERROR_RUNTIME_ERROR_APPEND_FAILED, + "%s: unable to append data extent to array.", + function ); + + goto on_error; + } + extent = NULL; + + if( libfdata_stream_append_segment( + safe_data_stream, + &segment_index, + 0, cluster_offset, + size, + 0, error ) != 1 ) { libcerror_error_set( error, LIBCERROR_ERROR_DOMAIN_RUNTIME, - LIBCERROR_RUNTIME_ERROR_GENERIC, - "%s: unable to check if first read of cluster number: %" PRIu32 " (offset: %" PRIu64 ").", - function, - cluster_number, - cluster_offset ); + LIBCERROR_RUNTIME_ERROR_APPEND_FAILED, + "%s: unable to append stream segment.", + function ); goto on_error; } - if( ( segment_start_offset != 0 ) - && ( cluster_offset > segment_end_offset ) ) + } + else + { + while( ( cluster_number >= 2 ) + && ( cluster_number < last_cluster_number ) ) + { + if( size == 0 ) + { + break; + } + cluster_offset = file_system->io_handle->first_cluster_offset + ( (off64_t) ( cluster_number - 2 ) * file_system->io_handle->cluster_block_size ); + + if( libfsfat_file_system_check_if_cluster_block_first_read( + file_system, + cluster_block_tree, + cluster_number, + cluster_offset, + error ) != 1 ) + { + libcerror_error_set( + error, + LIBCERROR_ERROR_DOMAIN_RUNTIME, + LIBCERROR_RUNTIME_ERROR_GENERIC, + "%s: unable to check if first read of cluster number: %" PRIu32 " (offset: %" PRIu64 ").", + function, + cluster_number, + cluster_offset ); + + goto on_error; + } + if( ( segment_start_offset != 0 ) + && ( cluster_offset != next_cluster_offset ) ) + { + segment_size = segment_end_offset - segment_start_offset; + + if( libfsfat_extent_initialize( + &extent, + error ) != 1 ) + { + libcerror_error_set( + error, + LIBCERROR_ERROR_DOMAIN_RUNTIME, + LIBCERROR_RUNTIME_ERROR_INITIALIZE_FAILED, + "%s: unable to create extent.", + function ); + + goto on_error; + } + extent->offset = segment_start_offset; + extent->size = segment_size; + + if( libcdata_array_append_entry( + data_extents_array, + &entry_index, + (intptr_t *) extent, + error ) != 1 ) + { + libcerror_error_set( + error, + LIBCERROR_ERROR_DOMAIN_RUNTIME, + LIBCERROR_RUNTIME_ERROR_APPEND_FAILED, + "%s: unable to append data extent to array.", + function ); + + goto on_error; + } + extent = NULL; + + if( segment_size > size ) + { + segment_size = size; + } + if( libfdata_stream_append_segment( + safe_data_stream, + &segment_index, + 0, + segment_start_offset, + segment_size, + 0, + error ) != 1 ) + { + libcerror_error_set( + error, + LIBCERROR_ERROR_DOMAIN_RUNTIME, + LIBCERROR_RUNTIME_ERROR_APPEND_FAILED, + "%s: unable to append stream segment.", + function ); + + goto on_error; + } + size -= segment_size; + + segment_start_offset = 0; + next_cluster_offset = cluster_offset; + } + if( segment_start_offset == 0 ) + { + segment_start_offset = cluster_offset; + segment_end_offset = cluster_offset; + } + segment_end_offset += file_system->io_handle->cluster_block_size; + next_cluster_offset += file_system->io_handle->cluster_block_size; + + if( libfsfat_allocation_table_get_cluster_number_by_index( + file_system->allocation_table, + (int) cluster_number, + &cluster_number, + error ) != 1 ) + { + libcerror_error_set( + error, + LIBCERROR_ERROR_DOMAIN_RUNTIME, + LIBCERROR_RUNTIME_ERROR_GET_FAILED, + "%s: unable to retrieve cluster number: %" PRIu32 ".", + function, + cluster_number ); + + goto on_error; + } + } + if( ( size > 0 ) + && ( segment_start_offset != 0 ) ) { segment_size = segment_end_offset - segment_start_offset; @@ -2290,93 +2443,6 @@ goto on_error; } - size -= segment_size; - - segment_start_offset = 0; - } - if( segment_start_offset == 0 ) - { - segment_start_offset = cluster_offset; - segment_end_offset = cluster_offset; - } - segment_end_offset += file_system->io_handle->cluster_block_size; - - if( libfsfat_allocation_table_get_cluster_number_by_index( - file_system->allocation_table, - (int) cluster_number, - &cluster_number, - error ) != 1 ) - { - libcerror_error_set( - error, - LIBCERROR_ERROR_DOMAIN_RUNTIME, - LIBCERROR_RUNTIME_ERROR_GET_FAILED, - "%s: unable to retrieve cluster number: %" PRIu32 ".", - function, - cluster_number ); - - goto on_error; - } - } - if( ( size > 0 ) - && ( segment_start_offset != 0 ) ) - { - segment_size = segment_end_offset - segment_start_offset; - - if( libfsfat_extent_initialize( - &extent, - error ) != 1 ) - { - libcerror_error_set( - error, - LIBCERROR_ERROR_DOMAIN_RUNTIME, - LIBCERROR_RUNTIME_ERROR_INITIALIZE_FAILED, - "%s: unable to create extent.", - function ); - - goto on_error; - } - extent->offset = segment_start_offset; - extent->size = segment_size; - - if( libcdata_array_append_entry( - data_extents_array, - &entry_index, - (intptr_t *) extent, - error ) != 1 ) - { - libcerror_error_set( - error, - LIBCERROR_ERROR_DOMAIN_RUNTIME, - LIBCERROR_RUNTIME_ERROR_APPEND_FAILED, - "%s: unable to append data extent to array.", - function ); - - goto on_error; - } - extent = NULL; - - if( segment_size > size ) - { - segment_size = size; - } - if( libfdata_stream_append_segment( - safe_data_stream, - &segment_index, - 0, - segment_start_offset, - segment_size, - 0, - error ) != 1 ) - { - libcerror_error_set( - error, - LIBCERROR_ERROR_DOMAIN_RUNTIME, - LIBCERROR_RUNTIME_ERROR_APPEND_FAILED, - "%s: unable to append stream segment.", - function ); - - goto on_error; } } if( libfsfat_block_tree_free( diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libfsfat-20260822/libfsfat/libfsfat_file_system.h new/libfsfat-20260823/libfsfat/libfsfat_file_system.h --- old/libfsfat-20260822/libfsfat/libfsfat_file_system.h 2026-08-19 06:20:59.000000000 +0200 +++ new/libfsfat-20260823/libfsfat/libfsfat_file_system.h 2026-08-22 17:06:06.000000000 +0200 @@ -133,6 +133,7 @@ libfsfat_file_system_t *file_system, uint32_t cluster_number, size64_t size, + uint8_t data_stream_flags, libcdata_array_t *data_extents_array, libfdata_stream_t **data_stream, libcerror_error_t **error ); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libfsfat-20260822/libfsfat.spec new/libfsfat-20260823/libfsfat.spec --- old/libfsfat-20260822/libfsfat.spec 2026-08-22 12:52:14.000000000 +0200 +++ new/libfsfat-20260823/libfsfat.spec 2026-08-22 18:58:30.000000000 +0200 @@ -1,5 +1,5 @@ Name: libfsfat -Version: 20260822 +Version: 20260823 Release: 1 Summary: Library to access the File Allocation Table (FAT) file system format Group: System Environment/Libraries @@ -95,6 +95,6 @@ %{_mandir}/man1/* %changelog -* Sat Aug 22 2026 Joachim Metz <[email protected]> 20260822-1 +* Sat Aug 22 2026 Joachim Metz <[email protected]> 20260823-1 - Auto-generated diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libfsfat-20260822/pyproject.toml new/libfsfat-20260823/pyproject.toml --- old/libfsfat-20260822/pyproject.toml 2026-08-22 12:52:14.000000000 +0200 +++ new/libfsfat-20260823/pyproject.toml 2026-08-22 18:58:30.000000000 +0200 @@ -4,7 +4,7 @@ [project] name = "libfsfat-python" -version = "20260822" +version = "20260823" description = "Python bindings for libfsfat" maintainers = [ { name = "Joachim Metz", email = "[email protected]" }, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/libfsfat-20260822/tests/package.m4 new/libfsfat-20260823/tests/package.m4 --- old/libfsfat-20260822/tests/package.m4 2026-08-22 12:45:56.000000000 +0200 +++ new/libfsfat-20260823/tests/package.m4 2026-08-22 18:41:19.000000000 +0200 @@ -1,5 +1,5 @@ m4_define([AT_PACKAGE_NAME], [libfsfat]) m4_define([AT_PACKAGE_TARNAME], [libfsfat]) -m4_define([AT_PACKAGE_VERSION], [20260822]) -m4_define([AT_PACKAGE_STRING], [libfsfat 20260822]) +m4_define([AT_PACKAGE_VERSION], [20260823]) +m4_define([AT_PACKAGE_STRING], [libfsfat 20260823]) m4_define([AT_PACKAGE_BUGREPORT], [https://github.com/libyal/libfsfat/issues])
