From 9b41542f4d03c3b59ff458f3569688fbd8fb8bc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Sun, 1 Feb 2009 01:54:41 +0100 Subject: [PATCH] Fix invalid writes to read-only stringbufs. * libguile/strings.c (SET_STRINGBUF_SHARED): Don't modify BUF if it's already marked as shared since it might be a read-only stringbuf. This error can be caught when linking with GNU ld with "-z relro". --- libguile/strings.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/libguile/strings.c b/libguile/strings.c index d9dc9f009..1839c6ac0 100644 --- a/libguile/strings.c +++ b/libguile/strings.c @@ -86,8 +86,15 @@ #define STRINGBUF_MAX_INLINE_LEN (3*sizeof(scm_t_bits)) -#define SET_STRINGBUF_SHARED(buf) \ - (SCM_SET_CELL_WORD_0 ((buf), SCM_CELL_WORD_0 (buf) | STRINGBUF_F_SHARED)) +#define SET_STRINGBUF_SHARED(buf) \ + do \ + { \ + /* Don't modify BUF if it's already marked as shared since it might be \ + a read-only, statically allocated stringbuf. */ \ + if (SCM_LIKELY (!STRINGBUF_SHARED (buf))) \ + SCM_SET_CELL_WORD_0 ((buf), SCM_CELL_WORD_0 (buf) | STRINGBUF_F_SHARED); \ + } \ + while (0) #if SCM_DEBUG static size_t lenhist[1001];