fixed a potential issue by shared data access in mod-hawk.c
This commit is contained in:
parent
80f9d6bc85
commit
dd2d3d4ccd
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user