Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 9 additions & 5 deletions extensions/geoip/data-pool.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#ifndef _POSIX_C_SOURCE
#define _POSIX_C_SOURCE 200809L
#define _POSIX_C_SOURCE 200809L
#endif

#include "data-pool.h"
Expand Down Expand Up @@ -146,8 +146,8 @@ MMDB_entry_data_list_s *data_pool_to_list(MMDB_data_pool_s *const pool) {

#ifdef TEST_DATA_POOL

#include <libtap/tap.h>
#include <maxminddb_test_helper.h>
#include <libtap/tap.h>
#include <maxminddb_test_helper.h>

static void test_can_multiply(void);

Expand All @@ -158,9 +158,13 @@ int main(void) {
}

static void test_can_multiply(void) {
{ ok(can_multiply(SIZE_MAX, 1, SIZE_MAX), "1*SIZE_MAX is ok"); }
{
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, 2, SIZE_MAX), "2*SIZE_MAX is not ok");
}

{
ok(can_multiply(SIZE_MAX, 10240, sizeof(MMDB_entry_data_list_s)),
Expand Down
41 changes: 25 additions & 16 deletions extensions/geoip/extension.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,44 +55,53 @@ bool GeoIP_Extension::SDK_OnLoad(char *error, size_t maxlength, bool late)
return true;
}

char m_GeoipDir[PLATFORM_MAX_PATH];
char m_GeoipDir[PLATFORM_MAX_PATH], m_GeoipDb[PLATFORM_MAX_PATH];
g_pSM->BuildPath(Path_SM, m_GeoipDir, sizeof(m_GeoipDir), "configs/geoip");

bool hasEntry = false;

time_t modTime = 0;
IDirectory *dir = libsys->OpenDirectory(m_GeoipDir);

if (dir)
{
const char *name;
size_t len;
char database[PLATFORM_MAX_PATH];
time_t mtime;

while (dir->MoreFiles())
{
if (dir->IsEntryFile())
{
const char *name = dir->GetEntryName();
size_t len = strlen(name);
name = dir->GetEntryName();
len = strlen(name);

if (len >= 5 && strcmp(&name[len-5], ".mmdb") == 0)
{
char database[PLATFORM_MAX_PATH];
libsys->PathFormat(database, sizeof(database), "%s/%s", m_GeoipDir, name);

int status = MMDB_open(database, MMDB_MODE_MMAP, &mmdb);

if (status != MMDB_SUCCESS)
if (libsys->FileTime(database, FileTime_LastChange, &mtime) && mtime > modTime)
{
ke::SafeSprintf(error, maxlength, "Failed to open GeoIP2 database %s: %s", database, MMDB_strerror(status));
libsys->CloseDirectory(dir);
return false;
modTime = mtime;
ke::SafeStrcpy(m_GeoipDb, sizeof(m_GeoipDb), database);
}

hasEntry = true;
break;
}
}
dir->NextEntry();
}
libsys->CloseDirectory(dir);
}

if (!hasEntry)
if (m_GeoipDb[0] != '\0')
{
int status = MMDB_open(m_GeoipDb, MMDB_MODE_MMAP, &mmdb);

if (status != MMDB_SUCCESS)
{
ke::SafeSprintf(error, maxlength, "Failed to open GeoIP2 database %s: %s", m_GeoipDb, MMDB_strerror(status));
return false;
}
}
else
{
ke::SafeStrcpy(error, maxlength, "Could not find GeoIP2 database.");
return false;
Expand Down
Loading