From: Blake Shaw via "Bug reports for GUILE, GNU's Ubiquitous Extension Language" <bug-guile@gnu.org>
To: 60928@debbugs.gnu.org
Cc: Blake Shaw <blake@reproduciblemedia.com>
Subject: bug#60928: [PATCH] bugfix/make_hash_table: fix segfault when arg< 0 for make-hash-table
Date: Wed, 18 Jan 2023 14:10:22 +0700 [thread overview]
Message-ID: <20230118071022.29809-1-blake@reproduciblemedia.com> (raw)
* libguile/hashtab.c (make_hash_table): FIX SEGMENTATION FAULT
Currently on Guix if a user evokes (make-hash-table arg) where
arg < 0, guile segfaults.
This patch adds the most straight forward solution, checking
if the value passed to make-hash-table is less than 0, and if so,
throwing an error with scm_out_of_range to avoid segfaulting.
It builds and passes all tests in a guix shell using the
command:
$ guix shell automake autoconf make flex gnulib gettext libtool \
gperf gmp git libffi -D guile guix -C -- \
./autogen.sh && ./configure && make && make check
afterwards, using: ./meta/guile -q
=> scheme@(guile-user)> (make-hash-table -1)
ice-9/boot-9.scm:1685:16: In procedure raise-exception:
Value out of range 0 to< 18446744073709551615: -1
as desired...
I'm not familiar with the inner workings of libguile, but
figured I'd offer a fix regardless, so take this this patch
with a grain of salt, it was a quicky...
---
libguile/hashtab.c | 29 +++++++++++++++--------------
1 file changed, 15 insertions(+), 14 deletions(-)
diff --git a/libguile/hashtab.c b/libguile/hashtab.c
index b4f004c1d..9cb5d7a47 100644
--- a/libguile/hashtab.c
+++ b/libguile/hashtab.c
@@ -84,23 +84,24 @@ make_hash_table (unsigned long k, const char *func_name)
SCM vector;
scm_t_hashtable *t;
int i = 0, n = k ? k : 31;
- while (i + 1 < HASHTABLE_SIZE_N && n > hashtable_size[i])
- ++i;
- n = hashtable_size[i];
-
- vector = scm_c_make_vector (n, SCM_EOL);
-
- t = scm_gc_malloc_pointerless (sizeof (*t), s_hashtable);
- t->min_size_index = t->size_index = i;
- t->n_items = 0;
- t->lower = 0;
- t->upper = 9 * n / 10;
+ if (k < i) {
+ scm_out_of_range (func_name, scm_from_ulong (k));
+ } else {
+ while (i + 1 < HASHTABLE_SIZE_N && n > hashtable_size[i])
+ ++i;
+ n = hashtable_size[i];
+ vector = scm_c_make_vector (n, SCM_EOL);
+ t = scm_gc_malloc_pointerless (sizeof (*t), s_hashtable);
+ t->min_size_index = t->size_index = i;
+ t->n_items = 0;
+ t->lower = 0;
+ t->upper = 9 * n / 10;
/* FIXME: we just need two words of storage, not three */
- return scm_double_cell (scm_tc7_hashtable, SCM_UNPACK (vector),
- (scm_t_bits)t, 0);
+ return scm_double_cell (scm_tc7_hashtable, SCM_UNPACK (vector),
+ (scm_t_bits)t, 0);
+ }
}
-
void
scm_i_rehash (SCM table,
scm_t_hash_fn hash_fn,
--
2.38.1
next reply other threads:[~2023-01-18 7:10 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-01-18 7:10 Blake Shaw via Bug reports for GUILE, GNU's Ubiquitous Extension Language [this message]
2023-01-18 9:10 ` bug#60928: [PATCH] bugfix/make_hash_table: fix segfault when arg< 0 for make-hash-table lloda
2023-01-19 2:41 ` Blake Shaw via Bug reports for GUILE, GNU's Ubiquitous Extension Language
2023-01-19 17:19 ` lloda
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/guile/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230118071022.29809-1-blake@reproduciblemedia.com \
--to=bug-guile@gnu.org \
--cc=60928@debbugs.gnu.org \
--cc=blake@reproduciblemedia.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).