Race condition in applyDiffWithOptions
mtrmac opened this issue · 0 comments
mtrmac commented
I’m trying to fix storage tests in c/image after 3 years they basically didn’t work at all (containers/image#1729 ), and I’m running into a race condition that reproduces 100% for me.
Line 2264 in e21971a
uncompressed.Close()
(and a buffer deallocation/cleanup) whenapplyDiffWithOptions
returns- That happens after
Line 2289 in e21971a
payload
is read up to a a tar EOF marker. - But
payload
is a read end of a pipe, and the producer is concurrent! The producer has read an EOF marker, correctly propagated it to the consumer, and now the producer may be, in particular, at https://github.com/vbatts/tar-split/blob/fe4605ae8b2a5c0fed8f7852dd460879c03e6943/tar/asm/disassemble.go#L130 . And ifuncompressed
was already deallocated, this crashes.
Arguably the interface and implementation of NewInputTarStream
just don’t match.
Alternatively, c/storage could probably deal with this itself by ensuring uncompressed
is not really accessed after the .Close()
, using something like https://github.com/containers/image/blob/main/internal/uploadreader/upload_reader.go (which exists to work around a similar problem in net/http
).
Cc: @vbatts