summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Orton <jorton@redhat.com>2021-09-20 10:42:21 +0100
committerJoe Orton <jorton@redhat.com>2021-09-20 10:42:21 +0100
commit1e1d56aa8d4f67754188a00d11078f148df5e9cd (patch)
treef24de28f6983a41a9f4c53545eea6a3ffd20cf1d
parent61cffebfa56391647aa59dd31996dc3664703700 (diff)
downloadneon-git-1e1d56aa8d4f67754188a00d11078f148df5e9cd.tar.gz
* src/ne_socket.c (ne_sock_close): Skip calling shutdown for a
newly-opened socket. * test/socket.c (open_close): Test closing a newly-opened socket object.
-rw-r--r--src/ne_socket.c13
-rw-r--r--test/socket.c9
2 files changed, 16 insertions, 6 deletions
diff --git a/src/ne_socket.c b/src/ne_socket.c
index 0492431..a86e41a 100644
--- a/src/ne_socket.c
+++ b/src/ne_socket.c
@@ -2087,7 +2087,12 @@ int ne_sock_shutdown(ne_socket *sock, unsigned int flags)
int ne_sock_close(ne_socket *sock)
{
- int ret = ne_sock_shutdown(sock, NE_SOCK_SEND);
+ int ret;
+
+ if (sock->fd != -1) {
+ /* Ignore errors. */
+ (void) ne_sock_shutdown(sock, NE_SOCK_SEND);
+ }
#if defined(HAVE_OPENSSL)
if (sock->ssl) {
@@ -2099,11 +2104,7 @@ int ne_sock_close(ne_socket *sock)
}
#endif
- if (sock->fd < 0)
- ret = 0;
- else
- ret = ne_close(sock->fd);
- sock->fd = -1;
+ ret = sock->fd < 0 ? 0 : ne_close(sock->fd);
ne_free(sock);
return ret;
diff --git a/test/socket.c b/test/socket.c
index fe842d6..8ec63b1 100644
--- a/test/socket.c
+++ b/test/socket.c
@@ -538,6 +538,14 @@ static int read_close(void)
return await_server();
}
+/* Test that just does an open then a close. */
+static int open_close(void)
+{
+ ONN("close of newly opened socket failed", ne_sock_close(ne_sock_create()));
+
+ return OK;
+}
+
/* Test that just does a connect then a close (but gets the close via
* ne_sock_peek). */
static int peek_close(void)
@@ -1570,6 +1578,7 @@ ne_test tests[] = {
T(addr_canonical),
T(read_close),
T(peek_close),
+ T(open_close),
T(single_read),
T(single_peek),
T(small_reads),