From ee103e97cdda1eb35639ae6510afe7e327f5089c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B6=B5=E6=9B=A6?= Date: Wed, 13 Apr 2022 22:36:47 +0800 Subject: [PATCH] Fix handle register when slot[0] is null will segmentation fault (#1574) --- examples/config.handle | 10 ++++++++++ skynet-src/skynet_handle.c | 8 +++++--- test/testhandle.lua | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 examples/config.handle create mode 100644 test/testhandle.lua diff --git a/examples/config.handle b/examples/config.handle new file mode 100644 index 00000000..da1fe91f --- /dev/null +++ b/examples/config.handle @@ -0,0 +1,10 @@ +include "config.path" + +thread = 8 +logger = "skynet.log" +logpath = "." +harbor = 0 +start = "testhandle" -- main script +bootstrap = "snlua bootstrap" -- The service for bootstrap +cpath = root.."cservice/?.so" +--daemon = "./skynet.pid" diff --git a/skynet-src/skynet_handle.c b/skynet-src/skynet_handle.c index f20324ee..249748a2 100644 --- a/skynet-src/skynet_handle.c +++ b/skynet-src/skynet_handle.c @@ -60,9 +60,11 @@ skynet_handle_register(struct skynet_context *ctx) { struct skynet_context ** new_slot = skynet_malloc(s->slot_size * 2 * sizeof(struct skynet_context *)); memset(new_slot, 0, s->slot_size * 2 * sizeof(struct skynet_context *)); for (i=0;islot_size;i++) { - int hash = skynet_context_handle(s->slot[i]) & (s->slot_size * 2 - 1); - assert(new_slot[hash] == NULL); - new_slot[hash] = s->slot[i]; + if (s->slot[i]) { + int hash = skynet_context_handle(s->slot[i]) & (s->slot_size * 2 - 1); + assert(new_slot[hash] == NULL); + new_slot[hash] = s->slot[i]; + } } skynet_free(s->slot); s->slot = new_slot; diff --git a/test/testhandle.lua b/test/testhandle.lua new file mode 100644 index 00000000..bcef897c --- /dev/null +++ b/test/testhandle.lua @@ -0,0 +1,33 @@ +local skynet = require "skynet" +require "skynet.manager" + +local mod = ... +if mod == "slave" then + +skynet.start(function() + skynet.error("addr:", skynet.self()) +end) + +else + +skynet.start(function() + skynet.newservice("debug_console",8000) + skynet.error("master addr:", skynet.self()) + + skynet.newservice("testhandle", "slave") + skynet.newservice("testhandle", "slave") + skynet.newservice("testhandle", "slave") + skynet.newservice("testhandle", "slave") + skynet.newservice("testhandle", "slave") + skynet.newservice("testhandle", "slave") + + while true do + local addr = skynet.newservice("testhandle", "slave") + skynet.kill(addr) + if addr > 0xfffff0 then + break + end + end +end) + +end