Fixing an invalid read when contracting rather small graphs. Partially

fixes issue #218
This commit is contained in:
DennisOSRM 2012-05-03 23:11:52 +02:00
parent 765b1cb3a5
commit 819c1729f1

View File

@ -426,31 +426,30 @@ public:
template< class Edge > template< class Edge >
void GetEdges( std::vector< Edge >& edges ) { void GetEdges( std::vector< Edge >& edges ) {
NodeID numberOfNodes = _graph->GetNumberOfNodes(); NodeID numberOfNodes = _graph->GetNumberOfNodes();
for ( NodeID node = 0; node < numberOfNodes; ++node ) { if(oldNodeIDFromNewNodeIDMap.size()) {
for ( _DynamicGraph::EdgeIterator edge = _graph->BeginEdges( node ), endEdges = _graph->EndEdges( node ); edge < endEdges; edge++ ) { for ( NodeID node = 0; node < numberOfNodes; ++node ) {
const NodeID target = _graph->GetTarget( edge ); for ( _DynamicGraph::EdgeIterator edge = _graph->BeginEdges( node ), endEdges = _graph->EndEdges( node ); edge < endEdges; edge++ ) {
const _DynamicGraph::EdgeData& data = _graph->GetEdgeData( edge ); const NodeID target = _graph->GetTarget( edge );
Edge newEdge; const _DynamicGraph::EdgeData& data = _graph->GetEdgeData( edge );
newEdge.source = oldNodeIDFromNewNodeIDMap[node]; Edge newEdge;
newEdge.target = oldNodeIDFromNewNodeIDMap[target]; newEdge.source = oldNodeIDFromNewNodeIDMap[node];
newEdge.target = oldNodeIDFromNewNodeIDMap[target];
assert(UINT_MAX != newEdge.source);
assert(UINT_MAX != newEdge.target);
assert(UINT_MAX != newEdge.source); newEdge.data.distance = data.distance;
assert(UINT_MAX != newEdge.target); newEdge.data.shortcut = data.shortcut;
if(!data.originalViaNodeID)
newEdge.data.id = oldNodeIDFromNewNodeIDMap[data.id];
else
newEdge.data.id = data.id;
newEdge.data.distance = data.distance; assert(newEdge.data.id != UINT_MAX);
newEdge.data.shortcut = data.shortcut; newEdge.data.forward = data.forward;
if(!data.originalViaNodeID) newEdge.data.backward = data.backward;
newEdge.data.id = oldNodeIDFromNewNodeIDMap[data.id]; edges.push_back( newEdge );
else }
newEdge.data.id = data.id; }
assert(newEdge.data.id != UINT_MAX);
// newEdge.data.nameID = data.nameID;
// newEdge.data.turnInstruction = data.turnInstruction;
newEdge.data.forward = data.forward;
newEdge.data.backward = data.backward;
edges.push_back( newEdge );
}
} }
std::ifstream temporaryEdgeStorage(temporaryEdgeStorageFilename.c_str(), std::ios::binary); std::ifstream temporaryEdgeStorage(temporaryEdgeStorageFilename.c_str(), std::ios::binary);
//Also get the edges from temporary storage //Also get the edges from temporary storage
@ -461,20 +460,18 @@ public:
NodeID target; NodeID target;
_DynamicGraph::EdgeData data; _DynamicGraph::EdgeData data;
for(unsigned i = 0; i < numberOfTemporaryEdges; ++i) { for(unsigned i = 0; i < numberOfTemporaryEdges; ++i) {
temporaryEdgeStorage.read((char*)&start, sizeof(NodeID)); temporaryEdgeStorage.read((char*)&start, sizeof(NodeID));
temporaryEdgeStorage.read((char*)&target, sizeof(NodeID)); temporaryEdgeStorage.read((char*)&target, sizeof(NodeID));
temporaryEdgeStorage.read((char*)&data, sizeof(_DynamicGraph::EdgeData)); temporaryEdgeStorage.read((char*)&data, sizeof(_DynamicGraph::EdgeData));
Edge newEdge; Edge newEdge;
newEdge.source = start; newEdge.source = start;
newEdge.target = target; newEdge.target = target;
newEdge.data.distance = data.distance; newEdge.data.distance = data.distance;
newEdge.data.shortcut = data.shortcut; newEdge.data.shortcut = data.shortcut;
newEdge.data.id = data.id; newEdge.data.id = data.id;
// newEdge.data.nameID = data.nameID; newEdge.data.forward = data.forward;
// newEdge.data.turnInstruction = data.turnInstruction; newEdge.data.backward = data.backward;
newEdge.data.forward = data.forward; edges.push_back( newEdge );
newEdge.data.backward = data.backward;
edges.push_back( newEdge );
} }
temporaryEdgeStorage.close(); temporaryEdgeStorage.close();
} }