From 9fbb36725634d05c3e46de7619e2f6019fbeb6fe Mon Sep 17 00:00:00 2001 From: Mark H Weaver Date: Mon, 11 Jun 2018 01:06:34 -0400 Subject: [PATCH] Fix error reporting in 'load-thunk-from-memory'. Previously 'load-thunk-from-memory' would often throw to 'system-error' based on a stale value in 'errno', leading to incorrect error messages. * libguile/loader.c (load_thunk_from_memory): Set 'errno' to 0 before jumping to cleanup in the ABORT preprocessor macro, and also in the case when 'process_dynamic_segment' reports an error. --- libguile/loader.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/libguile/loader.c b/libguile/loader.c index 26a73436b..743c8b0cd 100644 --- a/libguile/loader.c +++ b/libguile/loader.c @@ -1,5 +1,5 @@ /* Copyright (C) 2001, 2009, 2010, 2011, 2012 - * 2013, 2014, 2015, 2017 Free Software Foundation, Inc. + * 2013, 2014, 2015, 2017, 2018 Free Software Foundation, Inc. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License @@ -341,7 +341,7 @@ process_dynamic_segment (char *base, Elf_Phdr *dyn_phdr, return NULL; } -#define ABORT(msg) do { err_msg = msg; goto cleanup; } while (0) +#define ABORT(msg) do { err_msg = msg; errno = 0; goto cleanup; } while (0) static SCM load_thunk_from_memory (char *data, size_t len, int is_read_only) @@ -460,7 +460,10 @@ load_thunk_from_memory (char *data, size_t len, int is_read_only) if ((err_msg = process_dynamic_segment (data, &ph[dynamic_segment], &init, &entry, &frame_maps))) - goto cleanup; + { + errno = 0; /* not an OS error */ + goto cleanup; + } if (scm_is_true (init)) scm_call_0 (init);