diff --git a/src/sbbs3/js_sprintf.c b/src/sbbs3/js_sprintf.c
index 784284d19d174b9117f36a932874f893b0110142..864a703e39475c864dcb8fb3ca503b5ad66322d4 100644
--- a/src/sbbs3/js_sprintf.c
+++ b/src/sbbs3/js_sprintf.c
@@ -65,3 +65,9 @@ js_sprintf(JSContext *cx, uint argn, uintN argc, jsval *argv)
 	return xp_asprintf_end(p);
 
 }
+
+void DLLCALL
+js_sprintf_free(char* p)
+{
+	xp_asprintf_free(p);
+}
diff --git a/src/sbbs3/jsexec.c b/src/sbbs3/jsexec.c
index 91c2d73abcf3b53ec3f7c5f345baa4095e079bf4..929779e93d362c99e8fd1db386b7d594c436986c 100644
--- a/src/sbbs3/jsexec.c
+++ b/src/sbbs3/jsexec.c
@@ -357,7 +357,7 @@ js_printf(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
 
 	*rval = STRING_TO_JSVAL(JS_NewStringCopyZ(cx, p));
 
-	free(p);
+	js_sprintf_free(p);
 
     return(JS_TRUE);
 }
diff --git a/src/sbbs3/sbbs.h b/src/sbbs3/sbbs.h
index e40c2c5ac60c4d3058369f41336dd1ea2a71b06c..b81e86d6914bf81ccd25276de72dcb5eefeeb685 100644
--- a/src/sbbs3/sbbs.h
+++ b/src/sbbs3/sbbs.h
@@ -1025,6 +1025,7 @@ extern "C" {
 
 	/* js_sprintf.c */
 	DLLEXPORT char*		DLLCALL js_sprintf(JSContext* cx, uint argn, uintN argc, jsval *argv);
+	DLLEXPORT void		DLLCALL js_sprintf_free(char *);
 
 	/* js_console.cpp */
 	JSObject* js_CreateConsoleObject(JSContext* cx, JSObject* parent);