diff --git a/lib/mbtiles.js b/lib/mbtiles.js index f8a50ee..09806e4 100644 --- a/lib/mbtiles.js +++ b/lib/mbtiles.js @@ -154,6 +154,10 @@ MBTiles.prototype.getTile = function(z, x, y, callback) { return callback(new Error('Tile does not exist')); } else if (err) { return callback(err); + } else if (!row.tile_data || !Buffer.isBuffer(row.tile_data)) { + var err = new Error('Tile is invalid'); + err.code = 'EINVALIDTILE'; + return callback(err); } else { var headers = tiletype.headers(row.tile_data); headers['Last-Modified'] = new Date(mbtiles._stat.mtime).toUTCString(); diff --git a/test/fixtures/corrupt_null_tile.mbtiles b/test/fixtures/corrupt_null_tile.mbtiles new file mode 100644 index 0000000..e3b489a Binary files /dev/null and b/test/fixtures/corrupt_null_tile.mbtiles differ diff --git a/test/read.test.js b/test/read.test.js index 41cfd43..68924fd 100644 --- a/test/read.test.js +++ b/test/read.test.js @@ -10,7 +10,8 @@ var fixtures = { plain_3: __dirname + '/fixtures/plain_3.mbtiles', plain_4: __dirname + '/fixtures/plain_4.mbtiles', non_existent: __dirname + '/fixtures/non_existent.mbtiles', - corrupt: __dirname + '/fixtures/corrupt.mbtiles' + corrupt: __dirname + '/fixtures/corrupt.mbtiles', + corrupt_null_tile: __dirname + '/fixtures/corrupt_null_tile.mbtiles' }; function yieldsError(assert, error, msg, callback) { @@ -140,3 +141,6 @@ fs.readdirSync(__dirname + '/fixtures/grids/').forEach(function(file) { }); }); +tape('corrupt null tile', function(assert) { + loaded.corrupt_null_tile.getTile(1, 0, 1, yieldsError(assert, 'error', 'Tile is invalid', assert.end)); +});