Update libmaxminddb to v1.3.2 (#526)
* Update libmaxminddb to v1.3.2 * Move PACKAGE_VERSION declaration
This commit is contained in:
		
							
								
								
									
										180
									
								
								third_party/libmaxminddb/data-pool.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										180
									
								
								third_party/libmaxminddb/data-pool.c
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,180 @@
 | 
			
		||||
#include "data-pool.h"
 | 
			
		||||
#include "maxminddb.h"
 | 
			
		||||
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <stddef.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
 | 
			
		||||
static bool can_multiply(size_t const, size_t const, size_t const);
 | 
			
		||||
 | 
			
		||||
// Allocate an MMDB_data_pool_s. It initially has space for size
 | 
			
		||||
// MMDB_entry_data_list_s structs.
 | 
			
		||||
MMDB_data_pool_s *data_pool_new(size_t const size)
 | 
			
		||||
{
 | 
			
		||||
    MMDB_data_pool_s *const pool = calloc(1, sizeof(MMDB_data_pool_s));
 | 
			
		||||
    if (!pool) {
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (size == 0 ||
 | 
			
		||||
        !can_multiply(SIZE_MAX, size, sizeof(MMDB_entry_data_list_s))) {
 | 
			
		||||
        data_pool_destroy(pool);
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
    pool->size = size;
 | 
			
		||||
    pool->blocks[0] = calloc(pool->size, sizeof(MMDB_entry_data_list_s));
 | 
			
		||||
    if (!pool->blocks[0]) {
 | 
			
		||||
        data_pool_destroy(pool);
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
    pool->blocks[0]->pool = pool;
 | 
			
		||||
 | 
			
		||||
    pool->sizes[0] = size;
 | 
			
		||||
 | 
			
		||||
    pool->block = pool->blocks[0];
 | 
			
		||||
 | 
			
		||||
    return pool;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Determine if we can multiply m*n. We can do this if the result will be below
 | 
			
		||||
// the given max. max will typically be SIZE_MAX.
 | 
			
		||||
//
 | 
			
		||||
// We want to know if we'll wrap around.
 | 
			
		||||
static bool can_multiply(size_t const max, size_t const m, size_t const n)
 | 
			
		||||
{
 | 
			
		||||
    if (m == 0) {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return n <= max / m;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Clean up the data pool.
 | 
			
		||||
void data_pool_destroy(MMDB_data_pool_s *const pool)
 | 
			
		||||
{
 | 
			
		||||
    if (!pool) {
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (size_t i = 0; i <= pool->index; i++) {
 | 
			
		||||
        free(pool->blocks[i]);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    free(pool);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Claim a new struct from the pool. Doing this may cause the pool's size to
 | 
			
		||||
// grow.
 | 
			
		||||
MMDB_entry_data_list_s *data_pool_alloc(MMDB_data_pool_s *const pool)
 | 
			
		||||
{
 | 
			
		||||
    if (!pool) {
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (pool->used < pool->size) {
 | 
			
		||||
        MMDB_entry_data_list_s *const element = pool->block + pool->used;
 | 
			
		||||
        pool->used++;
 | 
			
		||||
        return element;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Take it from a new block of memory.
 | 
			
		||||
 | 
			
		||||
    size_t const new_index = pool->index + 1;
 | 
			
		||||
    if (new_index == DATA_POOL_NUM_BLOCKS) {
 | 
			
		||||
        // See the comment about not growing this on DATA_POOL_NUM_BLOCKS.
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!can_multiply(SIZE_MAX, pool->size, 2)) {
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
    size_t const new_size = pool->size * 2;
 | 
			
		||||
 | 
			
		||||
    if (!can_multiply(SIZE_MAX, new_size, sizeof(MMDB_entry_data_list_s))) {
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
    pool->blocks[new_index] = calloc(new_size, sizeof(MMDB_entry_data_list_s));
 | 
			
		||||
    if (!pool->blocks[new_index]) {
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // We don't need to set this, but it's useful for introspection in tests.
 | 
			
		||||
    pool->blocks[new_index]->pool = pool;
 | 
			
		||||
 | 
			
		||||
    pool->index = new_index;
 | 
			
		||||
    pool->block = pool->blocks[pool->index];
 | 
			
		||||
 | 
			
		||||
    pool->size = new_size;
 | 
			
		||||
    pool->sizes[pool->index] = pool->size;
 | 
			
		||||
 | 
			
		||||
    MMDB_entry_data_list_s *const element = pool->block;
 | 
			
		||||
    pool->used = 1;
 | 
			
		||||
    return element;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Turn the structs in the array-like pool into a linked list.
 | 
			
		||||
//
 | 
			
		||||
// Before calling this function, the list isn't linked up.
 | 
			
		||||
MMDB_entry_data_list_s *data_pool_to_list(MMDB_data_pool_s *const pool)
 | 
			
		||||
{
 | 
			
		||||
    if (!pool) {
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (pool->index == 0 && pool->used == 0) {
 | 
			
		||||
        return NULL;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    for (size_t i = 0; i <= pool->index; i++) {
 | 
			
		||||
        MMDB_entry_data_list_s *const block = pool->blocks[i];
 | 
			
		||||
 | 
			
		||||
        size_t size = pool->sizes[i];
 | 
			
		||||
        if (i == pool->index) {
 | 
			
		||||
            size = pool->used;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        for (size_t j = 0; j < size - 1; j++) {
 | 
			
		||||
            MMDB_entry_data_list_s *const cur = block + j;
 | 
			
		||||
            cur->next = block + j + 1;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (i < pool->index) {
 | 
			
		||||
            MMDB_entry_data_list_s *const last = block + size - 1;
 | 
			
		||||
            last->next = pool->blocks[i + 1];
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return pool->blocks[0];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#ifdef TEST_DATA_POOL
 | 
			
		||||
 | 
			
		||||
#include <libtap/tap.h>
 | 
			
		||||
#include <maxminddb_test_helper.h>
 | 
			
		||||
 | 
			
		||||
static void test_can_multiply(void);
 | 
			
		||||
 | 
			
		||||
int main(void)
 | 
			
		||||
{
 | 
			
		||||
    plan(NO_PLAN);
 | 
			
		||||
    test_can_multiply();
 | 
			
		||||
    done_testing();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void test_can_multiply(void)
 | 
			
		||||
{
 | 
			
		||||
    {
 | 
			
		||||
        ok(can_multiply(SIZE_MAX, 1, SIZE_MAX), "1*SIZE_MAX is ok");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
        ok(!can_multiply(SIZE_MAX, 2, SIZE_MAX), "2*SIZE_MAX is not ok");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    {
 | 
			
		||||
        ok(can_multiply(SIZE_MAX, 10240, sizeof(MMDB_entry_data_list_s)),
 | 
			
		||||
           "1024 entry_data_list_s's are okay");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										52
									
								
								third_party/libmaxminddb/data-pool.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								third_party/libmaxminddb/data-pool.h
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,52 @@
 | 
			
		||||
#ifndef DATA_POOL_H
 | 
			
		||||
#define DATA_POOL_H
 | 
			
		||||
 | 
			
		||||
#include "maxminddb.h"
 | 
			
		||||
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
#include <stddef.h>
 | 
			
		||||
 | 
			
		||||
// This should be large enough that we never need to grow the array of pointers
 | 
			
		||||
// to blocks. 32 is enough. Even starting out of with size 1 (1 struct), the
 | 
			
		||||
// 32nd element alone will provide 2**32 structs as we exponentially increase
 | 
			
		||||
// the number in each block. Being confident that we do not have to grow the
 | 
			
		||||
// array lets us avoid writing code to do that. That code would be risky as it
 | 
			
		||||
// would rarely be hit and likely not be well tested.
 | 
			
		||||
#define DATA_POOL_NUM_BLOCKS 32
 | 
			
		||||
 | 
			
		||||
// A pool of memory for MMDB_entry_data_list_s structs. This is so we can
 | 
			
		||||
// allocate multiple up front rather than one at a time for performance
 | 
			
		||||
// reasons.
 | 
			
		||||
//
 | 
			
		||||
// The order you add elements to it (by calling data_pool_alloc()) ends up as
 | 
			
		||||
// the order of the list.
 | 
			
		||||
//
 | 
			
		||||
// The memory only grows. There is no support for releasing an element you take
 | 
			
		||||
// back to the pool.
 | 
			
		||||
typedef struct MMDB_data_pool_s {
 | 
			
		||||
    // Index of the current block we're allocating out of.
 | 
			
		||||
    size_t index;
 | 
			
		||||
 | 
			
		||||
    // The size of the current block, counting by structs.
 | 
			
		||||
    size_t size;
 | 
			
		||||
 | 
			
		||||
    // How many used in the current block, counting by structs.
 | 
			
		||||
    size_t used;
 | 
			
		||||
 | 
			
		||||
    // The current block we're allocating out of.
 | 
			
		||||
    MMDB_entry_data_list_s *block;
 | 
			
		||||
 | 
			
		||||
    // The size of each block.
 | 
			
		||||
    size_t sizes[DATA_POOL_NUM_BLOCKS];
 | 
			
		||||
 | 
			
		||||
    // An array of pointers to blocks of memory holding space for list
 | 
			
		||||
    // elements.
 | 
			
		||||
    MMDB_entry_data_list_s *blocks[DATA_POOL_NUM_BLOCKS];
 | 
			
		||||
} MMDB_data_pool_s;
 | 
			
		||||
 | 
			
		||||
MMDB_data_pool_s *data_pool_new(size_t const);
 | 
			
		||||
void data_pool_destroy(MMDB_data_pool_s *const);
 | 
			
		||||
MMDB_entry_data_list_s *data_pool_alloc(MMDB_data_pool_s *const);
 | 
			
		||||
MMDB_entry_data_list_s *data_pool_to_list(MMDB_data_pool_s *const);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										757
									
								
								third_party/libmaxminddb/maxminddb.c
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										757
									
								
								third_party/libmaxminddb/maxminddb.c
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										28
									
								
								third_party/libmaxminddb/maxminddb.h
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										28
									
								
								third_party/libmaxminddb/maxminddb.h
									
									
									
									
										vendored
									
									
								
							@@ -5,10 +5,21 @@ extern "C" {
 | 
			
		||||
#ifndef MAXMINDDB_H
 | 
			
		||||
#define MAXMINDDB_H
 | 
			
		||||
 | 
			
		||||
/* Request POSIX.1-2008. However, we want to remain compatible with
 | 
			
		||||
 * POSIX.1-2001 (since we have been historically and see no reason to drop
 | 
			
		||||
 * compatibility). By requesting POSIX.1-2008, we can conditionally use
 | 
			
		||||
 * features provided by that standard if the implementation provides it. We can
 | 
			
		||||
 * check for what the implementation provides by checking the _POSIX_VERSION
 | 
			
		||||
 * macro after including unistd.h. If a feature is in POSIX.1-2008 but not
 | 
			
		||||
 * POSIX.1-2001, check that macro before using the feature (or check for the
 | 
			
		||||
 * feature directly if possible). */
 | 
			
		||||
#ifndef _POSIX_C_SOURCE
 | 
			
		||||
#define _POSIX_C_SOURCE 200112L
 | 
			
		||||
#define _POSIX_C_SOURCE 200809L
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* libmaxminddb package version from configure */
 | 
			
		||||
#define PACKAGE_VERSION "1.3.2"
 | 
			
		||||
 | 
			
		||||
#include "maxminddb_config.h"
 | 
			
		||||
#include <stdarg.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
@@ -24,7 +35,7 @@ typedef ADDRESS_FAMILY sa_family_t;
 | 
			
		||||
 | 
			
		||||
#if defined(_MSC_VER)
 | 
			
		||||
/* MSVC doesn't define signed size_t, copy it from configure */
 | 
			
		||||
#define ssize_t int
 | 
			
		||||
#define ssize_t SSIZE_T
 | 
			
		||||
 | 
			
		||||
/* MSVC doesn't support restricted pointers */
 | 
			
		||||
#define restrict
 | 
			
		||||
@@ -35,9 +46,6 @@ typedef ADDRESS_FAMILY sa_family_t;
 | 
			
		||||
#include <sys/socket.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* libmaxminddb package version from configure */
 | 
			
		||||
#define PACKAGE_VERSION "1.1.0"
 | 
			
		||||
 | 
			
		||||
#define MMDB_DATA_TYPE_EXTENDED (0)
 | 
			
		||||
#define MMDB_DATA_TYPE_POINTER (1)
 | 
			
		||||
#define MMDB_DATA_TYPE_UTF8_STRING (2)
 | 
			
		||||
@@ -55,6 +63,11 @@ typedef ADDRESS_FAMILY sa_family_t;
 | 
			
		||||
#define MMDB_DATA_TYPE_BOOLEAN (14)
 | 
			
		||||
#define MMDB_DATA_TYPE_FLOAT (15)
 | 
			
		||||
 | 
			
		||||
#define MMDB_RECORD_TYPE_SEARCH_NODE (0)
 | 
			
		||||
#define MMDB_RECORD_TYPE_EMPTY (1)
 | 
			
		||||
#define MMDB_RECORD_TYPE_DATA (2)
 | 
			
		||||
#define MMDB_RECORD_TYPE_INVALID (3)
 | 
			
		||||
 | 
			
		||||
/* flags for open */
 | 
			
		||||
#define MMDB_MODE_MMAP (1)
 | 
			
		||||
#define MMDB_MODE_MASK (7)
 | 
			
		||||
@@ -131,6 +144,7 @@ typedef struct MMDB_entry_data_s {
 | 
			
		||||
typedef struct MMDB_entry_data_list_s {
 | 
			
		||||
    MMDB_entry_data_s entry_data;
 | 
			
		||||
    struct MMDB_entry_data_list_s *next;
 | 
			
		||||
    void *pool;
 | 
			
		||||
} MMDB_entry_data_list_s;
 | 
			
		||||
 | 
			
		||||
typedef struct MMDB_description_s {
 | 
			
		||||
@@ -179,6 +193,10 @@ typedef struct MMDB_s {
 | 
			
		||||
typedef struct MMDB_search_node_s {
 | 
			
		||||
    uint64_t left_record;
 | 
			
		||||
    uint64_t right_record;
 | 
			
		||||
    uint8_t left_record_type;
 | 
			
		||||
    uint8_t right_record_type;
 | 
			
		||||
    MMDB_entry_s left_record_entry;
 | 
			
		||||
    MMDB_entry_s right_record_entry;
 | 
			
		||||
} MMDB_search_node_s;
 | 
			
		||||
 | 
			
		||||
    /* *INDENT-OFF* */
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user