diff --git a/CHANGELOG.md b/CHANGELOG.md index 8713a49f..ae134e42 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +# 2.70.1 + +* Raise tippecanoe-decode limit on the size of individual tiles + # 2.70.0 * Performance improvements to tippecanoe-overzoom with attribute exclusion diff --git a/decode.cpp b/decode.cpp index c19e1e59..534e6219 100644 --- a/decode.cpp +++ b/decode.cpp @@ -247,23 +247,26 @@ void decode(char *fname, int z, unsigned x, unsigned y, std::set co if (fd >= 0) { struct stat st; if (fstat(fd, &st) == 0) { - if (st.st_size < 50 * 1024 * 1024) { - char *map = (char *) mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0); - if (map != NULL && map != MAP_FAILED) { - if (strcmp(map, "SQLite format 3") != 0 && strncmp(map, "PMTiles", 7) != 0) { - if (z >= 0) { + char *map = (char *) mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0); + if (map != NULL && map != MAP_FAILED) { + if (strcmp(map, "SQLite format 3") != 0 && strncmp(map, "PMTiles", 7) != 0) { + if (z >= 0) { + if (st.st_size > 250 * 1024 * 1024) { + fprintf(stderr, "%s: unrealistically large single-tile size %zu\n", fname, (size_t) st.st_size); + exit(EXIT_MEMORY); + } else { std::string s = std::string(map, st.st_size); handle(s, z, x, y, to_decode, pipeline, stats, state, coordinate_mode); munmap(map, st.st_size); return; - } else { - fprintf(stderr, "Must specify zoom/x/y to decode a single pbf file\n"); - exit(EXIT_ARGS); } + } else { + fprintf(stderr, "Must specify zoom/x/y to decode a single pbf file\n"); + exit(EXIT_ARGS); } } - munmap(map, st.st_size); } + munmap(map, st.st_size); } else { perror("fstat"); } diff --git a/version.hpp b/version.hpp index f9ffe4ac..320fd50a 100644 --- a/version.hpp +++ b/version.hpp @@ -1,6 +1,6 @@ #ifndef VERSION_HPP #define VERSION_HPP -#define VERSION "v2.70.0" +#define VERSION "v2.70.1" #endif