From 7469a29899e4155c8a515cbfb8992c89b6184848 Mon Sep 17 00:00:00 2001 From: Erica Fischer Date: Wed, 20 Nov 2024 15:34:19 -0800 Subject: [PATCH] Raise tippecanoe-decode tile size limit to 250 MB --- decode.cpp | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) 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"); }