diff mbox series

[v2,03/14] btrfs-progs: image: Fix an access-beyond-boundary bug when there are 32 online CPUs

Message ID 20190702100650.2746-4-wqu@suse.com (mailing list archive)
State New, archived
Headers show
Series btrfs-progs: image: Enhance and bug fixes | expand

Commit Message

Qu Wenruo July 2, 2019, 10:07 a.m. UTC
[BUG]
When there are over 32 (in my example, 35) online CPUs, btrfs-image -c9
will just hang.

[CAUSE]
Btrfs-image has a hard coded limit (32) on how many threads we can use.
For the "-t" option we do the up limit check.

But when we don't specify "-t" option and speicified "-c" option, then
btrfs-image will try to auto detect the number of online CPUs, and use
it without checking if it's over the up limit.

And for num_threads larger than the up limit, we will over write the
adjust members of metadump_struct/mdrestore_struct, corrupting
pthread_mutex_t and pthread_cond_t, causing synchronising problem.

Nowadays, with SMT/HT and higher cpu core counts, it's not hard to go
beyond 32 threads, and hit the bug.

[FIX]
Just do extra num_threads check before using the number from sysconf().

Signed-off-by: Qu Wenruo <wqu@suse.com>
---
 image/main.c | 1 +
 1 file changed, 1 insertion(+)
diff mbox series

Patch

diff --git a/image/main.c b/image/main.c
index 9a07d9455e4f..c45d506812b2 100644
--- a/image/main.c
+++ b/image/main.c
@@ -2701,6 +2701,7 @@  int main(int argc, char *argv[])
 
 			if (tmp <= 0)
 				tmp = 1;
+			tmp = min_t(long, tmp, MAX_WORKER_THREADS);
 			num_threads = tmp;
 		}
 	} else {