Commit 84d6ebe6 authored by Anton Altaparmakov's avatar Anton Altaparmakov
Browse files

NTFS: Fix two nasty runlist merging bugs that had gone unnoticed so far.


      Thanks to Stefano Picerno for the bug report.

Signed-off-by: default avatarAnton Altaparmakov <aia21@cantab.net>
parent 9529d461
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -43,6 +43,8 @@ ToDo/Notes:
	- Use ntfs_malloc_nofs_nofail() in the two critical regions in
	  fs/ntfs/runlist.c::ntfs_runlists_merge().  This means we no longer
	  need to panic() if the allocation fails as it now cannot fail.
	- Fix two nasty runlist merging bugs that had gone unnoticed so far.
	  Thanks to Stefano Picerno for the bug report.

2.1.23 - Implement extension of resident files and make writing safe as well as
	 many bug fixes, cleanups, and enhancements...
+3 −2
Original line number Diff line number Diff line
@@ -542,6 +542,7 @@ runlist_element *ntfs_runlists_merge(runlist_element *drl,
			/* Scan to the end of the source runlist. */
			for (dend = 0; likely(drl[dend].length); dend++)
				;
			dend++;
			drl = ntfs_rl_realloc(drl, dend, dend + 1);
			if (IS_ERR(drl))
				return drl;
@@ -611,8 +612,8 @@ runlist_element *ntfs_runlists_merge(runlist_element *drl,
		 ((drl[dins].vcn + drl[dins].length) <=      /* End of hole   */
		  (srl[send - 1].vcn + srl[send - 1].length)));

	/* Or we'll lose an end marker */
	if (start && finish && (drl[dins].length == 0))
	/* Or we will lose an end marker. */
	if (finish && !drl[dins].length)
		ss++;
	if (marker && (drl[dins].vcn + drl[dins].length > srl[send - 1].vcn))
		finish = FALSE;