Skip to content

Commit

Permalink
Merge branch 'pg/fix_erts_bld_string_n' into dev
Browse files Browse the repository at this point in the history
* pg/fix_erts_bld_string_n:
  Fix erts_bld_string_n (called by enif_make_string and erlang:decode_packet/3) to work with 8 bits characters

OTP-8685 pg/fix_erts_bld_string_n

Fix bug causing erlang:decode_packet and enif_make_string to generate
faulty strings with negative character values for ascii values larger than
127. (Thanks to Paul Guyot)
  • Loading branch information
Erlang/OTP committed Jun 8, 2010
2 parents 5a5a501 + 8215a7a commit b10f035
Show file tree
Hide file tree
Showing 3 changed files with 8 additions and 5 deletions.
2 changes: 1 addition & 1 deletion erts/emulator/beam/utils.c
Expand Up @@ -510,7 +510,7 @@ erts_bld_string_n(Uint **hpp, Uint *szp, const char *str, Sint len)
if (hpp) {
res = NIL;
while (--i >= 0) {
res = CONS(*hpp, make_small(str[i]), res);
res = CONS(*hpp, make_small((byte) str[i]), res);
*hpp += 2;
}
}
Expand Down
5 changes: 3 additions & 2 deletions erts/emulator/test/nif_SUITE.erl
Expand Up @@ -967,10 +967,11 @@ make_atom(Config) when is_list(Config) ->
make_string(Config) when is_list(Config) ->
?line ensure_lib_loaded(Config, 1),
?line Strings = make_strings(),
?line 4 = size(Strings),
?line 5 = size(Strings),
A0String = "a0string",
A0String0 = [$a,0,$s,$t,$r,$i,$n,$g,0],
?line Strings = {A0String,A0String,A0String,A0String0}.
AStringWithAccents = [$E,$r,$l,$a,$n,$g,$ ,16#e4,$r,$ ,$e,$t,$t,$ ,$g,$e,$n,$e,$r,$e,$l,$l,$t,$ ,$p,$r,$o,$g,$r,$a,$m,$s,$p,$r,16#e5,$k],
?line Strings = {A0String,A0String,A0String,A0String0, AStringWithAccents}.

tmpmem() ->
case erlang:system_info({allocator,temp_alloc}) of
Expand Down
6 changes: 4 additions & 2 deletions erts/emulator/test/nif_SUITE_data/nif_SUITE.c
Expand Up @@ -808,12 +808,14 @@ static ERL_NIF_TERM make_strings(ErlNifEnv* env, int argc, const ERL_NIF_TERM ar
{
const char a0string[8] = {'a','0','s','t','r','i','n','g'};
const char a0string0[9] = {'a','\0','s','t','r','i','n','g',0};
const char astringwith8bits[37] = {'E','r','l','a','n','g',' ',0xE4 /* 'ä' */,'r',' ','e','t','t',' ','g','e','n','e','r','e','l','l','t',' ','p','r','o','g','r','a','m','s','p','r', 0xE5 /* 'å' */,'k',0};

return enif_make_tuple4(env,
return enif_make_tuple5(env,
enif_make_string(env, "a0string", ERL_NIF_LATIN1),
enif_make_string_len(env, "a0string", 8, ERL_NIF_LATIN1),
enif_make_string_len(env, a0string, 8, ERL_NIF_LATIN1),
enif_make_string_len(env, a0string0, 9, ERL_NIF_LATIN1));
enif_make_string_len(env, a0string0, 9, ERL_NIF_LATIN1),
enif_make_string(env, astringwith8bits, ERL_NIF_LATIN1));
}
static ERL_NIF_TERM send_list_seq(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
Expand Down

0 comments on commit b10f035

Please sign in to comment.