public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
From: Tom spot Callaway <spotaws@amazon.com>
To: git-commits@fedoraproject.org
Subject: [rpms/ntfs-3g] epel9: apply upstream patches for CVE-2026-42616 CVE-2026-42617 CVE-2026-42618 CVE-2026-46569 CVE-2026-46571 CVE-2026-46570 CVE-2026-46572 CVE-2026-56135 CVE-2026-56136
Date: Thu, 24 Sep 2026 14:59:53 GMT	[thread overview]
Message-ID: <179026199326.1.14826978534258203108.rpms-ntfs-3g-00d0161b0d32@fedoraproject.org> (raw)

A new commit has been pushed.

Repo   : rpms/ntfs-3g
Branch : epel9
Commit : 00d0161b0d3288a196cc8b949ca5bf20c1eba497
Author : Tom spot Callaway <spotaws@amazon.com>
Date   : 2026-09-24T10:59:48-04:00
Stats  : +1050/-1 in 10 file(s)
URL    : https://src.fedoraproject.org/rpms/ntfs-3g/c/00d0161b0d3288a196cc8b949ca5bf20c1eba497?branch=epel9

Log:
apply upstream patches for CVE-2026-42616 CVE-2026-42617 CVE-2026-42618 CVE-2026-46569 CVE-2026-46571 CVE-2026-46570 CVE-2026-46572 CVE-2026-56135 CVE-2026-56136

---
diff --git a/1_ntfs-3g_2022.10.3-CVE-2026-42618.patch b/1_ntfs-3g_2022.10.3-CVE-2026-42618.patch
new file mode 100644
index 0000000..6bf878d
--- /dev/null
+++ b/1_ntfs-3g_2022.10.3-CVE-2026-42618.patch
@@ -0,0 +1,361 @@
+diff --git a/libntfs-3g/compress.c b/libntfs-3g/compress.c
+index 390b2d97d..50d9daf32 100644
+--- a/libntfs-3g/compress.c
++++ b/libntfs-3g/compress.c
+@@ -459,7 +459,8 @@ static unsigned int ntfs_compress_block(const char *inbuf, const int bufsize,
+  * @cb_start is a pointer to the compression block which needs decompressing
+  * and @cb_size is the size of @cb_start in bytes (8-64kiB).
+  *
+- * Return 0 if success or -EOVERFLOW on error in the compressed stream.
++ * Return 0 on success.  On error in the compressed stream, set errno to
++ * EOVERFLOW and return -1.
+  */
+ static int ntfs_decompress(u8 *dest, const u32 dest_size,
+ 		u8 *const cb_start, const u32 cb_size)
+@@ -479,153 +480,211 @@ static int ntfs_decompress(u8 *dest, const u32 dest_size,
+ 	/* Variables for tag and token parsing. */
+ 	u8 tag;			/* Current tag. */
+ 	int token;		/* Loop counter for the eight tokens in tag. */
++	u16 hdr;		/* Current sub-block header. */
+ 
+ 	ntfs_log_trace("Entering, cb_size = 0x%x.\n", (unsigned)cb_size);
+ do_next_sb:
+-	ntfs_log_debug("Beginning sub-block at offset = %d in the cb.\n",
+-			(int)(cb - cb_start));
+-	/*
+-	 * Have we reached the end of the compression block or the end of the
+-	 * decompressed data?  The latter can happen for example if the current
+-	 * position in the compression block is one byte before its end so the
+-	 * first two checks do not detect it.
+-	 */
+-	if (cb == cb_end || !le16_to_cpup((le16*)cb) || dest == dest_end) {
+-		if (dest_end > dest)
+-			memset(dest, 0, dest_end - dest);
+-		ntfs_log_debug("Completed. Returning success (0).\n");
+-		return 0;
+-	}
+-	/* Setup offset for the current sub-block destination. */
+-	dest_sb_start = dest;
+-	dest_sb_end = dest + NTFS_SB_SIZE;
+-	/* Check that we are still within allowed boundaries. */
+-	if (dest_sb_end > dest_end)
+-		goto return_overflow;
+-	/* Does the minimum size of a compressed sb overflow valid range? */
+-	if (cb + 6 > cb_end)
+-		goto return_overflow;
+-	/* Setup the current sub-block source pointers and validate range. */
+-	cb_sb_start = cb;
+-	cb_sb_end = cb_sb_start + (le16_to_cpup((le16*)cb) & NTFS_SB_SIZE_MASK)
+-			+ 3;
+-	if (cb_sb_end > cb_end)
+-		goto return_overflow;
+-	/* Now, we are ready to process the current sub-block (sb). */
+-	if (!(le16_to_cpup((le16*)cb) & NTFS_SB_IS_COMPRESSED)) {
+-		ntfs_log_debug("Found uncompressed sub-block.\n");
+-		/* This sb is not compressed, just copy it into destination. */
+-		/* Advance source position to first data byte. */
+-		cb += 2;
+-		/* An uncompressed sb must be full size. */
+-		if (cb_sb_end - cb != NTFS_SB_SIZE)
+-			goto return_overflow;
+-		/* Copy the block and advance the source position. */
+-		memcpy(dest, cb, NTFS_SB_SIZE);
+-		cb += NTFS_SB_SIZE;
+-		/* Advance destination position to next sub-block. */
+-		dest += NTFS_SB_SIZE;
+-		goto do_next_sb;
+-	}
+-	ntfs_log_debug("Found compressed sub-block.\n");
+-	/* This sb is compressed, decompress it into destination. */
+-	/* Forward to the first tag in the sub-block. */
+-	cb += 2;
+-do_next_tag:
+-	if (cb == cb_sb_end) {
+-		/* Check if the decompressed sub-block was not full-length. */
+-		if (dest < dest_sb_end) {
+-			int nr_bytes = dest_sb_end - dest;
+-
+-			ntfs_log_debug("Filling incomplete sub-block with zeroes.\n");
+-			/* Zero remainder and update destination position. */
+-			memset(dest, 0, nr_bytes);
+-			dest += nr_bytes;
+-		}
+-		/* We have finished the current sub-block. */
+-		goto do_next_sb;
+-	}
+-	/* Check we are still in range. */
+-	if (cb > cb_sb_end || dest > dest_sb_end)
+-		goto return_overflow;
+-	/* Get the next tag and advance to first token. */
+-	tag = *cb++;
+-	/* Parse the eight tokens described by the tag. */
+-	for (token = 0; token < 8; token++, tag >>= 1) {
+-		u16 lg, pt, length, max_non_overlap;
+-		register u16 i;
+-		u8 *dest_back_addr;
+-
+-		/* Check if we are done / still in range. */
+-		if (cb >= cb_sb_end || dest > dest_sb_end)
+-			break;
+-		/* Determine token type and parse appropriately.*/
+-		if ((tag & NTFS_TOKEN_MASK) == NTFS_SYMBOL_TOKEN) {
+-			/*
+-			 * We have a symbol token, copy the symbol across, and
+-			 * advance the source and destination positions.
+-			 */
+-			*dest++ = *cb++;
+-			/* Continue with the next token. */
+-			continue;
+-		}
++	{
++		ntfs_log_debug("Beginning sub-block at offset = %d in the "
++				"cb.\n",
++				(int)(cb - cb_start));
+ 		/*
+-		 * We have a phrase token. Make sure it is not the first tag in
+-		 * the sb as this is illegal and would confuse the code below.
++		 * Have we reached the end of the compression block or the end
++		 * of the decompressed data?
++		 *
++		 * Check dest == dest_end before reading the next two-byte sub-
++		 * block header.  The compressed pointer can legally be near the
++		 * end of the buffer when the requested output has already been
++		 * produced.
+ 		 */
+-		if (dest == dest_sb_start)
++		if (cb == cb_end || dest == dest_end)
++			goto complete;
++		/* A sub-block header is two bytes. */
++		if ((size_t)(cb_end - cb) < 2)
+ 			goto return_overflow;
+-		/*
+-		 * Determine the number of bytes to go back (p) and the number
+-		 * of bytes to copy (l). We use an optimized algorithm in which
+-		 * we first calculate log2(current destination position in sb),
+-		 * which allows determination of l and p in O(1) rather than
+-		 * O(n). We just need an arch-optimized log2() function now.
+-		 */
+-		lg = 0;
+-		for (i = dest - dest_sb_start - 1; i >= 0x10; i >>= 1)
+-			lg++;
+-		/* Get the phrase token into i. */
+-		pt = le16_to_cpup((le16*)cb);
+-		/*
+-		 * Calculate starting position of the byte sequence in
+-		 * the destination using the fact that p = (pt >> (12 - lg)) + 1
+-		 * and make sure we don't go too far back.
+-		 */
+-		dest_back_addr = dest - (pt >> (12 - lg)) - 1;
+-		if (dest_back_addr < dest_sb_start)
++		hdr = le16_to_cpup((le16*)cb);
++		if (!hdr)
++			goto complete;
++		/* Setup offset for the current sub-block destination. */
++		dest_sb_start = dest;
++		dest_sb_end = dest + NTFS_SB_SIZE;
++		/* Check that we are still within allowed boundaries. */
++		if (dest_sb_end > dest_end)
+ 			goto return_overflow;
+-		/* Now calculate the length of the byte sequence. */
+-		length = (pt & (0xfff >> lg)) + 3;
+-		/* Verify destination is in range. */
+-		if (dest + length > dest_sb_end)
++		/* Does the minimum size of a compressed sb overflow valid
++		 * range? */
++		if ((size_t)(cb_end - cb) < 6)
+ 			goto return_overflow;
+-		/* The number of non-overlapping bytes. */
+-		max_non_overlap = dest - dest_back_addr;
+-		if (length <= max_non_overlap) {
+-			/* The byte sequence doesn't overlap, just copy it. */
+-			memcpy(dest, dest_back_addr, length);
+-			/* Advance destination pointer. */
+-			dest += length;
+-		} else {
++		/* Setup the current sub-block source pointers and validate
++		 * range. */
++		cb_sb_start = cb;
++		cb_sb_end = cb_sb_start + (hdr & NTFS_SB_SIZE_MASK) + 3;
++		if (cb_sb_end > cb_end)
++			goto return_overflow;
++		/* Now, we are ready to process the current sub-block (sb). */
++		if (!(hdr & NTFS_SB_IS_COMPRESSED)) {
++			ntfs_log_debug("Found uncompressed sub-block.\n");
++			/* This sb is not compressed, just copy it into
++			 * destination. */
++			/* Advance source position to first data byte. */
++			cb += 2;
++			/* An uncompressed sb must be full size. */
++			if (cb_sb_end - cb != NTFS_SB_SIZE)
++				goto return_overflow;
++			/* Copy the block and advance the source position. */
++			memcpy(dest, cb, NTFS_SB_SIZE);
++			cb += NTFS_SB_SIZE;
++			/* Advance destination position to next sub-block. */
++			dest += NTFS_SB_SIZE;
++			goto do_next_sb;
++		}
++		ntfs_log_debug("Found compressed sub-block.\n");
++		/* This sb is compressed, decompress it into destination. */
++		/* Forward to the first tag in the sub-block. */
++		cb += 2;
++do_next_tag:
++		{
++			/* Check we are still in range. */
++			if (cb > cb_sb_end || dest > dest_sb_end)
++				goto return_overflow;
+ 			/*
+-			 * The byte sequence does overlap, copy non-overlapping
+-			 * part and then do a slow byte by byte copy for the
+-			 * overlapping part. Also, advance the destination
+-			 * pointer.
++			 * Finish this compressed sub-block when either its
++			 * compressed input is exhausted or its 4 KiB output
++			 * slot is full.  If output becomes full first, skip the
++			 * remaining compressed bytes in this sub-block instead
++			 * of interpreting them as more tags/tokens.
+ 			 */
+-			memcpy(dest, dest_back_addr, max_non_overlap);
+-			dest += max_non_overlap;
+-			dest_back_addr += max_non_overlap;
+-			length -= max_non_overlap;
+-			while (length--)
+-				*dest++ = *dest_back_addr++;
++			if (cb == cb_sb_end || dest == dest_sb_end)
++				goto finish_compressed_sb;
++			/* Get the next tag and advance to first token. */
++			tag = *cb++;
++			/* Parse the eight tokens described by the tag. */
++			for (token = 0; token < 8; token++, tag >>= 1) {
++				u16 lg, pt, length, max_non_overlap;
++				register u16 i;
++				u8 *dest_back_addr;
++
++				/* Check if we are done / still in range. */
++				if (cb > cb_sb_end || dest > dest_sb_end)
++					goto return_overflow;
++				if (cb == cb_sb_end || dest == dest_sb_end)
++					goto finish_compressed_sb;
++				/* Determine token type and parse
++				 * appropriately. */
++				if ((tag & NTFS_TOKEN_MASK) ==
++						NTFS_SYMBOL_TOKEN)
++				{
++					/*
++					 * We have a symbol token, copy the
++					 * symbol across, and advance the source
++					 * and destination positions.
++					 */
++					*dest++ = *cb++;
++					/* Continue with the next token. */
++					continue;
++				}
++				/*
++				 * We have a phrase token. Make sure it is not
++				 * the first token in the sb as this is illegal
++				 * and would confuse the code below.
++				 */
++				if (dest == dest_sb_start)
++					goto return_overflow;
++				/*
++				 * A phrase token is a two-byte compressed word.
++				 * The generic token check above only proves
++				 * that at least one byte remains, which is
++				 * enough for a symbol token but not for a
++				 * phrase token.
++				 */
++				if ((size_t)(cb_sb_end - cb) < 2)
++					goto return_overflow;
++				/*
++				 * Determine the number of bytes to go back (p)
++				 * and the number of bytes to copy (l). We use
++				 * an optimized algorithm in which we first
++				 * calculate log2(current destination position
++				 * in sb), which allows determination of l and p
++				 * in O(1) rather than O(n). We just need an
++				 * arch-optimized log2() function now.
++				 */
++				lg = 0;
++				for (i = dest - dest_sb_start - 1; i >= 0x10;
++						i >>= 1)
++				{
++					lg++;
++				}
++				/* Get the phrase token into i. */
++				pt = le16_to_cpup((le16*)cb);
++				/*
++				 * Calculate starting position of the byte
++				 * sequence in the destination using the fact
++				 * that p = (pt >> (12 - lg)) + 1 and make sure
++				 * we don't go too far back.
++				 */
++				dest_back_addr = dest - (pt >> (12 - lg)) - 1;
++				if (dest_back_addr < dest_sb_start)
++					goto return_overflow;
++				/* Now calculate the length of the byte
++				 * sequence. */
++				length = (pt & (0xfff >> lg)) + 3;
++				/* Verify destination is in range. */
++				if (dest + length > dest_sb_end)
++					goto return_overflow;
++				/* The number of non-overlapping bytes. */
++				max_non_overlap = dest - dest_back_addr;
++				if (length <= max_non_overlap) {
++					/* The byte sequence doesn't overlap,
++					 * just copy it. */
++					memcpy(dest, dest_back_addr, length);
++					/* Advance destination pointer. */
++					dest += length;
++				} else {
++					/*
++					 * The byte sequence does overlap, copy
++					 * non-overlapping part and then do a
++					 * slow byte by byte copy for the
++					 * overlapping part. Also, advance the
++					 * destination pointer.
++					 */
++					memcpy(dest, dest_back_addr,
++						max_non_overlap);
++					dest += max_non_overlap;
++					dest_back_addr += max_non_overlap;
++					length -= max_non_overlap;
++					while (length--)
++						*dest++ = *dest_back_addr++;
++				}
++				/* Advance source position and continue with the
++				 * next token. */
++				cb += 2;
++			}
++			/* No tokens left in the current tag. Continue with the
++			 * next tag. */
++			goto do_next_tag;
+ 		}
+-		/* Advance source position and continue with the next token. */
+-		cb += 2;
+ 	}
+-	/* No tokens left in the current tag. Continue with the next tag. */
+-	goto do_next_tag;
++finish_compressed_sb:
++	/* Check if the decompressed sub-block was not full-length. */
++	if (dest < dest_sb_end) {
++		size_t nr_bytes = dest_sb_end - dest;
++
++		ntfs_log_debug("Filling incomplete sub-block with zeroes.\n");
++		/* Zero remainder and update destination position. */
++		memset(dest, 0, nr_bytes);
++		dest += nr_bytes;
++	}
++	/*
++	 * If the output sub-block filled before the compressed sub-block input
++	 * was exhausted, skip the remaining compressed bytes in this sub-block.
++	 */
++	cb = cb_sb_end;
++	goto do_next_sb;
++complete:
++	if (dest_end > dest)
++		memset(dest, 0, dest_end - dest);
++	ntfs_log_debug("Completed. Returning success (0).\n");
++	return 0;
+ return_overflow:
+ 	errno = EOVERFLOW;
+ 	ntfs_log_perror("Failed to decompress file");

diff --git a/2_ntfs-3g_2022.10.3-CVE-2026-42616.patch b/2_ntfs-3g_2022.10.3-CVE-2026-42616.patch
new file mode 100644
index 0000000..436ec9b
--- /dev/null
+++ b/2_ntfs-3g_2022.10.3-CVE-2026-42616.patch
@@ -0,0 +1,44 @@
+diff --git a/ntfsprogs/ntfscat.c b/ntfsprogs/ntfscat.c
+index b8af25033..0f711815a 100644
+--- a/ntfsprogs/ntfscat.c
++++ b/ntfsprogs/ntfscat.c
+@@ -334,22 +334,17 @@ static int index_get_size(ntfs_inode *inode)
+ static int cat(ntfs_volume *vol, ntfs_inode *inode, ATTR_TYPES type,
+ 		ntfschar *name, int namelen)
+ {
+-	const int bufsize = 4096;
+ 	char *buffer;
+ 	ntfs_attr *attr;
+ 	s64 bytes_read, written;
+ 	s64 offset;
+ 	u32 block_size;
+-
+-	buffer = malloc(bufsize);
+-	if (!buffer)
+-		return 1;
++	u32 bufsize = 4096;
+ 
+ 	attr = ntfs_attr_open(inode, type, name, namelen);
+ 	if (!attr) {
+ 		ntfs_log_error("Cannot find attribute type 0x%x.\n",
+ 				le32_to_cpu(type));
+-		free(buffer);
+ 		return 1;
+ 	}
+ 
+@@ -360,6 +355,15 @@ static int cat(ntfs_volume *vol, ntfs_inode *inode, ATTR_TYPES type,
+ 	else
+ 		block_size = 0;
+ 
++	if (bufsize < block_size) {
++		bufsize = block_size;
++	}
++
++	buffer = malloc(bufsize);
++	if (!buffer) {
++		return 1;
++	}
++
+ 	offset = 0;
+ 	for (;;) {
+ 		if (!opts.raw && block_size > 0) {

diff --git a/3_ntfs-3g_2022.10.3-CVE-2026-42617.patch b/3_ntfs-3g_2022.10.3-CVE-2026-42617.patch
new file mode 100644
index 0000000..b168ee3
--- /dev/null
+++ b/3_ntfs-3g_2022.10.3-CVE-2026-42617.patch
@@ -0,0 +1,130 @@
+diff --git a/include/ntfs-3g/index.h b/include/ntfs-3g/index.h
+index d001863ae..1d5845d47 100644
+--- a/include/ntfs-3g/index.h
++++ b/include/ntfs-3g/index.h
+@@ -143,6 +143,7 @@ extern int ntfs_index_block_inconsistent(const INDEX_BLOCK *ib, u32 block_size,
+ 			u64 inum, VCN vcn);
+ extern int ntfs_index_entry_inconsistent(const INDEX_ENTRY *ie,
+ 			COLLATION_RULES collation_rule, u64 inum);
++extern int ntfs_ie_stream_inconsistent(const INDEX_HEADER *ih, u64 inum);
+ extern int ntfs_index_lookup(const void *key, const int key_len,
+ 		ntfs_index_context *ictx) __attribute_warn_unused_result__;
+ 
+diff --git a/libntfs-3g/attrib.c b/libntfs-3g/attrib.c
+index efb919438..cfc2446e3 100644
+--- a/libntfs-3g/attrib.c
++++ b/libntfs-3g/attrib.c
+@@ -3528,6 +3528,10 @@ int ntfs_attr_inconsistent(const ATTR_RECORD *a, const MFT_REF mref)
+ 			if (a->non_resident
+ 			    || (le32_to_cpu(a->value_length)
+ 				< offsetof(INDEX_ROOT, index.reserved))
++			    || (le32_to_cpu(ir->index_block_size)
++				< NTFS_BLOCK_SIZE)
++			    || (le32_to_cpu(ir->index_block_size)
++				& (le32_to_cpu(ir->index_block_size) - 1))
+ 			    || (le32_to_cpu(ir->index.entries_offset)
+ 				< sizeof(INDEX_HEADER))
+ 			    || (le32_to_cpu(ir->index.index_length)
+@@ -3542,6 +3546,9 @@ int ntfs_attr_inconsistent(const ATTR_RECORD *a, const MFT_REF mref)
+ 					(long long)inum);
+ 				errno = EIO;
+ 				ret = -1;
++			} else if (ntfs_ie_stream_inconsistent(&ir->index, inum)) {
++				errno = EIO;
++				ret = -1;
+ 			}
+ 			break;
+ 		case AT_STANDARD_INFORMATION :
+diff --git a/libntfs-3g/index.c b/libntfs-3g/index.c
+index e48d6aafb..c9651a62c 100644
+--- a/libntfs-3g/index.c
++++ b/libntfs-3g/index.c
+@@ -504,6 +504,8 @@ int ntfs_index_block_inconsistent(const INDEX_BLOCK *ib, u32 block_size,
+ 				(unsigned long long)inum);
+ 		return -1;
+ 	}
++	if (ntfs_ie_stream_inconsistent(&ib->index, inum))
++		return -1;
+ 
+ 	return (0);
+ }
+@@ -560,7 +562,40 @@ int ntfs_index_entry_inconsistent(const INDEX_ENTRY *ie,
+ 	return (ret);
+ }
+ 
+-/** 
++int ntfs_ie_stream_inconsistent(const INDEX_HEADER *ih, u64 inum)
++{
++	const u8 *ies_start = (const u8 *)ih + le32_to_cpu(ih->entries_offset);
++	const u8 *ies_end = (const u8 *)ih + le32_to_cpu(ih->index_length);
++	const u8 *ie;
++
++	ntfs_log_trace("Entering\n");
++
++	for (ie = ies_start; ie < ies_end; ) {
++		u32 len;
++		const INDEX_ENTRY *ent = (const INDEX_ENTRY *)ie;
++
++		if ((size_t)(ies_end - ie) < sizeof(INDEX_ENTRY_HEADER))
++			goto err;
++		len = le16_to_cpu(ent->length);
++		if (len < sizeof(INDEX_ENTRY_HEADER) || (len & 7))
++			goto err;
++		if ((size_t)(ies_end - ie) < len)
++			goto err;
++		if (ent->ie_flags & INDEX_ENTRY_END) {
++			/* END must terminate the stream exactly. */
++			if (ie + len != ies_end)
++				goto err;
++			return 0;
++		}
++		ie += len;
++	}
++err:
++	ntfs_log_error("Corrupt index entry stream in inode %lld\n",
++			(long long)inum);
++	return -1;
++}
++
++/**
+  * Find a key in the index block.
+  * 
+  * Return values:
+@@ -1091,14 +1126,16 @@ out:
+ 
+ static INDEX_BLOCK *ntfs_ir_to_ib(INDEX_ROOT *ir, VCN ib_vcn)
+ {
++	u32 ib_size;
+ 	INDEX_BLOCK *ib;
+ 	INDEX_ENTRY *ie_last;
+ 	char *ies_start, *ies_end;
+ 	int i;
+ 	
+ 	ntfs_log_trace("Entering\n");
+-	
+-	ib = ntfs_ib_alloc(ib_vcn, le32_to_cpu(ir->index_block_size), LEAF_NODE);
++
++	ib_size = le32_to_cpu(ir->index_block_size);
++	ib = ntfs_ib_alloc(ib_vcn, ib_size, LEAF_NODE);
+ 	if (!ib)
+ 		return NULL;
+ 	
+@@ -1110,6 +1147,18 @@ static INDEX_BLOCK *ntfs_ir_to_ib(INDEX_ROOT *ir, VCN ib_vcn)
+ 	 * as well, which can never have any data.
+ 	 */
+ 	i = (char *)ie_last - ies_start + le16_to_cpu(ie_last->length);
++
++	if (offsetof(INDEX_BLOCK, index) + le32_to_cpu(ib->index.entries_offset)
++			+ i > ib_size)
++	{
++		ntfs_log_error("Last entry in index root overflows the index "
++				"block size: %d (index block size: %lu)\n",
++				i, (unsigned long)ib_size);
++		free(ib);
++		errno = EIO;
++		return NULL;
++	}
++
+ 	memcpy(ntfs_ie_get_first(&ib->index), ies_start, i);
+ 	
+ 	ib->index.ih_flags = ir->index.ih_flags;

diff --git a/4_ntfs-3g_2022.10.3-CVE-2026-46569.patch b/4_ntfs-3g_2022.10.3-CVE-2026-46569.patch
new file mode 100644
index 0000000..a836e87
--- /dev/null
+++ b/4_ntfs-3g_2022.10.3-CVE-2026-46569.patch
@@ -0,0 +1,39 @@
+diff --git a/libntfs-3g/index.c b/libntfs-3g/index.c
+index e48d6aafb..6ebaa2e4a 100644
+--- a/libntfs-3g/index.c
++++ b/libntfs-3g/index.c
+@@ -1144,7 +1144,7 @@ static int ntfs_ib_copy_tail(ntfs_index_context *icx, INDEX_BLOCK *src,
+ {
+ 	u8 *ies_end;
+ 	INDEX_ENTRY *ie_head;		/* first entry after the median */
+-	int tail_size, ret;
++	int tail_size, dst_capacity, ret;
+ 	INDEX_BLOCK *dst;
+ 	
+ 	ntfs_log_trace("Entering\n");
+@@ -1158,6 +1158,25 @@ static int ntfs_ib_copy_tail(ntfs_index_context *icx, INDEX_BLOCK *src,
+ 	
+ 	ies_end = (u8 *)ntfs_ie_get_end(&src->index);
+ 	tail_size = ies_end - (u8 *)ie_head;
++	dst_capacity = (int)(le32_to_cpu(dst->index.allocated_size)
++			     - le32_to_cpu(dst->index.entries_offset));
++
++	/*
++	 * src->index.entries_offset (on-disk, only required to be >=
++	 * sizeof(INDEX_HEADER) by ntfs_index_block_inconsistent) may be smaller
++	 * than dst's, which ntfs_ib_alloc fixes (40 on a 4 KiB block).  When
++	 * the median lands near the start of the source stream the gap lets
++	 * tail_size exceed dst's usable space.  The < 0 guard catches a
++	 * negative tail_size before memcpy sign-extends it into a huge size_t.
++	 */
++	if (tail_size < 0 || tail_size > dst_capacity) {
++		ntfs_log_error("Invalid tail_size %d (dst capacity %d) in "
++				"ntfs_ib_copy_tail\n", tail_size, dst_capacity);
++		free(dst);
++		errno = EIO;
++		return STATUS_ERROR;
++	}
++
+ 	memcpy(ntfs_ie_get_first(&dst->index), ie_head, tail_size);
+ 	
+ 	dst->index.index_length = cpu_to_le32(tail_size + 

diff --git a/5_ntfs-3g_2022.10.3-CVE-2026-46571.patch b/5_ntfs-3g_2022.10.3-CVE-2026-46571.patch
new file mode 100644
index 0000000..9a1f8f2
--- /dev/null
+++ b/5_ntfs-3g_2022.10.3-CVE-2026-46571.patch
@@ -0,0 +1,27 @@
+diff --git a/libntfs-3g/reparse.c b/libntfs-3g/reparse.c
+index 76dbe2f1b..54858caa7 100644
+--- a/libntfs-3g/reparse.c
++++ b/libntfs-3g/reparse.c
+@@ -196,11 +196,19 @@ static u64 ntfs_fix_file_name(ntfs_inode *dir_ni, ntfschar *uname,
+ 				lemref = entry->indexed_file;
+ 				mref = le64_to_cpu(lemref);
+ 				if (NVolCaseSensitive(vol) || !vol->locase) {
+-					for (i=0; i<found->file_name_length; i++)
++					for (i=0; i<found->file_name_length;
++							i++)
+ 						uname[i] = found->file_name[i];
+ 				} else {
+-					for (i=0; i<found->file_name_length; i++)
+-						uname[i] = vol->locase[le16_to_cpu(found->file_name[i])];
++					for (i=0; i<found->file_name_length;
++							i++) {
++						u16 u = le16_to_cpu(found->
++								file_name[i]);
++						uname[i] = (u < vol->upcase_len)
++								? vol->locase[u]
++								: found->
++								  file_name[i];
++					}
+ 				}
+ 			}
+ 		}

diff --git a/6_ntfs-3g_2022.10.3-CVE-2026-46570.patch b/6_ntfs-3g_2022.10.3-CVE-2026-46570.patch
new file mode 100644
index 0000000..4163dd2
--- /dev/null
+++ b/6_ntfs-3g_2022.10.3-CVE-2026-46570.patch
@@ -0,0 +1,18 @@
+diff --git a/libntfs-3g/index.c b/libntfs-3g/index.c
+index e48d6aafb..4768128d2 100644
+--- a/libntfs-3g/index.c
++++ b/libntfs-3g/index.c
+@@ -2056,6 +2056,13 @@ static INDEX_ENTRY *ntfs_index_walk_down(INDEX_ENTRY *ie,
+ 			/* down from non-zero level */
+ 			
+ 			ictx->pindex++;
++			if (ictx->pindex >= MAX_PARENT_VCN) {
++				errno = EOPNOTSUPP;
++				ntfs_log_perror("Index is over %d level deep",
++						MAX_PARENT_VCN);
++				entry = (INDEX_ENTRY*)NULL;
++				break;
++			}
+ 		}
+ 		ictx->parent_pos[ictx->pindex] = 0;
+ 		ictx->parent_vcn[ictx->pindex] = vcn;

diff --git a/7_ntfs-3g_2022.10.3-CVE-2026-46572.patch b/7_ntfs-3g_2022.10.3-CVE-2026-46572.patch
new file mode 100644
index 0000000..b168ee3
--- /dev/null
+++ b/7_ntfs-3g_2022.10.3-CVE-2026-46572.patch
@@ -0,0 +1,130 @@
+diff --git a/include/ntfs-3g/index.h b/include/ntfs-3g/index.h
+index d001863ae..1d5845d47 100644
+--- a/include/ntfs-3g/index.h
++++ b/include/ntfs-3g/index.h
+@@ -143,6 +143,7 @@ extern int ntfs_index_block_inconsistent(const INDEX_BLOCK *ib, u32 block_size,
+ 			u64 inum, VCN vcn);
+ extern int ntfs_index_entry_inconsistent(const INDEX_ENTRY *ie,
+ 			COLLATION_RULES collation_rule, u64 inum);
++extern int ntfs_ie_stream_inconsistent(const INDEX_HEADER *ih, u64 inum);
+ extern int ntfs_index_lookup(const void *key, const int key_len,
+ 		ntfs_index_context *ictx) __attribute_warn_unused_result__;
+ 
+diff --git a/libntfs-3g/attrib.c b/libntfs-3g/attrib.c
+index efb919438..cfc2446e3 100644
+--- a/libntfs-3g/attrib.c
++++ b/libntfs-3g/attrib.c
+@@ -3528,6 +3528,10 @@ int ntfs_attr_inconsistent(const ATTR_RECORD *a, const MFT_REF mref)
+ 			if (a->non_resident
+ 			    || (le32_to_cpu(a->value_length)
+ 				< offsetof(INDEX_ROOT, index.reserved))
++			    || (le32_to_cpu(ir->index_block_size)
++				< NTFS_BLOCK_SIZE)
++			    || (le32_to_cpu(ir->index_block_size)
++				& (le32_to_cpu(ir->index_block_size) - 1))
+ 			    || (le32_to_cpu(ir->index.entries_offset)
+ 				< sizeof(INDEX_HEADER))
+ 			    || (le32_to_cpu(ir->index.index_length)
+@@ -3542,6 +3546,9 @@ int ntfs_attr_inconsistent(const ATTR_RECORD *a, const MFT_REF mref)
+ 					(long long)inum);
+ 				errno = EIO;
+ 				ret = -1;
++			} else if (ntfs_ie_stream_inconsistent(&ir->index, inum)) {
++				errno = EIO;
++				ret = -1;
+ 			}
+ 			break;
+ 		case AT_STANDARD_INFORMATION :
+diff --git a/libntfs-3g/index.c b/libntfs-3g/index.c
+index e48d6aafb..c9651a62c 100644
+--- a/libntfs-3g/index.c
++++ b/libntfs-3g/index.c
+@@ -504,6 +504,8 @@ int ntfs_index_block_inconsistent(const INDEX_BLOCK *ib, u32 block_size,
+ 				(unsigned long long)inum);
+ 		return -1;
+ 	}
++	if (ntfs_ie_stream_inconsistent(&ib->index, inum))
++		return -1;
+ 
+ 	return (0);
+ }
+@@ -560,7 +562,40 @@ int ntfs_index_entry_inconsistent(const INDEX_ENTRY *ie,
+ 	return (ret);
+ }
+ 
+-/** 
++int ntfs_ie_stream_inconsistent(const INDEX_HEADER *ih, u64 inum)
++{
++	const u8 *ies_start = (const u8 *)ih + le32_to_cpu(ih->entries_offset);
++	const u8 *ies_end = (const u8 *)ih + le32_to_cpu(ih->index_length);
++	const u8 *ie;
++
++	ntfs_log_trace("Entering\n");
++
++	for (ie = ies_start; ie < ies_end; ) {
++		u32 len;
++		const INDEX_ENTRY *ent = (const INDEX_ENTRY *)ie;
++
++		if ((size_t)(ies_end - ie) < sizeof(INDEX_ENTRY_HEADER))
++			goto err;
++		len = le16_to_cpu(ent->length);
++		if (len < sizeof(INDEX_ENTRY_HEADER) || (len & 7))
++			goto err;
++		if ((size_t)(ies_end - ie) < len)
++			goto err;
++		if (ent->ie_flags & INDEX_ENTRY_END) {
++			/* END must terminate the stream exactly. */
++			if (ie + len != ies_end)
++				goto err;
++			return 0;
++		}
++		ie += len;
++	}
++err:
++	ntfs_log_error("Corrupt index entry stream in inode %lld\n",
++			(long long)inum);
++	return -1;
++}
++
++/**
+  * Find a key in the index block.
+  * 
+  * Return values:
+@@ -1091,14 +1126,16 @@ out:
+ 
+ static INDEX_BLOCK *ntfs_ir_to_ib(INDEX_ROOT *ir, VCN ib_vcn)
+ {
++	u32 ib_size;
+ 	INDEX_BLOCK *ib;
+ 	INDEX_ENTRY *ie_last;
+ 	char *ies_start, *ies_end;
+ 	int i;
+ 	
+ 	ntfs_log_trace("Entering\n");
+-	
+-	ib = ntfs_ib_alloc(ib_vcn, le32_to_cpu(ir->index_block_size), LEAF_NODE);
++
++	ib_size = le32_to_cpu(ir->index_block_size);
++	ib = ntfs_ib_alloc(ib_vcn, ib_size, LEAF_NODE);
+ 	if (!ib)
+ 		return NULL;
+ 	
+@@ -1110,6 +1147,18 @@ static INDEX_BLOCK *ntfs_ir_to_ib(INDEX_ROOT *ir, VCN ib_vcn)
+ 	 * as well, which can never have any data.
+ 	 */
+ 	i = (char *)ie_last - ies_start + le16_to_cpu(ie_last->length);
++
++	if (offsetof(INDEX_BLOCK, index) + le32_to_cpu(ib->index.entries_offset)
++			+ i > ib_size)
++	{
++		ntfs_log_error("Last entry in index root overflows the index "
++				"block size: %d (index block size: %lu)\n",
++				i, (unsigned long)ib_size);
++		free(ib);
++		errno = EIO;
++		return NULL;
++	}
++
+ 	memcpy(ntfs_ie_get_first(&ib->index), ies_start, i);
+ 	
+ 	ib->index.ih_flags = ir->index.ih_flags;

diff --git a/8_ntfs-3g_2022.10.3-CVE-2026-56135.patch b/8_ntfs-3g_2022.10.3-CVE-2026-56135.patch
new file mode 100644
index 0000000..b6daeb9
--- /dev/null
+++ b/8_ntfs-3g_2022.10.3-CVE-2026-56135.patch
@@ -0,0 +1,151 @@
+diff --git a/include/ntfs-3g/acls.h b/include/ntfs-3g/acls.h
+index 932791e97..4f36389c5 100644
+--- a/include/ntfs-3g/acls.h
++++ b/include/ntfs-3g/acls.h
+@@ -168,6 +168,8 @@ char *ntfs_build_descr_posix(struct MAPPING* const mapping[],
+ 
+ #endif /* POSIXACLS */
+ 
++int ntfs_inherit_acl_extra_size(const ACL *acl, const SID *usid,
++			const SID *gsid);
+ int ntfs_inherit_acl(const ACL *oldacl, ACL *newacl,
+ 			const SID *usid, const SID *gsid,
+ 			BOOL fordir, le16 inherited);
+diff --git a/libntfs-3g/acls.c b/libntfs-3g/acls.c
+index 9f16fecd0..f9ed58f40 100644
+--- a/libntfs-3g/acls.c
++++ b/libntfs-3g/acls.c
+@@ -560,7 +560,9 @@ static BOOL valid_acl(const ACL *pacl, unsigned int end)
+ 			pace = (const ACCESS_ALLOWED_ACE*)
+ 				&((const char*)pacl)[offace];
+ 			acesz = le16_to_cpu(pace->size);
+-			switch (pace->type) {
++			if (acesz < sizeof(ACE_HEADER))
++				ok = FALSE;
++			else switch (pace->type) {
+ 			case ACCESS_ALLOWED_ACE_TYPE :
+ 			case ACCESS_DENIED_ACE_TYPE :
+ 				wantsz = ntfs_sid_size(&pace->sid) + 8;
+@@ -681,6 +683,87 @@ BOOL ntfs_valid_descr(const char *securattr, unsigned int attrsz)
+ 	return (ok);
+ }
+ 
++/**
++ * ntfs_inherit_acl_extra_size: compute creator SID inheritance slack
++ * @acl: ACL to scan
++ * @usid: owner SID to substitute for CREATOR_OWNER
++ * @gsid: group SID to substitute for CREATOR_GROUP
++ *
++ * Walks @acl bounded by acl->size, adding slack for ALLOW and DENY ACEs
++ * whose SID matches either creator placeholder.  ntfs_inherit_acl() can
++ * replace those placeholders by @usid or @gsid and, for directories, can
++ * also keep a verbatim copy for child inheritance.  Count the worst-case
++ * extra bytes so the inherited descriptor allocation cannot be overrun.
++ *
++ * Return: extra bytes needed, or 0 if @acl is NULL or structurally rejected.
++ */
++
++int ntfs_inherit_acl_extra_size(const ACL *acl,
++			const SID *usid, const SID *gsid)
++{
++	const ACCESS_ALLOWED_ACE *ace;
++	unsigned int off;
++	unsigned int acl_size;
++	unsigned int acesz;
++	unsigned int sidsz;
++	int usidsz;
++	int gsidsz;
++	int ownersidsz;
++	int groupsidsz;
++	int oldcnt;
++	int nace;
++	int extra;
++	BOOL usid_is_group_sid;
++
++	extra = 0;
++	if (!acl || !usid || !gsid)
++		return (0);
++	acl_size = le16_to_cpu(acl->size);
++	if (acl_size < sizeof(ACL))
++		return (0);
++	oldcnt = le16_to_cpu(acl->ace_count);
++	usidsz = ntfs_sid_size(usid);
++	gsidsz = ntfs_sid_size(gsid);
++	ownersidsz = sizeof(ownersidbytes);
++	groupsidsz = sizeof(groupsidbytes);
++	usid_is_group_sid = ntfs_same_sid(usid, groupsid);
++	off = sizeof(ACL);
++	for (nace = 0; nace < oldcnt; nace++) {
++		if (off + 8 > acl_size)
++			break;
++		ace = (const ACCESS_ALLOWED_ACE*)((const char*)acl + off);
++		acesz = le16_to_cpu(ace->size);
++		if (acesz < 8 || acesz > acl_size - off)
++			break;
++		switch (ace->type) {
++		case ACCESS_ALLOWED_ACE_TYPE :
++		case ACCESS_DENIED_ACE_TYPE :
++			if ((acesz >= 8 + sizeof(ownersidbytes))
++					&& ntfs_valid_sid(&ace->sid)) {
++				sidsz = ntfs_sid_size(&ace->sid);
++				if (sidsz <= acesz - 8) {
++					if (ntfs_same_sid(&ace->sid, ownersid))
++					{
++						extra += usidsz	- ownersidsz +
++								20;
++						if (usid_is_group_sid)
++							extra += gsidsz	-
++								groupsidsz + 20;
++					}
++					if (ntfs_same_sid(&ace->sid, groupsid))
++						extra += gsidsz	- groupsidsz +
++								20;
++				}
++			}
++			break;
++		default :
++			break;
++		}
++		off += acesz;
++	}
++	return extra;
++}
++
+ /*
+  *		Copy the inheritable parts of an ACL
+  *
+diff --git a/libntfs-3g/security.c b/libntfs-3g/security.c
+index acee0a5ed..d0e030e19 100644
+--- a/libntfs-3g/security.c
++++ b/libntfs-3g/security.c
+@@ -3944,6 +3944,30 @@ static le32 build_inherited_id(struct SECURITY_CONTEXT *scx,
+ 	usidsz = ntfs_sid_size(usid);
+ 	gsidsz = ntfs_sid_size(gsid);
+ 	newattrsz = parentattrsz + 3*usidsz + 3*gsidsz;
++	/*
++	 * The +3*usidsz + 3*gsidsz slack above only covers a few creator SID
++	 * expansions during ntfs_inherit_acl().  Add worst-case slack for every
++	 * ALLOW/DENY creator-owner and creator-group ACE in both the parent
++	 * DACL and SACL.
++	 */
++	if (pphead->dacl) {
++		offpacl = le32_to_cpu(pphead->dacl);
++		if ((unsigned int)offpacl + sizeof(ACL) <=
++				(unsigned int)parentattrsz) {
++			ppacl = (const ACL*)&parentattr[offpacl];
++			newattrsz += ntfs_inherit_acl_extra_size(ppacl,
++					usid, gsid);
++		}
++	}
++	if (pphead->sacl) {
++		offpacl = le32_to_cpu(pphead->sacl);
++		if ((unsigned int)offpacl + sizeof(ACL) <=
++				(unsigned int)parentattrsz) {
++			ppacl = (const ACL*)&parentattr[offpacl];
++			newattrsz += ntfs_inherit_acl_extra_size(ppacl,
++					usid, gsid);
++		}
++	}
+ 	if (fordir)
+ 		newattrsz *= 2;
+ 	newattr = (char*)ntfs_malloc(newattrsz);

diff --git a/9_ntfs-3g_2022.10.3-CVE-2026-56136.patch b/9_ntfs-3g_2022.10.3-CVE-2026-56136.patch
new file mode 100644
index 0000000..b168ee3
--- /dev/null
+++ b/9_ntfs-3g_2022.10.3-CVE-2026-56136.patch
@@ -0,0 +1,130 @@
+diff --git a/include/ntfs-3g/index.h b/include/ntfs-3g/index.h
+index d001863ae..1d5845d47 100644
+--- a/include/ntfs-3g/index.h
++++ b/include/ntfs-3g/index.h
+@@ -143,6 +143,7 @@ extern int ntfs_index_block_inconsistent(const INDEX_BLOCK *ib, u32 block_size,
+ 			u64 inum, VCN vcn);
+ extern int ntfs_index_entry_inconsistent(const INDEX_ENTRY *ie,
+ 			COLLATION_RULES collation_rule, u64 inum);
++extern int ntfs_ie_stream_inconsistent(const INDEX_HEADER *ih, u64 inum);
+ extern int ntfs_index_lookup(const void *key, const int key_len,
+ 		ntfs_index_context *ictx) __attribute_warn_unused_result__;
+ 
+diff --git a/libntfs-3g/attrib.c b/libntfs-3g/attrib.c
+index efb919438..cfc2446e3 100644
+--- a/libntfs-3g/attrib.c
++++ b/libntfs-3g/attrib.c
+@@ -3528,6 +3528,10 @@ int ntfs_attr_inconsistent(const ATTR_RECORD *a, const MFT_REF mref)
+ 			if (a->non_resident
+ 			    || (le32_to_cpu(a->value_length)
+ 				< offsetof(INDEX_ROOT, index.reserved))
++			    || (le32_to_cpu(ir->index_block_size)
++				< NTFS_BLOCK_SIZE)
++			    || (le32_to_cpu(ir->index_block_size)
++				& (le32_to_cpu(ir->index_block_size) - 1))
+ 			    || (le32_to_cpu(ir->index.entries_offset)
+ 				< sizeof(INDEX_HEADER))
+ 			    || (le32_to_cpu(ir->index.index_length)
+@@ -3542,6 +3546,9 @@ int ntfs_attr_inconsistent(const ATTR_RECORD *a, const MFT_REF mref)
+ 					(long long)inum);
+ 				errno = EIO;
+ 				ret = -1;
++			} else if (ntfs_ie_stream_inconsistent(&ir->index, inum)) {
++				errno = EIO;
++				ret = -1;
+ 			}
+ 			break;
+ 		case AT_STANDARD_INFORMATION :
+diff --git a/libntfs-3g/index.c b/libntfs-3g/index.c
+index e48d6aafb..c9651a62c 100644
+--- a/libntfs-3g/index.c
++++ b/libntfs-3g/index.c
+@@ -504,6 +504,8 @@ int ntfs_index_block_inconsistent(const INDEX_BLOCK *ib, u32 block_size,
+ 				(unsigned long long)inum);
+ 		return -1;
+ 	}
++	if (ntfs_ie_stream_inconsistent(&ib->index, inum))
++		return -1;
+ 
+ 	return (0);
+ }
+@@ -560,7 +562,40 @@ int ntfs_index_entry_inconsistent(const INDEX_ENTRY *ie,
+ 	return (ret);
+ }
+ 
+-/** 
++int ntfs_ie_stream_inconsistent(const INDEX_HEADER *ih, u64 inum)
++{
++	const u8 *ies_start = (const u8 *)ih + le32_to_cpu(ih->entries_offset);
++	const u8 *ies_end = (const u8 *)ih + le32_to_cpu(ih->index_length);
++	const u8 *ie;
++
++	ntfs_log_trace("Entering\n");
++
++	for (ie = ies_start; ie < ies_end; ) {
++		u32 len;
++		const INDEX_ENTRY *ent = (const INDEX_ENTRY *)ie;
++
++		if ((size_t)(ies_end - ie) < sizeof(INDEX_ENTRY_HEADER))
++			goto err;
++		len = le16_to_cpu(ent->length);
++		if (len < sizeof(INDEX_ENTRY_HEADER) || (len & 7))
++			goto err;
++		if ((size_t)(ies_end - ie) < len)
++			goto err;
++		if (ent->ie_flags & INDEX_ENTRY_END) {
++			/* END must terminate the stream exactly. */
++			if (ie + len != ies_end)
++				goto err;
++			return 0;
++		}
++		ie += len;
++	}
++err:
++	ntfs_log_error("Corrupt index entry stream in inode %lld\n",
++			(long long)inum);
++	return -1;
++}
++
++/**
+  * Find a key in the index block.
+  * 
+  * Return values:
+@@ -1091,14 +1126,16 @@ out:
+ 
+ static INDEX_BLOCK *ntfs_ir_to_ib(INDEX_ROOT *ir, VCN ib_vcn)
+ {
++	u32 ib_size;
+ 	INDEX_BLOCK *ib;
+ 	INDEX_ENTRY *ie_last;
+ 	char *ies_start, *ies_end;
+ 	int i;
+ 	
+ 	ntfs_log_trace("Entering\n");
+-	
+-	ib = ntfs_ib_alloc(ib_vcn, le32_to_cpu(ir->index_block_size), LEAF_NODE);
++
++	ib_size = le32_to_cpu(ir->index_block_size);
++	ib = ntfs_ib_alloc(ib_vcn, ib_size, LEAF_NODE);
+ 	if (!ib)
+ 		return NULL;
+ 	
+@@ -1110,6 +1147,18 @@ static INDEX_BLOCK *ntfs_ir_to_ib(INDEX_ROOT *ir, VCN ib_vcn)
+ 	 * as well, which can never have any data.
+ 	 */
+ 	i = (char *)ie_last - ies_start + le16_to_cpu(ie_last->length);
++
++	if (offsetof(INDEX_BLOCK, index) + le32_to_cpu(ib->index.entries_offset)
++			+ i > ib_size)
++	{
++		ntfs_log_error("Last entry in index root overflows the index "
++				"block size: %d (index block size: %lu)\n",
++				i, (unsigned long)ib_size);
++		free(ib);
++		errno = EIO;
++		return NULL;
++	}
++
+ 	memcpy(ntfs_ie_get_first(&ib->index), ies_start, i);
+ 	
+ 	ib->index.ih_flags = ir->index.ih_flags;

