mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-04-30 20:00:19 +02:00
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'.
This commit is contained in:
parent
1d3cfc3548
commit
fbdcf63585
1 changed files with 24 additions and 2 deletions
|
@ -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
|
#define FUNC_NAME s_scm_seed_to_random_state
|
||||||
{
|
{
|
||||||
SCM res;
|
SCM res;
|
||||||
|
char *c_str;
|
||||||
|
size_t len;
|
||||||
|
|
||||||
if (SCM_NUMBERP (seed))
|
if (SCM_NUMBERP (seed))
|
||||||
seed = scm_number_to_string (seed, SCM_UNDEFINED);
|
seed = scm_number_to_string (seed, SCM_UNDEFINED);
|
||||||
SCM_VALIDATE_STRING (1, seed);
|
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);
|
scm_remember_upto_here_1 (seed);
|
||||||
return res;
|
return res;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue