From 113d623957f0c9378d2f40b88ff3d1235f633902 Mon Sep 17 00:00:00 2001
From: Andy Green <andy@warmcat.com>
Date: Sat, 3 Feb 2018 13:48:18 +0800
Subject: [PATCH] internal close api: add caller id

---
 lib/client/client-handshake.c |  2 +-
 lib/client/client.c           |  8 ++++----
 lib/context.c                 |  8 +++++---
 lib/event-libs/libuv.c        |  2 +-
 lib/handshake.c               | 10 +++++-----
 lib/http2/http2.c             |  6 +++---
 lib/libwebsockets.c           | 10 +++++-----
 lib/private-libwebsockets.h   |  2 +-
 lib/server/cgi.c              |  2 +-
 lib/server/server.c           |  6 +++---
 lib/service.c                 | 16 ++++++++--------
 11 files changed, 37 insertions(+), 35 deletions(-)

diff --git a/lib/client/client-handshake.c b/lib/client/client-handshake.c
index c2873a90..28d74dd3 100644
--- a/lib/client/client-handshake.c
+++ b/lib/client/client-handshake.c
@@ -434,7 +434,7 @@ failed:
 		wsi->user_space, (void *)cce, strlen(cce));
 	wsi->already_did_cce = 1;
 failed1:
-	lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS);
+	lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS, "client_connect2");
 
 	return NULL;
 }
diff --git a/lib/client/client.c b/lib/client/client.c
index 5217cca8..a4eb7a6e 100644
--- a/lib/client/client.c
+++ b/lib/client/client.c
@@ -310,7 +310,7 @@ start_ws_handshake:
 				return 0;
 
 			lwsl_err("Failed to generate handshake for client\n");
-			lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS);
+			lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS, "chs");
 			return 0;
 		}
 
@@ -323,7 +323,7 @@ start_ws_handshake:
 		switch (n) {
 		case LWS_SSL_CAPABLE_ERROR:
 			lwsl_debug("ERROR writing to client socket\n");
-			lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS);
+			lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS, "cws");
 			return 0;
 		case LWS_SSL_CAPABLE_MORE_SERVICE:
 			lws_callback_on_writable(wsi);
@@ -434,7 +434,7 @@ bail3:
 			LWS_CALLBACK_CLIENT_CONNECTION_ERROR,
 			wsi->user_space, (void *)cce, cce ? strlen(cce) : 0);
 		wsi->already_did_cce = 1;
-		lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS);
+		lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS, "cbail3");
 		return -1;
 
 	case LWSCM_WSCL_WAITING_EXTENSION_CONNECT:
@@ -1140,7 +1140,7 @@ bail2:
 	lwsl_info("closing connection due to bail2 connection error\n");
 
 	/* closing will free up his parsing allocations */
-	lws_close_free_wsi(wsi, close_reason);
+	lws_close_free_wsi(wsi, close_reason, "c hs interp");
 
 	return 1;
 }
diff --git a/lib/context.c b/lib/context.c
index 67636c34..f0cb8bab 100644
--- a/lib/context.c
+++ b/lib/context.c
@@ -1364,7 +1364,7 @@ lws_context_deprecate(struct lws_context *context, lws_reload_func cb)
 		wsi = vh->lserv_wsi;
 		if (wsi) {
 			wsi->socket_is_permanently_unusable = 1;
-			lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS);
+			lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS, "ctx deprecate");
 			wsi->context->deprecation_pending_listen_close_count++;
 			/*
 			 * other vhosts can share the listen port, they
@@ -1462,7 +1462,8 @@ lws_vhost_destroy1(struct lws_vhost *vh)
 				continue;
 
 			lws_close_free_wsi(wsi,
-				LWS_CLOSE_STATUS_NOSTATUS_CONTEXT_DESTROY
+				LWS_CLOSE_STATUS_NOSTATUS_CONTEXT_DESTROY,
+				"vh destroy"
 				/* no protocol close */);
 			n--;
 		}
