From cc05f46fb7e5365cbc2fb154c6648d4d8d762fd6 Mon Sep 17 00:00:00 2001 From: Eric Fischer Date: Mon, 27 Jul 2015 16:20:20 -0700 Subject: [PATCH] Don't crash if there are more than 128 layers --- geojson.c | 2 +- pool.c | 9 +++++++++ tile.cc | 8 ++++---- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/geojson.c b/geojson.c index 0793df0..46132ff 100644 --- a/geojson.c +++ b/geojson.c @@ -653,7 +653,7 @@ int read_json(int argc, char **argv, char *fname, const char *layername, int max long long geomstart = geompos; serialize_byte(geomfile, mb_geometry[t], &geompos, fname); - serialize_byte(geomfile, n, &geompos, fname); + serialize_long_long(geomfile, n, &geompos, fname); serialize_long_long(geomfile, metastart, &geompos, fname); long long wx = initial_x, wy = initial_y; parse_geometry(t, coordinates, bbox, &geompos, geomfile, VT_MOVETO, fname, jp, &wx, &wy, &initialized); diff --git a/pool.c b/pool.c index e874d23..74dd536 100644 --- a/pool.c +++ b/pool.c @@ -1,3 +1,4 @@ +#include #include #include #include "pool.h" @@ -34,6 +35,10 @@ struct pool_val *pool(struct pool *p, char *s, int type) { } *v = malloc(sizeof(struct pool_val)); + if (*v == NULL) { + fprintf(stderr, "out of memory making string pool\n"); + exit(EXIT_FAILURE); + } (*v)->left = NULL; (*v)->right = NULL; (*v)->next = NULL; @@ -104,6 +109,10 @@ void pool_free_strings(struct pool *p) { void pool_init(struct pool *p, int n) { p->n = n; p->vals = calloc(POOL_WIDTH, sizeof(struct pool_val *)); + if (p->vals == NULL) { + fprintf(stderr, "out of memory creating string pool\n"); + exit(EXIT_FAILURE); + } p->head = NULL; p->tail = NULL; } diff --git a/tile.cc b/tile.cc index f99cacc..0fba44f 100644 --- a/tile.cc +++ b/tile.cc @@ -362,7 +362,7 @@ void evaluate(std::vector &features, char *metabase, struct pool *file } #endif -void rewrite(drawvec &geom, int z, int nextzoom, int file_maxzoom, long long *bbox, unsigned tx, unsigned ty, int buffer, int line_detail, int *within, long long *geompos, FILE **geomfile, const char *fname, signed char t, signed char layer, long long metastart, signed char feature_minzoom) { +void rewrite(drawvec &geom, int z, int nextzoom, int file_maxzoom, long long *bbox, unsigned tx, unsigned ty, int buffer, int line_detail, int *within, long long *geompos, FILE **geomfile, const char *fname, signed char t, int layer, long long metastart, signed char feature_minzoom) { if (geom.size() > 0 && nextzoom <= file_maxzoom) { int xo, yo; int span = 1 << (nextzoom - z); @@ -428,7 +428,7 @@ void rewrite(drawvec &geom, int z, int nextzoom, int file_maxzoom, long long *bb // printf("type %d, meta %lld\n", t, metastart); serialize_byte(geomfile[j], t, &geompos[j], fname); - serialize_byte(geomfile[j], layer, &geompos[j], fname); + serialize_long_long(geomfile[j], layer, &geompos[j], fname); serialize_long_long(geomfile[j], metastart, &geompos[j], fname); long long wx = initial_x, wy = initial_y; @@ -518,8 +518,8 @@ long long write_tile(char **geoms, char *metabase, char *stringpool, unsigned *f break; } - signed char layer; - deserialize_byte(geoms, &layer); + long long layer; + deserialize_long_long(geoms, &layer); long long metastart; deserialize_long_long(geoms, &metastart);