fixed a potential issue by shared data access in mod-hawk.c

This commit is contained in:
hyung-hwan 2020-12-28 17:23:33 +00:00
parent 80f9d6bc85
commit dd2d3d4ccd
6 changed files with 35 additions and 11 deletions

View File

@ -1,7 +1,7 @@
/* /*
* $Id$ * $Id$
* *
Copyright (c) 2014-2019 Chung, Hyung-Hwan. All rights reserved. Copyright (c) 2006-2020 Chung, Hyung-Hwan. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions modification, are permitted provided that the following conditions

View File

@ -1,7 +1,7 @@
/* /*
* $Id$ * $Id$
* *
Copyright (c) 2014-2019 Chung, Hyung-Hwan. All rights reserved. Copyright (c) 2006-2020 Chung, Hyung-Hwan. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions modification, are permitted provided that the following conditions

View File

@ -1,7 +1,7 @@
/* /*
* $Id$ * $Id$
* *
Copyright (c) 2014-2019 Chung, Hyung-Hwan. All rights reserved. Copyright (c) 2006-2020 Chung, Hyung-Hwan. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions modification, are permitted provided that the following conditions

View File

@ -1,7 +1,7 @@
/* /*
* $Id$ * $Id$
* *
Copyright (c) 2014-2019 Chung, Hyung-Hwan. All rights reserved. Copyright (c) 2006-2020 Chung, Hyung-Hwan. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions modification, are permitted provided that the following conditions

View File

@ -26,7 +26,14 @@
#include "mod-hawk.h" #include "mod-hawk.h"
#include "hawk-prv.h" #include "hawk-prv.h"
#include <hawk-mtx.h>
struct mod_data_t
{
hawk_mtx_t mq_mtx;
};
typedef struct mod_data_t mod_data_t;
/* ----------------------------------------------------------------- */ /* ----------------------------------------------------------------- */
/* /*
@ -150,7 +157,14 @@ static int fnc_function_exists (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
if (!rx) if (!rx)
{ {
hawk_mod_sym_t sym; hawk_mod_sym_t sym;
mod_data_t* md;
md = (mod_data_t*)fi->mod->ctx;
/* hawk_query_module_with_name() may update some shared data under
* the hawk object. use a mutex for shared data safety */
hawk_mtx_lock (&md->mq_mtx, HAWK_NULL);
rx = (hawk_query_module_with_name(hawk_rtx_gethawk(rtx), &name, &sym) != HAWK_NULL); rx = (hawk_query_module_with_name(hawk_rtx_gethawk(rtx), &name, &sym) != HAWK_NULL);
hawk_mtx_unlock (&md->mq_mtx);
} }
} }
hawk_rtx_freevaloocstr (rtx, a0, name.ptr); hawk_rtx_freevaloocstr (rtx, a0, name.ptr);
@ -449,17 +463,27 @@ static void fini (hawk_mod_t* mod, hawk_rtx_t* rtx)
static void unload (hawk_mod_t* mod, hawk_t* hawk) static void unload (hawk_mod_t* mod, hawk_t* hawk)
{ {
/* nothing to do */ mod_data_t* md = (mod_data_t*)mod->ctx;
hawk_mtx_fini (&md->mq_mtx);
hawk_freemem (hawk, md);
} }
int hawk_mod_hawk (hawk_mod_t* mod, hawk_t* hawk) int hawk_mod_hawk (hawk_mod_t* mod, hawk_t* hawk)
{ {
mod_data_t* md;
md = hawk_allocmem(hawk, HAWK_SIZEOF(*md));
if (HAWK_UNLIKELY(!md)) return -1;
hawk_mtx_init (&md->mq_mtx, hawk_getgem(hawk));
mod->query = query; mod->query = query;
mod->unload = unload; mod->unload = unload;
mod->init = init; mod->init = init;
mod->fini = fini; mod->fini = fini;
mod->ctx = HAWK_NULL; mod->ctx = md;
return 0; return 0;
} }

View File

@ -363,7 +363,7 @@ void* hawk_stdmodopen (hawk_t* hawk, const hawk_mod_spec_t* spec)
else else
{ {
void* h; void* h;
h = lt_dlopen(NULL); h = lt_dlopen(HAWK_NULL);
if (HAWK_UNLIKELY(!h)) hawk_seterrfmt (hawk, HAWK_NULL, HAWK_ESYSERR, HAWK_T("%hs"), lt_dlerror()); if (HAWK_UNLIKELY(!h)) hawk_seterrfmt (hawk, HAWK_NULL, HAWK_ESYSERR, HAWK_T("%hs"), lt_dlerror());
return h; return h;
} }
@ -409,7 +409,7 @@ void* hawk_stdmodopen (hawk_t* hawk, const hawk_mod_spec_t* spec)
else else
{ {
HMODULE h; HMODULE h;
h = GetModuleHandle(NULL); h = GetModuleHandle(HAWK_NULL);
if (!h) hawk_seterrnum (hawk, HAWK_NULL, hawk_syserr_to_errnum(GetLastError()); if (!h) hawk_seterrnum (hawk, HAWK_NULL, hawk_syserr_to_errnum(GetLastError());
return h; return h;
} }
@ -512,7 +512,7 @@ void* hawk_stdmodopen (hawk_t* hawk, const hawk_mod_spec_t* spec)
else else
{ {
void* h; void* h;
h = GetModuleHandle(NULL); h = GetModuleHandle(HAWK_NULL);
if (!h) hawk_seterrnum (hawk, HAWK_NULL, HAWK_ESYSERR); if (!h) hawk_seterrnum (hawk, HAWK_NULL, HAWK_ESYSERR);
return h; return h;
} }
@ -572,11 +572,11 @@ void hawk_stdmodclose (hawk_t* hawk, void* handle)
#if defined(USE_LTDL) #if defined(USE_LTDL)
lt_dlclose (handle); lt_dlclose (handle);
#elif defined(_WIN32) #elif defined(_WIN32)
if (handle != GetModuleHandle(NULL)) FreeLibrary ((HMODULE)handle); if (handle != GetModuleHandle(HAWK_NULL)) FreeLibrary ((HMODULE)handle);
#elif defined(__OS2__) #elif defined(__OS2__)
DosFreeModule ((HMODULE)handle); DosFreeModule ((HMODULE)handle);
#elif defined(__DOS__) && defined(HAWK_ENABLE_DOS_DYNAMIC_MODULE) #elif defined(__DOS__) && defined(HAWK_ENABLE_DOS_DYNAMIC_MODULE)
if (handle != GetModuleHandle(NULL)) FreeModule (handle); if (handle != GetModuleHandle(HAWK_NULL)) FreeModule (handle);
#elif defined(USE_DLFCN) #elif defined(USE_DLFCN)
dlclose (handle); dlclose (handle);
#else #else