diff --git a/skynet-src/skynet_socket.c b/skynet-src/skynet_socket.c index f2dff1cc..3f2c9a04 100644 --- a/skynet-src/skynet_socket.c +++ b/skynet-src/skynet_socket.c @@ -107,7 +107,6 @@ skynet_socket_poll() { static int check_wsz(struct skynet_context *ctx, int id, void *buffer, int64_t wsz) { if (wsz < 0) { - skynet_free(buffer); return -1; } else if (wsz > 1024 * 1024) { int kb4 = wsz / 1024 / 4; diff --git a/skynet-src/socket_server.c b/skynet-src/socket_server.c index eba07624..7c287b90 100644 --- a/skynet-src/socket_server.c +++ b/skynet-src/socket_server.c @@ -1286,11 +1286,19 @@ socket_server_connect(struct socket_server *ss, uintptr_t opaque, const char * a return request.u.open.id; } +static void +free_buffer(struct socket_server *ss, const void * buffer, int sz) { + struct send_object so; + send_object_init(ss, &so, (void *)buffer, sz); + so.free_func((void *)buffer); +} + // return -1 when error int64_t socket_server_send(struct socket_server *ss, int id, const void * buffer, int sz) { struct socket * s = &ss->slot[HASH_ID(id)]; if (s->id != id || s->type == SOCKET_TYPE_INVALID) { + free_buffer(ss, buffer, sz); return -1; } @@ -1307,6 +1315,7 @@ void socket_server_send_lowpriority(struct socket_server *ss, int id, const void * buffer, int sz) { struct socket * s = &ss->slot[HASH_ID(id)]; if (s->id != id || s->type == SOCKET_TYPE_INVALID) { + free_buffer(ss, buffer, sz); return; } @@ -1489,6 +1498,7 @@ int64_t socket_server_udp_send(struct socket_server *ss, int id, const struct socket_udp_address *addr, const void *buffer, int sz) { struct socket * s = &ss->slot[HASH_ID(id)]; if (s->id != id || s->type == SOCKET_TYPE_INVALID) { + free_buffer(ss, buffer, sz); return -1; } @@ -1507,6 +1517,7 @@ socket_server_udp_send(struct socket_server *ss, int id, const struct socket_udp addrsz = 1+2+16; // 1 type, 2 port, 16 ipv6 break; default: + free_buffer(ss, buffer, sz); return -1; }