Skip to content

Commit 090c082

Browse files
authored
prevent Valkey crash when module is loaded twice (#415)
* prevent Valkey crash when module is loaded twice Signed-off-by: Dmitry Polyakovsky <[email protected]> * added utils::verifyLoadedOnlyOnce, calling it from VALKEY_MODULE Signed-off-by: Dmitry Polyakovsky <[email protected]> * format verifyLoadedOnlyOnce Signed-off-by: Dmitry Polyakovsky <[email protected]> --------- Signed-off-by: Dmitry Polyakovsky <[email protected]>
1 parent f998b79 commit 090c082

File tree

3 files changed

+12
-0
lines changed

3 files changed

+12
-0
lines changed

vmsdk/src/module.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@
2323
extern "C" { \
2424
int ValkeyModule_OnLoad(ValkeyModuleCtx *ctx, ValkeyModuleString **argv, \
2525
int argc) { \
26+
if (!vmsdk::verifyLoadedOnlyOnce()) { \
27+
VMSDK_LOG(NOTICE, ctx) << "Module cannot be loaded more than once"; \
28+
return VALKEYMODULE_ERR; \
29+
} \
2630
vmsdk::TrackCurrentAsMainThread(); \
2731
if (auto status = vmsdk::module::OnLoad(ctx, argv, argc, options); \
2832
status != VALKEYMODULE_OK) { \

vmsdk/src/utils.cc

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,13 @@ int StopTimerFromBackgroundThread(
5353
});
5454
}
5555

56+
bool verifyLoadedOnlyOnce() {
57+
static bool prev_loaded = false;
58+
if (prev_loaded) return false;
59+
prev_loaded = true;
60+
return true;
61+
}
62+
5663
void TrackCurrentAsMainThread() {
5764
CHECK(!set_main_thread);
5865
is_main_thread = true;

vmsdk/src/utils.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ int StopTimerFromBackgroundThread(
4747
ValkeyModuleCtx *ctx, ValkeyModuleTimerID timer_id,
4848
absl::AnyInvocable<void(void *)> user_data_deleter);
4949

50+
bool verifyLoadedOnlyOnce();
5051
void TrackCurrentAsMainThread();
5152
bool IsMainThread();
5253
inline void VerifyMainThread() { CHECK(IsMainThread()); }

0 commit comments

Comments
 (0)