mirror of
git://slackware.nl/current.git
synced 2024-12-27 09:59:16 +01:00
646a5c1cbf
a/pkgtools-15.0-noarch-13.txz: Rebuilt. installpkg: default line length for --terselength is the number of columns. removepkg: added --terse mode. upgradepkg: default line length for --terselength is the number of columns. upgradepkg: accept -option in addition to --option. ap/vim-8.1.0026-x86_64-1.txz: Upgraded. d/bison-3.0.5-x86_64-1.txz: Upgraded. e/emacs-26.1-x86_64-1.txz: Upgraded. kde/kopete-4.14.3-x86_64-8.txz: Rebuilt. Recompiled against libidn-1.35. n/conntrack-tools-1.4.5-x86_64-1.txz: Upgraded. n/libnetfilter_conntrack-1.0.7-x86_64-1.txz: Upgraded. n/libnftnl-1.1.0-x86_64-1.txz: Upgraded. n/links-2.16-x86_64-2.txz: Rebuilt. Rebuilt to enable X driver for -g mode. n/lynx-2.8.9dev.19-x86_64-1.txz: Upgraded. n/nftables-0.8.5-x86_64-1.txz: Upgraded. n/p11-kit-0.23.11-x86_64-1.txz: Upgraded. n/ulogd-2.0.7-x86_64-1.txz: Upgraded. n/whois-5.3.1-x86_64-1.txz: Upgraded. xap/network-manager-applet-1.8.12-x86_64-1.txz: Upgraded. xap/vim-gvim-8.1.0026-x86_64-1.txz: Upgraded.
54 lines
2.4 KiB
Diff
54 lines
2.4 KiB
Diff
commit de03266983ceb62e5365aac84fcd3b2fd4d16e6f
|
|
Author: Phillip Lougher <phillip@squashfs.org.uk>
|
|
Date: Thu Sep 18 01:28:11 2014 +0100
|
|
|
|
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 <phillip@squashfs.org.uk>
|
|
|
|
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);
|