From 287ee6e49ad636f6536fcc0c5d9d0b14e41f68cb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Deuc=D0=B5?= <shurd@sasktel.net>
Date: Thu, 8 Apr 2021 02:11:35 -0400
Subject: [PATCH] When a callback event is handled, get remote_addr

Prevents weird issues with getting remote address.
---
 src/sbbs3/js_internal.c | 8 ++++++++
 src/sbbs3/js_socket.c   | 4 ++++
 2 files changed, 12 insertions(+)

diff --git a/src/sbbs3/js_internal.c b/src/sbbs3/js_internal.c
index 3581220987..a2275766d3 100644
--- a/src/sbbs3/js_internal.c
+++ b/src/sbbs3/js_internal.c
@@ -1120,6 +1120,8 @@ js_handle_events(JSContext *cx, js_callback_t *cb, volatile int *terminated)
 	jsrefcount rc;
 	JSBool ret = JS_TRUE;
 	BOOL input_locked = FALSE;
+	js_socket_private_t*	jssp;
+	socklen_t slen;
 #ifdef PREFER_POLL
 	struct pollfd *fds;
 	nfds_t sc;
@@ -1372,6 +1374,12 @@ js_handle_events(JSContext *cx, js_callback_t *cb, volatile int *terminated)
 				if (input_locked)
 					js_do_lock_input(cx, FALSE);
 			}
+			if (ev->type == JS_EVENT_SOCKET_CONNECT) {
+				if ((jssp = (js_socket_private_t*)JS_GetPrivate(cx, ev->cx)) != NULL) {
+					slen=sizeof(ev->data.connect.sock);
+					getpeername(ev->data.connect.sock, &jssp->remote_addr.addr, &slen);
+				}
+			}
 
 			ret = JS_CallFunction(cx, ev->cx, ev->cb, 0, NULL, &rval);
 
diff --git a/src/sbbs3/js_socket.c b/src/sbbs3/js_socket.c
index 53430b9c81..011bb8d6a4 100644
--- a/src/sbbs3/js_socket.c
+++ b/src/sbbs3/js_socket.c
@@ -2091,6 +2091,10 @@ js_install_event(JSContext *cx, uintN argc, jsval *arglist, BOOL once)
 		return(JS_FALSE);
 	}
 
+	/*
+	 * NOTE: If you allow a thisObj here, you'll need to deal with js_GetClassPrivate
+	 *       in js_internal.c where the object is assumed to be a socket.
+	 */
 	if (argc != 2) {
 		JS_ReportError(cx, "js.on() and js.once() require exactly two parameters");
 		return JS_FALSE;
-- 
GitLab