From: <abe...@us...> - 2016-10-01 19:54:13
|
Revision: 7872 http://sourceforge.net/p/astlinux/code/7872 Author: abelbeck Date: 2016-10-01 19:54:10 +0000 (Sat, 01 Oct 2016) Log Message: ----------- squashfs, host mksquashfs 4.3, cherry-pick two upstream fixes that has caused a failed build Ref: https://git.kernel.org/cgit/fs/squashfs/squashfs-tools.git/ Added Paths: ----------- branches/1.0/package/squashfs/squashfs-fix-2GB-limit-is_fragment.patch branches/1.0/package/squashfs/squashfs-mksquashfs-fix-race-condition.patch Added: branches/1.0/package/squashfs/squashfs-fix-2GB-limit-is_fragment.patch =================================================================== --- branches/1.0/package/squashfs/squashfs-fix-2GB-limit-is_fragment.patch (rev 0) +++ branches/1.0/package/squashfs/squashfs-fix-2GB-limit-is_fragment.patch 2016-10-01 19:54:10 UTC (rev 7872) @@ -0,0 +1,29 @@ +From 9c1db6d13a51a2e009f0027ef336ce03624eac0d Mon Sep 17 00:00:00 2001 +From: "Guan, Xin" <gua...@gm...> +Date: Sat, 13 Sep 2014 13:15:26 +0200 +Subject: Fix 2GB-limit of the is_fragment(...) function. + +Applies to squashfs-tools 4.3. + +Reported-by: Bruno Wolff III <br...@wo...> +Signed-off-by: Guan, Xin <gua...@gm...> +Signed-off-by: Phillip Lougher <ph...@sq...> +--- + squashfs-tools/mksquashfs.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/squashfs-tools/mksquashfs.c b/squashfs-tools/mksquashfs.c +index f1fcff1..d221c35 100644 +--- a/squashfs-tools/mksquashfs.c ++++ b/squashfs-tools/mksquashfs.c +@@ -2055,7 +2055,7 @@ struct file_info *duplicate(long long file_size, long long bytes, + + inline int is_fragment(struct inode_info *inode) + { +- int file_size = inode->buf.st_size; ++ off_t file_size = inode->buf.st_size; + + /* + * If this block is to be compressed differently to the +-- +cgit v0.12 Added: branches/1.0/package/squashfs/squashfs-mksquashfs-fix-race-condition.patch =================================================================== --- branches/1.0/package/squashfs/squashfs-mksquashfs-fix-race-condition.patch (rev 0) +++ branches/1.0/package/squashfs/squashfs-mksquashfs-fix-race-condition.patch 2016-10-01 19:54:10 UTC (rev 7872) @@ -0,0 +1,59 @@ +From de03266983ceb62e5365aac84fcd3b2fd4d16e6f Mon Sep 17 00:00:00 2001 +From: Phillip Lougher <ph...@sq...> +Date: Thu, 18 Sep 2014 01:28:11 +0100 +Subject: mksquashfs: fix rare race in fragment waiting in filesystem + finalisation + +Fix a rare race condition in fragment waiting when finalising the +filesystem. This is a race condition that was initially fixed in 2009, +but inadvertantly re-introduced in the latest release when the code +was rewritten. + +Background: + +When finalising the filesystem, the main control thread needs to ensure +all the in-flight fragments have been queued to the writer thread before +asking the writer thread to finish, and then writing the metadata. + +It does this by waiting on the fragments_outstanding counter. Once this +counter reaches 0, it synchronises with the writer thread, waiting until +the writer thread reports no outstanding data to be written. + +However, the main thread can race with the fragment deflator thread(s) +because the fragment deflator thread(s) decrement the fragments_outstanding +counter and release the mutex before queueing the compressed fragment +to the writer thread, i.e. the offending code is: + + fragments_outstanding --; + pthread_mutex_unlock(&fragment_mutex); + queue_put(to_writer, write_buffer); + +In extremely rare circumstances, the main thread may see the +fragments_outstanding counter is zero before the fragment +deflator sends the fragment buffer to the writer thread, and synchronise +with the writer thread, and finalise before the fragment has been written. + +The fix is to ensure the fragment is queued to the writer thread +before releasing the mutex. + +Signed-off-by: Phillip Lougher <ph...@sq...> +--- + squashfs-tools/mksquashfs.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/squashfs-tools/mksquashfs.c b/squashfs-tools/mksquashfs.c +index 87b7d86..f1fcff1 100644 +--- a/squashfs-tools/mksquashfs.c ++++ b/squashfs-tools/mksquashfs.c +@@ -2445,8 +2445,8 @@ void *frag_deflator(void *arg) + write_buffer->block = bytes; + bytes += compressed_size; + fragments_outstanding --; +- pthread_mutex_unlock(&fragment_mutex); + queue_put(to_writer, write_buffer); ++ pthread_mutex_unlock(&fragment_mutex); + TRACE("Writing fragment %lld, uncompressed size %d, " + "compressed size %d\n", file_buffer->block, + file_buffer->size, compressed_size); +-- +cgit v0.12 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |