From 8e7bb2042b560618caf481e280f2d42ff9594f47 Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Tue, 15 Jan 2013 04:24:07 -0800 Subject: [PATCH] ITS#7485 data sizes limited to 32 bits That's all we have space for in a node record. --- libraries/liblmdb/mdb.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/libraries/liblmdb/mdb.c b/libraries/liblmdb/mdb.c index 7cb7dc5..1a443ce 100644 --- a/libraries/liblmdb/mdb.c +++ b/libraries/liblmdb/mdb.c @@ -344,9 +344,9 @@ static txnid_t mdb_debug_start; /** @brief The maximum size of a key in the database. * - * While data items have essentially unbounded size, we require that - * keys all fit onto a regular page. This limit could be raised a bit - * further if needed; to something just under #MDB_PAGESIZE / #MDB_MINKEYS. + * We require that keys all fit onto a regular page. This limit + * could be raised a bit further if needed; to something just + * under #MDB_PAGESIZE / #MDB_MINKEYS. * * Note that data items in an #MDB_DUPSORT database are actually keys * of a subDB, so they're also limited to this size. @@ -355,6 +355,12 @@ static txnid_t mdb_debug_start; #define MDB_MAXKEYSIZE 511 #endif + /** @brief The maximum size of a data item. + * + * We only store a 32 bit value for node sizes. + */ +#define MAXDATASIZE 0xffffffffUL + #if MDB_DEBUG /** A key buffer. * @ingroup debug @@ -4812,6 +4818,11 @@ mdb_cursor_put(MDB_cursor *mc, MDB_val *key, MDB_val *data, if (F_ISSET(mc->mc_db->md_flags, MDB_DUPSORT) && data->mv_size > MDB_MAXKEYSIZE) return EINVAL; +#if SIZE_MAX > MAXDATASIZE + if (data->mv_size > MAXDATASIZE) + return EINVAL; +#endif + DPRINTF("==> put db %u key [%s], size %zu, data size %zu", mc->mc_dbi, DKEY(key), key ? key->mv_size:0, data->mv_size);