-
Notifications
You must be signed in to change notification settings - Fork 1.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Protect CKeyHolderStorage via mutex #1834
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
utACK
utACK |
1 similar comment
utACK |
@@ -27,12 +27,14 @@ CScript CKeyHolder::GetScriptForDestination() const | |||
|
|||
const CKeyHolder& CKeyHolderStorage::AddKey(CWallet* pwallet) | |||
{ | |||
LOCK(cs_storage); | |||
storage.emplace_back(std::unique_ptr<CKeyHolder>(new CKeyHolder(pwallet))); | |||
LogPrintf("CKeyHolderStorage::%s -- storage size %lld\n", __func__, storage.size()); | |||
return *storage.back(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This leaks a reference to an unlocked entry in storage
. The reference seems to be only used to call GetScriptForDestination()
on it. Maybe it's better to change this method to return a copy of the pubKey instead?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Indeed. pubKey
is a private member however and since we never actually need anything else but corresponding CScript
anyway I guess changing this to return storage.back().GetScriptForDestination();
should do the job.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sounds good 👍
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
pls see #1840
* 'spice' of github.com:NarubyRiverlione/spice: (8382 commits) updated testnet genessis spice images more rename genesis blocks ports magic message letters start letter addresses cleanup : * remove gitian signatures * remove seeds rename: more originale files rename Prepare 0.12.2.3 release notes (dashpay#1846) Avoid reference leakage in CKeyHolderStorage::AddKey (dashpay#1840) Protect CKeyHolderStorage via mutex (dashpay#1834) Skip existing masternode conections on mixing (dashpay#1833) Merge pull request dashpay#1836 from lodgepole/feature/backport-11847 Fix -liquidityprovider option (dashpay#1829) Vote on IS only if it was accepted to mempool (dashpay#1826) bump version to 0.12.2.3 (dashpay#1827) Merge bitcoin#8256: BUG: bitcoin-qt crash Swap iterations and fUseInstantSend parameters in ApproximateBestSubset (dashpay#1819) Fix crash on exit when -createwalletbackups=0 (dashpay#1810) Prepare v0.12.2.2 release notes (dashpay#1769) Force rcc to use resource format version 1. (dashpay#1784) ... # Conflicts: # contrib/gitian-descriptors/gitian-osx-signer.yml # contrib/gitian-descriptors/gitian-win-signer.yml # src/chainparams.cpp # src/qt/res/icons/bitcoin.icns # src/qt/res/icons/bitcoin.ico # src/qt/res/icons/bitcoin.png # src/qt/res/icons/crownium/about.png # src/qt/res/icons/drkblue/about.png # src/qt/res/icons/drkblue/bitcoin.png # src/qt/res/icons/light/about.png # src/qt/res/icons/light/remove.png # src/qt/res/icons/remove.png # src/qt/res/icons/trad/about.png # src/qt/res/icons/trad/remove.png
Sometimes
dsc
arrives at the same time we decide that session is timed out. This leads to a situation whenkeyHolderStorage
is accessed from two threads which in its turn leads to a crash. Protecting internal vector via mutex should solve this.