#endif
-using namespace p2tp;
+using namespace swift;
#define HASHSZ 20
const size_t Sha1Hash::SIZE = HASHSZ;
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));
p = p.parent();
c--;
}
- //dprintf("p %lli %s\n",(uint64_t)p,hash.hex().c_str());
}
return 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()]) ;
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_++;