mirror of
https://github.com/cloudwu/skynet.git
synced 2026-07-24 20:23:06 +00:00
bugfix: don't call skynet_free directly when send failed
This commit is contained in:
@@ -107,7 +107,6 @@ skynet_socket_poll() {
|
|||||||
static int
|
static int
|
||||||
check_wsz(struct skynet_context *ctx, int id, void *buffer, int64_t wsz) {
|
check_wsz(struct skynet_context *ctx, int id, void *buffer, int64_t wsz) {
|
||||||
if (wsz < 0) {
|
if (wsz < 0) {
|
||||||
skynet_free(buffer);
|
|
||||||
return -1;
|
return -1;
|
||||||
} else if (wsz > 1024 * 1024) {
|
} else if (wsz > 1024 * 1024) {
|
||||||
int kb4 = wsz / 1024 / 4;
|
int kb4 = wsz / 1024 / 4;
|
||||||
|
|||||||
@@ -1286,11 +1286,19 @@ socket_server_connect(struct socket_server *ss, uintptr_t opaque, const char * a
|
|||||||
return request.u.open.id;
|
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
|
// return -1 when error
|
||||||
int64_t
|
int64_t
|
||||||
socket_server_send(struct socket_server *ss, int id, const void * buffer, int sz) {
|
socket_server_send(struct socket_server *ss, int id, const void * buffer, int sz) {
|
||||||
struct socket * s = &ss->slot[HASH_ID(id)];
|
struct socket * s = &ss->slot[HASH_ID(id)];
|
||||||
if (s->id != id || s->type == SOCKET_TYPE_INVALID) {
|
if (s->id != id || s->type == SOCKET_TYPE_INVALID) {
|
||||||
|
free_buffer(ss, buffer, sz);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1307,6 +1315,7 @@ void
|
|||||||
socket_server_send_lowpriority(struct socket_server *ss, int id, const void * buffer, int sz) {
|
socket_server_send_lowpriority(struct socket_server *ss, int id, const void * buffer, int sz) {
|
||||||
struct socket * s = &ss->slot[HASH_ID(id)];
|
struct socket * s = &ss->slot[HASH_ID(id)];
|
||||||
if (s->id != id || s->type == SOCKET_TYPE_INVALID) {
|
if (s->id != id || s->type == SOCKET_TYPE_INVALID) {
|
||||||
|
free_buffer(ss, buffer, sz);
|
||||||
return;
|
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) {
|
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)];
|
struct socket * s = &ss->slot[HASH_ID(id)];
|
||||||
if (s->id != id || s->type == SOCKET_TYPE_INVALID) {
|
if (s->id != id || s->type == SOCKET_TYPE_INVALID) {
|
||||||
|
free_buffer(ss, buffer, sz);
|
||||||
return -1;
|
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
|
addrsz = 1+2+16; // 1 type, 2 port, 16 ipv6
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
free_buffer(ss, buffer, sz);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user