From f3a23a9485371b65c5816b4bddd560d2b3a40501 Mon Sep 17 00:00:00 2001 From: Kezhu Wang Date: Thu, 14 Nov 2013 00:42:55 +0800 Subject: [PATCH 1/5] bugfix: mistake return value from send_buffer same with SOCKET_DATA, when it is propagated to skynet_socket_poll(), may crash the program --- skynet-src/socket_server.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skynet-src/socket_server.c b/skynet-src/socket_server.c index b65b300a..cd50de72 100644 --- a/skynet-src/socket_server.c +++ b/skynet-src/socket_server.c @@ -328,7 +328,7 @@ send_buffer(struct socket_server *ss, struct socket *s, struct socket_message *r case EINTR: continue; case EAGAIN: - return 0; + return -1; } force_close(ss,s, result); return SOCKET_CLOSE; From d5e925688fadc58836d8d1c73ecc663b345e45eb Mon Sep 17 00:00:00 2001 From: Kezhu Wang Date: Thu, 14 Nov 2013 00:54:06 +0800 Subject: [PATCH 2/5] bugfix: missing FREE(buffer) when socket is closing --- skynet-src/socket_server.c | 1 + 1 file changed, 1 insertion(+) diff --git a/skynet-src/socket_server.c b/skynet-src/socket_server.c index cd50de72..3503e0d2 100644 --- a/skynet-src/socket_server.c +++ b/skynet-src/socket_server.c @@ -575,6 +575,7 @@ forward_message(struct socket_server *ss, struct socket *s, struct socket_messag if (s->type == SOCKET_TYPE_HALFCLOSE) { // discard recv data + FREE(buffer); return -1; } From 3e2af60b34ea2e813f57d0dd13f9200ccba28eff Mon Sep 17 00:00:00 2001 From: Kezhu Wang Date: Thu, 14 Nov 2013 01:22:03 +0800 Subject: [PATCH 3/5] bugfix: close pending socket when write_buffer drain --- skynet-src/socket_server.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/skynet-src/socket_server.c b/skynet-src/socket_server.c index 3503e0d2..5c23f9d3 100644 --- a/skynet-src/socket_server.c +++ b/skynet-src/socket_server.c @@ -347,6 +347,11 @@ send_buffer(struct socket_server *ss, struct socket *s, struct socket_message *r s->tail = NULL; sp_write(ss->event_fd, s->fd, s, false); + if (s->type == SOCKET_TYPE_HALFCLOSE) { + force_close(ss, s, result); + return SOCKET_CLOSE; + } + return -1; } From 94c92bf16b32721821050a36cded95876594a356 Mon Sep 17 00:00:00 2001 From: Kezhu Wang Date: Thu, 14 Nov 2013 01:27:10 +0800 Subject: [PATCH 4/5] explict return statement to suppress compiler warning --- lualib-src/lua-bson.c | 1 + 1 file changed, 1 insertion(+) diff --git a/lualib-src/lua-bson.c b/lualib-src/lua-bson.c index f07fb942..9b033587 100644 --- a/lualib-src/lua-bson.c +++ b/lualib-src/lua-bson.c @@ -433,6 +433,7 @@ pack_dict(lua_State *L, struct bson *b, bool isarray) { break; default: luaL_error(L, "Invalid key type : %s", lua_typename(L, kt)); + return; } append_one(b, L, key, sz); From 8c24cd2777b2043ea267b01e24580074b56997fb Mon Sep 17 00:00:00 2001 From: Kezhu Wang Date: Thu, 14 Nov 2013 01:43:31 +0800 Subject: [PATCH 5/5] correct odd format style --- skynet-src/socket_server.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/skynet-src/socket_server.c b/skynet-src/socket_server.c index 5c23f9d3..9615b3d9 100644 --- a/skynet-src/socket_server.c +++ b/skynet-src/socket_server.c @@ -268,7 +268,7 @@ open_socket(struct socket_server *ss, struct request_open * request, struct sock goto _failed; } int sock= -1; - for ( ai_ptr = ai_list; ai_ptr != NULL; ai_ptr = ai_ptr->ai_next ) { + for (ai_ptr = ai_list; ai_ptr != NULL; ai_ptr = ai_ptr->ai_next ) { sock = socket( ai_ptr->ai_family, ai_ptr->ai_socktype, ai_ptr->ai_protocol ); if ( sock < 0 ) { continue; @@ -276,8 +276,8 @@ open_socket(struct socket_server *ss, struct request_open * request, struct sock if (!blocking) { sp_nonblocking(sock); } - status = connect( sock, ai_ptr->ai_addr, ai_ptr->ai_addrlen ); - if ( status != 0 && errno != EINPROGRESS) { + status = connect( sock, ai_ptr->ai_addr, ai_ptr->ai_addrlen); + if ( status != 0 && errno != EINPROGRESS) { close(sock); sock = -1; continue;