make sure IsMine only returns true when we own all keys
authorcoderrr <coderrr.contact@gmail.com>
Mon, 2 Jan 2012 07:27:41 +0000 (14:27 +0700)
committercoderrr <coderrr.contact@gmail.com>
Mon, 2 Jan 2012 23:24:52 +0000 (06:24 +0700)
src/script.cpp
src/test/multisig_tests.cpp

index f576e14..3487280 100644 (file)
@@ -1436,7 +1436,7 @@ bool IsMine(const CKeyStore &keystore, const CScript& scriptPubKey)
         // them) enable spend-out-from-under-you attacks, especially
         // in shared-wallet situations.
         vector<valtype> keys(vSolutions.begin()+1, vSolutions.begin()+vSolutions.size()-1);
-        return HaveKeys(vSolutions, keystore);
+        return HaveKeys(keys, keystore) == keys.size();
     }
     }
     return false;
index 742083f..0c2e41a 100644 (file)
@@ -174,7 +174,7 @@ BOOST_AUTO_TEST_CASE(multisig_Solver1)
     // one key that would satisfy an (a|b) or 2-of-3 keys needed
     // to spend an escrow transaction.
     //
-    CBasicKeyStore keystore, emptykeystore;
+    CBasicKeyStore keystore, emptykeystore, partialkeystore;
     CKey key[3];
     CBitcoinAddress keyaddr[3];
     for (int i = 0; i < 3; i++)
@@ -183,6 +183,7 @@ BOOST_AUTO_TEST_CASE(multisig_Solver1)
         keystore.AddKey(key[i]);
         keyaddr[i].SetPubKey(key[i].GetPubKey());
     }
+    partialkeystore.AddKey(key[0]);
 
     {
         vector<valtype> solutions;
@@ -221,6 +222,7 @@ BOOST_AUTO_TEST_CASE(multisig_Solver1)
         BOOST_CHECK(!ExtractAddress(s, addr));
         BOOST_CHECK(IsMine(keystore, s));
         BOOST_CHECK(!IsMine(emptykeystore, s));
+        BOOST_CHECK(!IsMine(partialkeystore, s));
     }
     {
         vector<valtype> solutions;
@@ -237,6 +239,7 @@ BOOST_AUTO_TEST_CASE(multisig_Solver1)
         BOOST_CHECK(nRequired = 1);
         BOOST_CHECK(IsMine(keystore, s));
         BOOST_CHECK(!IsMine(emptykeystore, s));
+        BOOST_CHECK(!IsMine(partialkeystore, s));
     }
     {
         vector<valtype> solutions;