add .gitignore
[swift-upb.git] / hashtree.cpp
index 7f19502..783b900 100644 (file)
@@ -22,7 +22,7 @@
 #endif
 
 
-using namespace p2tp;
+using namespace swift;
 
 #define HASHSZ 20
 const size_t Sha1Hash::SIZE = HASHSZ;
@@ -58,7 +58,10 @@ Sha1Hash::Sha1Hash(bool hex, const char* hash) {
         int val;
         for(int i=0; i<SIZE; i++) {
             strncpy(hx,hash+i*2,2);
-            sscanf(hx, "%x", &val);
+            if (sscanf(hx, "%x", &val)!=1) {
+                memset(bits,0,20);
+                return;
+            }
             bits[i] = val;
         }
         assert(this->hex()==std::string(hash));
@@ -257,7 +260,6 @@ Sha1Hash        HashTree::DeriveRoot () {
             p = p.parent();
             c--;
         }
-        //dprintf("p %lli %s\n",(uint64_t)p,hash.hex().c_str());
     }
     return hash;
 }
@@ -286,14 +288,14 @@ bool            HashTree::OfferHash (bin64_t pos, const Sha1Hash& hash) {
         return false;
     if (peak==pos)
         return hash == hashes_[pos];
-    if (ack_out_.get(pos.parent())!=bins::EMPTY)
+    if (ack_out_.get(pos.parent())!=binmap_t::EMPTY)
         return hash==hashes_[pos]; // have this hash already, even accptd data
     hashes_[pos] = hash;
     if (!pos.is_base())
         return false; // who cares?
     bin64_t p = pos;
     Sha1Hash uphash = hash;
-    while ( p!=peak && ack_out_.get(p)==bins::EMPTY ) {
+    while ( p!=peak && ack_out_.get(p)==binmap_t::EMPTY ) {
         hashes_[p] = uphash;
         p = p.parent();
         uphash = Sha1Hash(hashes_[p.left()],hashes_[p.right()]) ;
@@ -309,17 +311,20 @@ bool            HashTree::OfferData (bin64_t pos, const char* data, size_t lengt
         return false;
     if (length<1024 && pos!=bin64_t(0,sizek_-1))
         return false;
-    if (ack_out_.get(pos)==bins::FILLED)
+    if (ack_out_.get(pos)==binmap_t::FILLED)
         return true; // to set data_in_
     bin64_t peak = peak_for(pos);
     if (peak==bin64_t::NONE)
         return false;
 
-    if (!OfferHash(pos, Sha1Hash(data,length)))
+    Sha1Hash data_hash(data,length);
+    if (!OfferHash(pos, data_hash)) {
+        //printf("invalid hash for %s: %s\n",pos.str(),data_hash.hex().c_str()); // paranoid
         return false;
+    }
 
     //printf("g %lli %s\n",(uint64_t)pos,hash.hex().c_str());
-    ack_out_.set(pos,bins::FILLED);
+    ack_out_.set(pos,binmap_t::FILLED);
     pwrite(fd_,data,length,pos.base_offset()<<10);
     complete_ += length;
     completek_++;