Fix bounds check on dense nodes (#301)

pull/299/head
Michael Barry 2022-07-20 07:44:15 -04:00 zatwierdzone przez GitHub
rodzic c6ad30cc9a
commit 0e6394036c
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 4AEE18F83AFDEB23
3 zmienionych plików z 50 dodań i 5 usunięć

Wyświetl plik

@ -297,11 +297,11 @@ public class PbfDecoder implements Iterable<OsmElement> {
int version = 0;
if (denseInfo != null) {
version = denseInfo.getVersion(i);
timestamp += denseInfo.getTimestamp(i);
changeset += denseInfo.getChangeset(i);
uid += denseInfo.getUid(i);
userSid += denseInfo.getUserSid(i);
version = denseInfo.getVersionCount() > i ? denseInfo.getVersion(i) : 0;
timestamp += denseInfo.getTimestampCount() > i ? denseInfo.getTimestamp(i) : 0;
changeset += denseInfo.getChangesetCount() > i ? denseInfo.getChangeset(i) : 0;
uid += denseInfo.getUidCount() > i ? denseInfo.getUid(i) : 0;
userSid += denseInfo.getUserSidCount() > i ? denseInfo.getUserSid(i) : 0;
}
i++;

Wyświetl plik

@ -121,4 +121,49 @@ class OsmInputFileTest {
}
}
}
@ParameterizedTest
@ValueSource(booleans = {false, true})
@Timeout(30)
void testReadMonacoWithoutChangesetsTwice(boolean lazy) {
for (int i = 1; i <= 2; i++) {
AtomicInteger nodes = new AtomicInteger(0);
AtomicInteger ways = new AtomicInteger(0);
AtomicInteger rels = new AtomicInteger(0);
AtomicReference<OsmElement.Node> node = new AtomicReference<>();
AtomicReference<OsmElement.Way> way = new AtomicReference<>();
AtomicReference<OsmElement.Relation> rel = new AtomicReference<>();
var file = new OsmInputFile(TestUtils.pathToResource("monaco-latest-without-changesets.osm.pbf"), lazy);
try (var osmReader = file.get()) {
WorkerPipeline.start("test", Stats.inMemory())
.fromGenerator("pbf", osmReader::forEachBlock)
.addBuffer("pbf_blocks", 100)
.sinkToConsumer("counter", 1, block -> {
for (var elem : block.decodeElements()) {
if (elem instanceof OsmElement.Node n) {
if (n.id() == expectedNode.id()) {
node.set(n);
}
nodes.incrementAndGet();
} else if (elem instanceof OsmElement.Way w) {
if (w.id() == expectedWay.id()) {
way.set(w);
}
ways.incrementAndGet();
} else if (elem instanceof OsmElement.Relation r) {
if (r.id() == expectedRel.id()) {
rel.set(r);
}
rels.incrementAndGet();
}
}
}).await();
assertEquals(27_135, nodes.get(), "nodes pass " + i);
assertEquals(4_295, ways.get(), "ways pass " + i);
assertEquals(255, rels.get(), "rels pass " + i);
assertEquals(new OsmElement.Info(0, 1647347498, 0, 8, ""), node.get().info());
}
}
}
}