bugfix: don't call skynet_free directly when send failed

This commit is contained in:
Cloud Wu
2015-06-16 10:56:28 +08:00
parent 039235b3a3
commit 7fa1d548ed
2 changed files with 11 additions and 1 deletions

View File

@@ -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;

View File

@@ -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;
} }