Skip to content

Commit 492aef7

Browse files
committed
Fix unfree memory issue
1 parent 1e64d49 commit 492aef7

File tree

1 file changed

+15
-7
lines changed

1 file changed

+15
-7
lines changed

sqlite3-core.c

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,9 @@ Fsqlite3_execute(emacs_env *env, ptrdiff_t nargs, emacs_value args[], void *data
255255
sqlite3 *sdb = env->get_user_ptr(env, args[0]);
256256
ptrdiff_t size;
257257
char *query = retrieve_string(env, args[1], &size);
258+
emacs_value Qnil = env->intern(env, "nil");
259+
emacs_value retval = Qnil;
260+
const char *errmsg = NULL;
258261

259262
sqlite3_stmt *stmt = NULL;
260263
int ret = sqlite3_prepare_v2(sdb, query, size, &stmt, NULL);
@@ -263,12 +266,11 @@ Fsqlite3_execute(emacs_env *env, ptrdiff_t nargs, emacs_value args[], void *data
263266
sqlite3_finalize(stmt);
264267
}
265268

266-
free(query);
267-
return env->intern(env, "nil");
269+
goto exit;
268270
}
269271

270272
emacs_value Qcons = env->intern(env, "cons");
271-
emacs_value fields = env->intern(env, "nil");
273+
emacs_value fields = Qnil;
272274
int count = sqlite3_column_count(stmt);
273275
for (int i = 0; i < count; ++i) {
274276
const char *name = sqlite3_column_name(stmt, i);
@@ -291,7 +293,8 @@ Fsqlite3_execute(emacs_env *env, ptrdiff_t nargs, emacs_value args[], void *data
291293
result->stmt = stmt;
292294
result->fields = fields;
293295
result->eof = false;
294-
return env->make_user_ptr(env, el_sqlite3_resultset_free, result);
296+
retval = env->make_user_ptr(env, el_sqlite3_resultset_free, result);
297+
goto exit;
295298
}
296299

297300
while ((ret = sqlite3_step(stmt)) == SQLITE_ROW) {
@@ -302,11 +305,16 @@ Fsqlite3_execute(emacs_env *env, ptrdiff_t nargs, emacs_value args[], void *data
302305
}
303306

304307
sqlite3_finalize(stmt);
305-
if (ret != SQLITE_OK && ret != SQLITE_DONE) {
306-
return env->intern(env, "nil");
308+
309+
exit:
310+
free(query);
311+
312+
if (errmsg != NULL) {
313+
emacs_value errstr = env->make_string(env, errmsg, strlen(errmsg));
314+
env->non_local_exit_signal(env, env->intern(env, "error"), errstr);
307315
}
308316

309-
return env->intern(env, "nil");
317+
return retval;
310318
}
311319

312320
static emacs_value

0 commit comments

Comments
 (0)