diff --git a/ntfs-3g.spec b/ntfs-3g.spec
index c601acd..7d6df1a 100644
--- a/ntfs-3g.spec
+++ b/ntfs-3g.spec
@@ -8,7 +8,7 @@
 Name:           ntfs-3g
 Epoch:          2
 Version:        2022.10.3
-Release:        10%{?dist}
+Release:        11%{?dist}
 Summary:        Linux NTFS userspace driver
 # Automatically converted from old format: GPLv2+ - review is highly recommended.
 License:        GPL-2.0-or-later
@@ -26,6 +26,19 @@ Patch6:		https://github.com/tuxera/ntfs-3g/commit/75dcdc2cf37478fad6c0e3427403d1
 # CVE-2026-40706
 Patch7:         https://github.com/tuxera/ntfs-3g/commit/e48e1ef2a1fcff13a590c2224ec21c5bd5d3e92e.patch
 
+# Upstream provided backport patches for CVEs
+# fix for CVE-2026-42617 is the same as for CVE-2026-46572 and CVE-2026-56136
+
+Patch100:       1_ntfs-3g_2022.10.3-CVE-2026-42618.patch
+Patch101:       2_ntfs-3g_2022.10.3-CVE-2026-42616.patch
+Patch102:       3_ntfs-3g_2022.10.3-CVE-2026-42617.patch
+Patch103:       4_ntfs-3g_2022.10.3-CVE-2026-46569.patch
+Patch104:       5_ntfs-3g_2022.10.3-CVE-2026-46571.patch
+Patch105:       6_ntfs-3g_2022.10.3-CVE-2026-46570.patch
+# Patch106:       7_ntfs-3g_2022.10.3-CVE-2026-46572.patch
+Patch107:       8_ntfs-3g_2022.10.3-CVE-2026-56135.patch
+# Patch108:       9_ntfs-3g_2022.10.3-CVE-2026-56136.patch
+
 BuildRequires:  make
 # ntfs-3g BuildRequires
 BuildRequires:  gnutls-devel
@@ -203,6 +216,12 @@ rm -rf %{buildroot}%{_defaultdocdir}/%{name}/README
 %exclude %{_mandir}/man8/ntfs-3g*
 
 %changelog
+* Thu Sep 24 2026 Tom Callaway <spot@fedoraproject.org> - 2:2022.10.3-11
+- apply upstream patches for:
+  CVE-2026-42616 CVE-2026-42617 CVE-2026-42618
+  CVE-2026-46569 CVE-2026-46571 CVE-2026-46570
+  CVE-2026-46572 CVE-2026-56135 CVE-2026-56136
+
 * Wed Jul 15 2026 Carl George <carlwgeorge@gmail.com> - 2:2022.10.3-10
 - Backport upstream fix for CVE-2026-40706
 

                 reply	other threads:[~2026-09-24 14:59 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=179026199326.1.14826978534258203108.rpms-ntfs-3g-00d0161b0d32@fedoraproject.org \
    --to=spotaws@amazon.com \
    --cc=git-commits@fedoraproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox