Index: uspace/app/websrv/websrv.c
===================================================================
--- uspace/app/websrv/websrv.c	(revision e1c6dde97b6781766a18cd5629671d9ae931bf7b)
+++ uspace/app/websrv/websrv.c	(revision 415578efaeae3972e3a51adcbf758079cb47d945)
@@ -304,4 +304,5 @@
 		if (rc != EOK) {
 			printf("Error closing connection socket: %d\n", rc);
+			closesocket(listen_sd);
 			return 1;
 		}
Index: uspace/srv/net/tl/tcp/sock.c
===================================================================
--- uspace/srv/net/tl/tcp/sock.c	(revision e1c6dde97b6781766a18cd5629671d9ae931bf7b)
+++ uspace/srv/net/tl/tcp/sock.c	(revision 415578efaeae3972e3a51adcbf758079cb47d945)
@@ -603,17 +603,20 @@
 
 	socket = (tcp_sockdata_t *)sock_core->specific_data;
-	rc = tcp_uc_close(socket->conn);
-	if (rc != EOK) {
-		async_answer_0(callid, rc);
-		return;
-	}
-
-	/* Drain incoming data. This should really be done in the background. */
-	do {
-		trc = tcp_uc_receive(socket->conn, buffer, FRAGMENT_SIZE,
-		    &data_len, &xflags);
-	} while (trc == TCP_EOK);
-
-	tcp_uc_delete(socket->conn);
+
+	if (socket->conn != NULL) {
+		rc = tcp_uc_close(socket->conn);
+		if (rc != EOK) {
+			async_answer_0(callid, rc);
+			return;
+		}
+
+		/* Drain incoming data. This should really be done in the background. */
+		do {
+			trc = tcp_uc_receive(socket->conn, buffer,
+			    FRAGMENT_SIZE, &data_len, &xflags);
+		} while (trc == TCP_EOK);
+
+		tcp_uc_delete(socket->conn);
+	}
 
 	rc = socket_destroy(net_sess, socket_id, &client->sockets, &gsock,
