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