summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark H Weaver <mhw@netris.org>2018-10-19 21:54:34 -0400
committerMark H Weaver <mhw@netris.org>2018-10-19 22:18:20 -0400
commitfbdcf6358519c415bd2041ca09bee9b16e9d528a (patch)
tree01b54eca4e353ebe7d8c0dfa6b748ee621c6d81f
parent1d3cfc3548a7603c2af4955ab1eebc5c01ae54ae (diff)
scm_seed_to_random_state: Support wide string arguments.
Partially fixes <https://bugs.gnu.org/33044>. Reported by Tom de Vries <tdevries@suse.de>. * libguile/random.c (scm_seed_to_random_state): Use 'scm_to_utf8_string' (or 'scm_to_latin1_string' for a narrow string, for compatibility) to convert the string into raw bytes for use by 'scm_c_make_rstate'. Make sure the length in bytes fits within an 'int'.
-rw-r--r--libguile/random.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/libguile/random.c b/libguile/random.c
index 05147edf3..7590dcbb1 100644
--- a/libguile/random.c
+++ b/libguile/random.c
@@ -441,11 +441,33 @@ SCM_DEFINE (scm_seed_to_random_state, "seed->random-state", 1, 0, 0,
#define FUNC_NAME s_scm_seed_to_random_state
{
SCM res;
+ char *c_str;
+ size_t len;
+
if (SCM_NUMBERP (seed))
seed = scm_number_to_string (seed, SCM_UNDEFINED);
SCM_VALIDATE_STRING (1, seed);
- res = make_rstate (scm_c_make_rstate (scm_i_string_chars (seed),
- scm_i_string_length (seed)));
+
+ if (scm_i_is_narrow_string (seed))
+ /* This special case of a narrow string, where latin1 is used, is
+ for backward compatibility during the 2.2 stable series. In
+ future major releases, we should use UTF-8 uniformly. */
+ c_str = scm_to_latin1_stringn (seed, &len);
+ else
+ c_str = scm_to_utf8_stringn (seed, &len);
+
+ /* 'scm_to_*_stringn' returns a 'size_t' for the length in bytes, but
+ 'scm_c_make_rstate' accepts an 'int'. Make sure the length fits in
+ an 'int'. */
+ if (len > INT_MAX)
+ {
+ free (c_str);
+ SCM_OUT_OF_RANGE (1, seed);
+ }
+
+ res = make_rstate (scm_c_make_rstate (c_str, len));
+ free (c_str);
+
scm_remember_upto_here_1 (seed);
return res;