branch: externals/pq commit d738d21b6aba4b447d2dada4999fe8031a377295 Author: Andreas Seltenreich <seltenre...@gmx.de> Commit: Andreas Seltenreich <seltenre...@gmx.de>
Add checks for non-local exit. Check for non-local-exit after every env->get_user_ptr(). Most functions happened to DTRT without this check by accident because they used connection_ok on the NULL pointer returned and bailed out. Fpq_escape was not that lucky when invoked with bogus arguments and crashed. Per report from @717g301github. --- pq.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/pq.c b/pq.c index af967812f5..a7faf37845 100644 --- a/pq.c +++ b/pq.c @@ -161,6 +161,9 @@ Fpq_query (emacs_env *env, ptrdiff_t nargs, emacs_value args[], void *data) return Qnil; PGconn *conn = env->get_user_ptr(env, args[0]); + if (env->non_local_exit_check (env) != emacs_funcall_exit_return) + return NULL; + if (!connection_ok(env, conn)) { return Qnil; } @@ -237,6 +240,9 @@ Fpq_escape (emacs_env *env, ptrdiff_t nargs, emacs_value args[], void *data) return Qnil; PGconn *conn = env->get_user_ptr(env, args[0]); + if (env->non_local_exit_check (env) != emacs_funcall_exit_return) + return NULL; + char *value = my_string_to_c(env, args[1]); char *(*escaper)(PGconn *, const char *, size_t) = data; char *quoted = escaper(conn, value, strlen(value)); @@ -252,6 +258,9 @@ Fpq_reset (emacs_env *env, ptrdiff_t nargs, emacs_value args[], void *data) return Qnil; PGconn *conn = env->get_user_ptr(env, args[0]); + if (env->non_local_exit_check (env) != emacs_funcall_exit_return) + return NULL; + PQreset(conn); if (!connection_ok(env, conn)) {