[patches] erl_interface: bug fixes, ei_print_term and show_term merge, and new ei_x_decode_* functions

Romain Lenglet <>
Mon May 15 04:46:50 CEST 2006


Please review the three attached patches, to apply in the 
following order, against the otp_src_R10B_2006-02-27 snapshot / 
erl_interface version 3.5.4:

- 01_ei_bugfixes.patch:

Corrects a number of bugs:
- in send_exit.c: malloc(len) instead of malloc(index) (index is 
always 0 at that point!), which made the function always 
return -1 when len>EISMALLBUF;
- when decoding references, only the first 3 bytes are read, but 
the index must be increment of the total size, not only 3;
- in ei_skip_term, the decoding of ERL_LARGE_BIG_EXT was boggus 
(the length returned by ei_get_type_internal in that case is 
*not* the length of the encoded term!);
- in ei_decode_trace, the index may have been updated even if the 
case decoding fails in the middle of decoding;
- same problem in print_term, for the decoding of ERL_LIST_EXT, 
- in show_term, replace calls to ei_decode_skip_bignum by calls 
to ei_skip_term, which does the same job; remove 

Also adds some safety tests:
- when decoding a double (ERL_FLOAT_EXT), check that the last of 
the 31 bytes is a \0, to make sure that the sscanf does not scan 
after those 31 bytes;
- when decoding a fun, check that the buffer allocated for free 
variables is not NULL;
- when decoding a fun, check consistency of free variables data 

- 02_ei_printtermshowtermmerged.patch:

Merges show_term into ei_print_term, and keeps the best of both 
Modifies the output format for binaries, atoms, pids, ports, 
refs, strings, and bignums	to better fit erlang's *_to_list bifs 
and io_lib's functions.
Replaces all uses of show_term by uses of ei_print_term.

- 03_ei_xdecode.patch:

Adds a ei_x_decode_* variant for every ei_decode_* function 
(resp. ei_x_get_type* / ei_get_type*), which takes an ei_x_buff 
*x argument instead of a const char *buf, int *index pair. This 
allows to check the index against the buffer size (x->buffsz) to 
prevent reading after the buffer end.
The ei_x_decode_* variants simply perform tests before every read 
(every get8(s), get16be(s), etc.), using a new check_get macro 
defined in putget.h.
The ei_decode_* unsafe variants are now implemented as stubs that 
call their corresponding ei_x_decode_* variant, in 

The internal functions ei_show_recmsg and ei_show_sendmsg have 
been modified to call ei_x_decode_* instead of ei_decode_*, and 
this change is reflected in their new signature (they take 
ei_x_buff * arguments instead of const char *). Uses of 
ei_show_recmsg and ei_show_sendmsg have been accordingly 
modified in src/connect/*.c and src/not_used/*.c.

All code in src/decode/* and src/misc/* now uses the new 
ei_x_decode_* variants. Some "slave work" remains to be done, to 
replace all uses of ei_decode_* by uses of ei_x_decode_* in 
src/connect/*, src/prog/*, and src/registry/*.

I have checked that all patches compile correctly, without 
introducing new warnings.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: 03_ei_xdecode.patch.gz
Type: application/x-gzip
Size: 13416 bytes
Desc: not available
URL: <http://erlang.org/pipermail/erlang-bugs/attachments/20060515/eeb8b570/attachment.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 01_ei_bugfixes.patch.gz
Type: application/x-gzip
Size: 3296 bytes
Desc: not available
URL: <http://erlang.org/pipermail/erlang-bugs/attachments/20060515/eeb8b570/attachment-0001.bin>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 02_ei_printtermshowtermmerged.patch.gz
Type: application/x-gzip
Size: 4487 bytes
Desc: not available
URL: <http://erlang.org/pipermail/erlang-bugs/attachments/20060515/eeb8b570/attachment-0002.bin>

More information about the erlang-bugs mailing list