@@ -1696,7 +1697,8 @@ lws_context_destroy(struct lws_context *context)
 				lws_destroy_event_pipe(wsi);
 			else
 				lws_close_free_wsi(wsi,
-					LWS_CLOSE_STATUS_NOSTATUS_CONTEXT_DESTROY
+					LWS_CLOSE_STATUS_NOSTATUS_CONTEXT_DESTROY,
+					"ctx destroy"
 					/* no protocol close */);
 			n--;
 		}
diff --git a/lib/event-libs/libuv.c b/lib/event-libs/libuv.c
index abacb16c..47c3615e 100644
--- a/lib/event-libs/libuv.c
+++ b/lib/event-libs/libuv.c
@@ -461,7 +461,7 @@ lws_libuv_stop(struct lws_context *context)
 			if (!wsi)
 				continue;
 			lws_close_free_wsi(wsi,
-				LWS_CLOSE_STATUS_NOSTATUS_CONTEXT_DESTROY
+				LWS_CLOSE_STATUS_NOSTATUS_CONTEXT_DESTROY, __func__
 				/* no protocol close */);
 			n--;
 		}
diff --git a/lib/handshake.c b/lib/handshake.c
index 1ea51563..d18aa180 100644
--- a/lib/handshake.c
+++ b/lib/handshake.c
@@ -127,7 +127,7 @@ lws_read(struct lws *wsi, unsigned char *buf, lws_filepos_t len)
 			buf += body_chunk_len;
 			len -= body_chunk_len;
 		}
-		lwsl_debug("%s: used up block\n", __func__);
+//		lwsl_debug("%s: used up block\n", __func__);
 		break;
 #endif
 
@@ -170,7 +170,7 @@ lws_read(struct lws *wsi, unsigned char *buf, lws_filepos_t len)
 		 * appropriately:
 		 */
 		len -= (buf - last_char);
-		lwsl_debug("%s: thinks we have used %ld\n", __func__, (long)len);
+//		lwsl_debug("%s: thinks we have used %ld\n", __func__, (long)len);
 
 		if (!wsi->hdr_parsing_completed)
 			/* More header content on the way */
@@ -303,8 +303,8 @@ postbody_completion:
 
 read_ok:
 	/* Nothing more to do for now */
-	lwsl_info("%s: %p: read_ok, used %ld (len %d, state %d)\n", __func__,
-		  wsi, (long)(buf - oldbuf), (int)len, wsi->state);
+//	lwsl_info("%s: %p: read_ok, used %ld (len %d, state %d)\n", __func__,
+//		  wsi, (long)(buf - oldbuf), (int)len, wsi->state);
 
 	return lws_ptr_diff(buf, oldbuf);
 
@@ -315,7 +315,7 @@ bail:
 	 * the wsi close.
 	 */
 	if (!wsi->outer_will_close)
-		lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS);
+		lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS, "lws_read bail");
 
 	return -1;
 }
diff --git a/lib/http2/http2.c b/lib/http2/http2.c
index f3728245..520c01b2 100644
--- a/lib/http2/http2.c
+++ b/lib/http2/http2.c
@@ -655,11 +655,11 @@ int lws_h2_do_pps_send(struct lws *wsi)
 		}
 		cwsi = lws_h2_wsi_from_id(wsi, pps->u.rs.sid);
 		if (cwsi)
-			lws_close_free_wsi(cwsi, 0);
+			lws_close_free_wsi(cwsi, 0, "reset stream");
 		break;
 
 	case LWS_H2_PPS_UPDATE_WINDOW:
-		lwsl_notice("LWS_H2_PPS_UPDATE_WINDOW: sid %d: add %d\n",
+		lwsl_notice("Issuing LWS_H2_PPS_UPDATE_WINDOW: sid %d: add %d\n",
 			    pps->u.update_window.sid,
 			    pps->u.update_window.credit);
 		*p++ = pps->u.update_window.credit >> 24;
@@ -992,7 +992,7 @@ lws_h2_parse_frame_header(struct lws *wsi)
 		lws_start_foreach_ll(struct lws *, w, wsi->h2.child_list) {
 			if (w->h2.my_sid < h2n->sid &&
 			    w->h2.h2_state == LWS_H2_STATE_IDLE)
-				lws_close_free_wsi(w, 0);
+				lws_close_free_wsi(w, 0, "h2 sid close");
 		} lws_end_foreach_ll(w, h2.sibling_list);
 
 
diff --git a/lib/libwebsockets.c b/lib/libwebsockets.c
index bba1182a..e8114f90 100644
--- a/lib/libwebsockets.c
+++ b/lib/libwebsockets.c
@@ -215,7 +215,7 @@ lws_set_timeout(struct lws *wsi, enum pending_timeout reason, int secs)
 	if (secs == LWS_TO_KILL_SYNC) {
 		lws_remove_from_timeout_list(wsi);
 		lwsl_debug("synchronously killing %p\n", wsi);
-		lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS);
+		lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS, "to sync kill");
 		return;
 	}
 
@@ -357,7 +357,7 @@ lws_bind_protocol(struct lws *wsi, const struct lws_protocols *p)
 }
 
 void
-lws_close_free_wsi(struct lws *wsi, enum lws_close_status reason)
+lws_close_free_wsi(struct lws *wsi, enum lws_close_status reason, const char *caller)
 {
 	struct lws_context_per_thread *pt;
 	struct lws *wsi1, *wsi2;
@@ -365,7 +365,7 @@ lws_close_free_wsi(struct lws *wsi, enum lws_close_status reason)
 	struct lws_tokens eff_buf;
 	int n, m, ret;
 
-	lwsl_debug("%s: %p\n", __func__, wsi);
+	lwsl_debug("%s: %p: caller: %s\n", __func__, wsi, caller);
 
 	if (!wsi)
 		return;
@@ -387,7 +387,7 @@ lws_close_free_wsi(struct lws *wsi, enum lws_close_status reason)
 			wsi2->parent = NULL;
 			/* stop it doing shutdown processing */
 			wsi2->socket_is_permanently_unusable = 1;
-			lws_close_free_wsi(wsi2, reason);
+			lws_close_free_wsi(wsi2, reason, "general child recurse");
 			wsi2 = wsi1;
 		}
 		wsi->child_list = NULL;
@@ -421,7 +421,7 @@ lws_close_free_wsi(struct lws *wsi, enum lws_close_status reason)
 				wsi2 = (*w)->h2.sibling_list;
 				(*w)->h2.sibling_list = NULL;
 				(*w)->socket_is_permanently_unusable = 1;
-				lws_close_free_wsi(*w, reason);
+				lws_close_free_wsi(*w, reason, "h2 child recurse");
 				*w = wsi2;
 				continue;
 			} lws_end_foreach_llp(w, h2.sibling_list);
diff --git a/lib/private-libwebsockets.h b/lib/private-libwebsockets.h
index e25b8c87..b74004e1 100644
--- a/lib/private-libwebsockets.h
+++ b/lib/private-libwebsockets.h
@@ -2016,7 +2016,7 @@ lws_get_addr_scope(const char *ipaddr);
 #endif
 
 LWS_EXTERN void
-lws_close_free_wsi(struct lws *wsi, enum lws_close_status);
+lws_close_free_wsi(struct lws *wsi, enum lws_close_status, const char *caller);
 
 LWS_EXTERN void
 lws_free_wsi(struct lws *wsi);
diff --git a/lib/server/cgi.c b/lib/server/cgi.c
index 06802eb2..4ae67023 100644
--- a/lib/server/cgi.c
+++ b/lib/server/cgi.c
@@ -943,7 +943,7 @@ handled:
 						(void *)&args, wsi->cgi->pid);
 		wsi->cgi->pid = -1;
 		if (n && !wsi->cgi->being_closed)
-			lws_close_free_wsi(wsi, 0);
+			lws_close_free_wsi(wsi, 0, "lws_cgi_kill");
 	}
 
 	return 0;
