fix segfault when index into packed geometry ran out of bounds
This commit is contained in:
		
							parent
							
								
									2656acc321
								
							
						
					
					
						commit
						bf3e3f0c3d
					
				| @ -242,18 +242,18 @@ template <class DataFacadeT> class BasicRoutingInterface | |||||||
|                     facade->GetUncompressedGeometry(facade->GetGeometryIndexForEdgeID(ed.id), |                     facade->GetUncompressedGeometry(facade->GetGeometryIndexForEdgeID(ed.id), | ||||||
|                                                     id_vector); |                                                     id_vector); | ||||||
| 
 | 
 | ||||||
|                     const int start_index = |                     const std::size_t start_index = | ||||||
|                         (unpacked_path.empty() |                         (unpacked_path.empty() | ||||||
|                              ? ((start_traversed_in_reverse) |                              ? ((start_traversed_in_reverse) | ||||||
|                                     ? id_vector.size() - |                                     ? id_vector.size() - | ||||||
|                                           phantom_node_pair.source_phantom.fwd_segment_position - 1 |                                           phantom_node_pair.source_phantom.fwd_segment_position - 1 | ||||||
|                                     : phantom_node_pair.source_phantom.fwd_segment_position) |                                     : phantom_node_pair.source_phantom.fwd_segment_position) | ||||||
|                              : 0); |                              : 0); | ||||||
|                     const int end_index = id_vector.size(); |                     const std::size_t end_index = id_vector.size(); | ||||||
| 
 | 
 | ||||||
|                     BOOST_ASSERT(start_index >= 0); |                     BOOST_ASSERT(start_index >= 0); | ||||||
|                     BOOST_ASSERT(start_index <= end_index); |                     BOOST_ASSERT(start_index <= end_index); | ||||||
|                     for (int i = start_index; i < end_index; ++i) |                     for (std::size_t i = start_index; i < end_index; ++i) | ||||||
|                     { |                     { | ||||||
|                         unpacked_path.emplace_back(id_vector[i], name_index, TurnInstruction::NoTurn, 0); |                         unpacked_path.emplace_back(id_vector[i], name_index, TurnInstruction::NoTurn, 0); | ||||||
|                     } |                     } | ||||||
| @ -267,21 +267,11 @@ template <class DataFacadeT> class BasicRoutingInterface | |||||||
|             std::vector<unsigned> id_vector; |             std::vector<unsigned> id_vector; | ||||||
|             facade->GetUncompressedGeometry(phantom_node_pair.target_phantom.packed_geometry_id, |             facade->GetUncompressedGeometry(phantom_node_pair.target_phantom.packed_geometry_id, | ||||||
|                                             id_vector); |                                             id_vector); | ||||||
|             if (target_traversed_in_reverse) |  | ||||||
|             { |  | ||||||
|                 std::reverse(id_vector.begin(), id_vector.end()); |  | ||||||
|             } |  | ||||||
|             const bool is_local_path = (phantom_node_pair.source_phantom.packed_geometry_id == |             const bool is_local_path = (phantom_node_pair.source_phantom.packed_geometry_id == | ||||||
|                                         phantom_node_pair.target_phantom.packed_geometry_id) && |                                         phantom_node_pair.target_phantom.packed_geometry_id) && | ||||||
|                                        unpacked_path.empty(); |                                        unpacked_path.empty(); | ||||||
| 
 | 
 | ||||||
|             int start_index = 0; |             std::size_t start_index = 0; | ||||||
|             int end_index = phantom_node_pair.target_phantom.fwd_segment_position; |  | ||||||
|             if (target_traversed_in_reverse) |  | ||||||
|             { |  | ||||||
|                 end_index = |  | ||||||
|                     id_vector.size() - phantom_node_pair.target_phantom.fwd_segment_position; |  | ||||||
|             } |  | ||||||
|             if (is_local_path) |             if (is_local_path) | ||||||
|             { |             { | ||||||
|                 start_index = phantom_node_pair.source_phantom.fwd_segment_position; |                 start_index = phantom_node_pair.source_phantom.fwd_segment_position; | ||||||
| @ -289,16 +279,26 @@ template <class DataFacadeT> class BasicRoutingInterface | |||||||
|                 { |                 { | ||||||
|                     start_index = |                     start_index = | ||||||
|                         id_vector.size() - phantom_node_pair.source_phantom.fwd_segment_position; |                         id_vector.size() - phantom_node_pair.source_phantom.fwd_segment_position; | ||||||
|                     end_index = |  | ||||||
|                         id_vector.size() - phantom_node_pair.target_phantom.fwd_segment_position; |  | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             BOOST_ASSERT(start_index >= 0); |             std::size_t end_index = phantom_node_pair.target_phantom.fwd_segment_position; | ||||||
|             for (int i = start_index; i != end_index; (start_index < end_index ? ++i : --i)) |             if (target_traversed_in_reverse) | ||||||
|             { |             { | ||||||
|                 BOOST_ASSERT(i >= -1); |                 std::reverse(id_vector.begin(), id_vector.end()); | ||||||
|                 BOOST_ASSERT(i < (int)id_vector.size()); |                 end_index = | ||||||
|  |                     id_vector.size() - phantom_node_pair.target_phantom.fwd_segment_position; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             if (start_index > end_index) | ||||||
|  |             { | ||||||
|  |                 start_index = std::min(start_index, id_vector.size()-1); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             SimpleLogger().Write() << "start_index: " << start_index << ", end_index: " << end_index; | ||||||
|  |             for (std::size_t i = start_index; i != end_index; (start_index < end_index ? ++i : --i)) | ||||||
|  |             { | ||||||
|  |                 BOOST_ASSERT(i < id_vector.size()); | ||||||
|                 unpacked_path.emplace_back(PathData{id_vector[i], |                 unpacked_path.emplace_back(PathData{id_vector[i], | ||||||
|                                            phantom_node_pair.target_phantom.name_id, |                                            phantom_node_pair.target_phantom.name_id, | ||||||
|                                            TurnInstruction::NoTurn, |                                            TurnInstruction::NoTurn, | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user