fix: added channel to handle concurrency bug #1119
Open
+6
−1
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Description
This PR fixes a concurrency related bug in your codebase.
While triaging your project, our bug fixing tool generated the following message-
In file
loadTests.go
, there's a methodtryNewFramework
that has a select statement that goes-In this select statement, there's a receive operation from channel
ch
along with a receive operation from a timeout channel. On the other hand, in the goroutine, there's a send operation to channelch
. If no receive operation is performed onch
channel within thetimeout
, then a time-out will take place. It all seems correct except for a corner case.The receive on channel
ch
and thetimeout
may take place at the same moment. In that case, the select will randomly choose one of those two receives. From documentation-If, select chooses the timeout, then the go-routine that performs the send on channel
ch
will remain halted since the receiving end isn't ready.Solution
As a solution, we introduce another channel called
quit
. In the sending go-routine, we create aselect
statement that reads fromquit
channel and performs the send onch
. And in the receiving end, when we get a timeout, we simply close thequit
channel. If the channel is closed, the other go-routine will notice a closed channel and will exit normally.Issue ticket number and link
None
Type of change
How Has This Been Tested?
This hasn't been tested.
Checklist:
Sponsorship and Support
This work is done by the security researchers from OpenRefactory and is supported by the Open Source Security Foundation (OpenSSF): Project Alpha-Omega. Alpha-Omega is a project partnering with open source software project maintainers to systematically find new, as-yet-undiscovered vulnerabilities in open source code - and get them fixed – to improve global software supply chain security.
The bug is found by running the Intelligent Code Repair (iCR) tool by OpenRefactory and then manually triaging the results.