Problem: getblocks and getheaders enforce MAX_LOCATOR_SZ only after deserializing locator hashes.
A truncated locator advertising an oversized count makes generic vector deserialization fail before the disconnect check, leaving the peer connected.
Fix: Read the advertised count before allocating hashes and disconnect when it exceeds the existing limit.
Catch only the size-limit error so other deserialization failures remain non-disconnecting.
Complete oversized locators continue to disconnect without discouragement, and p2p_invalid_locator.py preserves the established boundary: both messages accept 101 hashes and disconnect at 102.