diff --git a/lib/server/server.c b/lib/server/server.c
index aa76e171..48f5a2ad 100644
--- a/lib/server/server.c
+++ b/lib/server/server.c
@@ -2124,7 +2124,7 @@ lws_adopt_descriptor_vhost(struct lws_vhost *vh, lws_adoption_type type,
 
 fail:
 	if (type & LWS_ADOPT_SOCKET)
-		lws_close_free_wsi(new_wsi, LWS_CLOSE_STATUS_NOSTATUS);
+		lws_close_free_wsi(new_wsi, LWS_CLOSE_STATUS_NOSTATUS, "adopt skt fail");
 
 	return NULL;
 
@@ -2227,7 +2227,7 @@ adopt_socket_readbuf(struct lws *wsi, const char *readbuf, size_t len)
 	return wsi;
 
 bail:
-	lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS);
+	lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS, "adopt skt readbuf fail");
 
 	return NULL;
 }
@@ -2700,7 +2700,7 @@ try_pollout:
 		return 0;
 
 fail:
-	lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS);
+	lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS, "server socket svc fail");
 
 	return 1;
 }
diff --git a/lib/service.c b/lib/service.c
index 31f439e7..817afbb7 100644
--- a/lib/service.c
+++ b/lib/service.c
@@ -463,7 +463,7 @@ user_service_go_again:
 				         strlen(w->h2.pending_status_body +
 					 LWS_PRE), LWS_WRITE_HTTP_FINAL);
 			lws_free_set_NULL(w->h2.pending_status_body);
-			lws_close_free_wsi(w, LWS_CLOSE_STATUS_NOSTATUS);
+			lws_close_free_wsi(w, LWS_CLOSE_STATUS_NOSTATUS, "h2 end stream 1");
 			wa = &wsi->h2.child_list;
 			goto next_child;
 		}
@@ -493,7 +493,7 @@ user_service_go_again:
 			 */
 			if (n || w->h2.send_END_STREAM) {
 				lwsl_info("closing stream after h2 action\n");
-				lws_close_free_wsi(w, LWS_CLOSE_STATUS_NOSTATUS);
+				lws_close_free_wsi(w, LWS_CLOSE_STATUS_NOSTATUS, "h2 end stream");
 				wa = &wsi->h2.child_list;
 			}
 
@@ -519,7 +519,7 @@ user_service_go_again:
 			 */
 			if (n < 0 || w->h2.send_END_STREAM) {
 				lwsl_debug("Closing POLLOUT child %p\n", w);
-				lws_close_free_wsi(w, LWS_CLOSE_STATUS_NOSTATUS);
+				lws_close_free_wsi(w, LWS_CLOSE_STATUS_NOSTATUS, "h2 end stream file");
 				wa = &wsi->h2.child_list;
 				goto next_child;
 			}
@@ -536,7 +536,7 @@ user_service_go_again:
 
 		if (lws_calllback_as_writeable(w) || w->h2.send_END_STREAM) {
 			lwsl_debug("Closing POLLOUT child\n");
-			lws_close_free_wsi(w, LWS_CLOSE_STATUS_NOSTATUS);
+			lws_close_free_wsi(w, LWS_CLOSE_STATUS_NOSTATUS, "h2 pollout handle");
 			wa = &wsi->h2.child_list;
 		}
 
@@ -627,7 +627,7 @@ lws_service_timeout_check(struct lws *wsi, time_t sec)
 		if (wsi->protocol &&
 		    wsi->protocol->callback(wsi, LWS_CALLBACK_TIMER,
 					    wsi->user_space, NULL, 0)) {
-			lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS);
+			lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS, "timer cb errored");
 
 					return 1;
 		}
@@ -682,7 +682,7 @@ lws_service_timeout_check(struct lws *wsi, time_t sec)
 				wsi->user_space,
 				(void *)"Timed out waiting SSL", 21);
 
-		lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS);
+		lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS, "timeout");
 
 		return 1;
 	}
@@ -1206,7 +1206,7 @@ lws_service_fd_tsi(struct lws_context *context, struct lws_pollfd *pollfd,
 				/* it was the guy we came to service! */
 				timed_out = 1;
 
-			lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS);
+			lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS, "excessive ah");
 
 			ah = pt->ah_list;
 		}
@@ -1838,7 +1838,7 @@ drain:
 
 close_and_handled:
 	lwsl_debug("%p: Close and handled\n", wsi);
-	lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS);
+	lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS, "close_and_handled");
 	/*
 	 * pollfd may point to something else after the close
 	 * due to pollfd swapping scheme on delete on some platforms
-- 
GitLab