|  | @@ -9,6 +9,7 @@ use std::fmt;
 | 
	
		
			
				|  |  |  use std::collections::{HashMap, HashSet};
 | 
	
		
			
				|  |  |  use std::ops::Range;
 | 
	
		
			
				|  |  |  use std::string::String;
 | 
	
		
			
				|  |  | +use std::u32;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  use tor_util::strings::NUL_BYTE;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -204,9 +205,13 @@ impl Versions {
 | 
	
		
			
				|  |  |                      versions.insert(p);
 | 
	
		
			
				|  |  |                  }
 | 
	
		
			
				|  |  |              } else {
 | 
	
		
			
				|  |  | -                versions.insert(u32::from_str(piece).or(
 | 
	
		
			
				|  |  | +                let v = u32::from_str(piece).or(
 | 
	
		
			
				|  |  |                      Err("invalid protocol entry"),
 | 
	
		
			
				|  |  | -                )?);
 | 
	
		
			
				|  |  | +                )?;
 | 
	
		
			
				|  |  | +                if v == u32::MAX {
 | 
	
		
			
				|  |  | +                    return Err("invalid protocol entry");
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                versions.insert(v);
 | 
	
		
			
				|  |  |              }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |              if versions.len() > MAX_PROTOCOLS_TO_EXPAND {
 | 
	
	
		
			
				|  | @@ -447,6 +452,10 @@ fn expand_version_range(range: &str) -> Result<Range<u32>, &'static str> {
 | 
	
		
			
				|  |  |          "cannot parse protocol range upper bound",
 | 
	
		
			
				|  |  |      ))?;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    if lower == u32::MAX || higher == u32::MAX {
 | 
	
		
			
				|  |  | +        return Err("protocol range value out of range");
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      // We can use inclusive range syntax when it becomes stable.
 | 
	
		
			
				|  |  |      let result = lower..higher + 1;
 | 
	
		
			
				|  |  |  
 |