[File] Possible ABI break when updating file from 5.33 to 5.35
emersonbernier at tutanota.com
emersonbernier at tutanota.com
Sat Jan 26 16:14:33 UTC 2019
Hi!
In freedesktop-sdk[1] we're trying to keep ABI compatibility when updating
elements like file to new releases. In order to achieve this we use libabigail[2]
tool to automate ABI compat checks. During update file from 5.33 to 5.35 (we
missed 5.34 release) our tool produced following complaint:
╔════════════════╗
║ Comparing ABIs ║
╚════════════════╝
┌───────────────────────────────────┐
│ ABI Break: libmagic.so.1:libmagic │
└───────────────────────────────────┘
Functions changes summary: 86 Removed, 1 Changed (15 filtered out), 0 Added functions
Variables changes summary: 4 Removed, 0 Changed, 0 Added variables
86 Removed functions:
'function int buffer_apprentice(magic_set*, magic**, size_t*, size_t)' {buffer_apprentice}
'function int buffer_fill(const buffer*)' {buffer_fill}
'function void buffer_fini(buffer*)' {buffer_fini}
'function void buffer_init(buffer*, int, void*, size_t)' {buffer_init}
'function size_t cdf_count_chain(const cdf_sat_t*, cdf_secid_t, size_t)' {cdf_count_chain}
'function char* cdf_ctime(const time_t*, char*)' {cdf_ctime}
'function int cdf_find_stream(const cdf_dir_t*, const char*, int)' {cdf_find_stream}
'function int cdf_print_classid(char*, size_t, const cdf_classid_t*)' {cdf_print_classid}
'function int cdf_print_elapsed_time(char*, size_t, cdf_timestamp_t)' {cdf_print_elapsed_time}
'function int cdf_print_property_name(char*, size_t, uint32_t)' {cdf_print_property_name}
'function int cdf_read_dir(const cdf_info_t*, const cdf_header_t*, const cdf_sat_t*, cdf_dir_t*)' {cdf_read_dir}
'function int cdf_read_doc_summary_info(const cdf_info_t*, const cdf_header_t*, const cdf_sat_t*, const cdf_sat_t*, const cdf_stream_t*, const cdf_dir_t*, cdf_stream_t*)' {cdf_read_doc_summary_info}
'function int cdf_read_header(const cdf_info_t*, cdf_header_t*)' {cdf_read_header}
'function int cdf_read_long_sector_chain(const cdf_info_t*, const cdf_header_t*, const cdf_sat_t*, cdf_secid_t, size_t, cdf_stream_t*)' {cdf_read_long_sector_chain}
'function int cdf_read_property_info(const cdf_stream_t*, const cdf_header_t*, uint32_t, cdf_property_info_t**, size_t*, size_t*)' {cdf_read_property_info}
'function int cdf_read_sat(const cdf_info_t*, cdf_header_t*, cdf_sat_t*)' {cdf_read_sat}
'function ssize_t cdf_read_sector(const cdf_info_t*, void*, size_t, size_t, const cdf_header_t*, cdf_secid_t)' {cdf_read_sector}
'function int cdf_read_sector_chain(const cdf_info_t*, const cdf_header_t*, const cdf_sat_t*, const cdf_sat_t*, const cdf_stream_t*, cdf_secid_t, size_t, cdf_stream_t*)' {cdf_read_sector_chain}
'function ssize_t cdf_read_short_sector(const cdf_stream_t*, void*, size_t, size_t, const cdf_header_t*, cdf_secid_t)' {cdf_read_short_sector}
'function int cdf_read_short_sector_chain(const cdf_header_t*, const cdf_sat_t*, const cdf_stream_t*, cdf_secid_t, size_t, cdf_stream_t*)' {cdf_read_short_sector_chain}
'function int cdf_read_short_stream(const cdf_info_t*, const cdf_header_t*, const cdf_sat_t*, const cdf_dir_t*, cdf_stream_t*, const cdf_directory_t**)' {cdf_read_short_stream}
'function int cdf_read_ssat(const cdf_info_t*, const cdf_header_t*, const cdf_sat_t*, cdf_sat_t*)' {cdf_read_ssat}
'function int cdf_read_summary_info(const cdf_info_t*, const cdf_header_t*, const cdf_sat_t*, const cdf_sat_t*, const cdf_stream_t*, const cdf_dir_t*, cdf_stream_t*)' {cdf_read_summary_info}
'function int cdf_read_user_stream(const cdf_info_t*, const cdf_header_t*, const cdf_sat_t*, const cdf_sat_t*, const cdf_stream_t*, const cdf_dir_t*, const char*, cdf_stream_t*)' {cdf_read_user_stream}
'function void cdf_swap_class(cdf_classid_t*)' {cdf_swap_class}
'function void cdf_swap_dir(cdf_directory_t*)' {cdf_swap_dir}
'function void cdf_swap_header(cdf_header_t*)' {cdf_swap_header}
'function int cdf_timespec_to_timestamp(cdf_timestamp_t*, const timespec*)' {cdf_timespec_to_timestamp}
'function int cdf_timestamp_to_timespec(timespec*, cdf_timestamp_t)' {cdf_timestamp_to_timespec}
'function uint16_t cdf_tole2(uint16_t)' {cdf_tole2}
'function uint32_t cdf_tole4(uint32_t)' {cdf_tole4}
'function uint64_t cdf_tole8(uint64_t)' {cdf_tole8}
'function char* cdf_u16tos8(char*, size_t, const uint16_t*)' {cdf_u16tos8}
'function int cdf_unpack_catalog(const cdf_header_t*, const cdf_stream_t*, cdf_catalog_t**)' {cdf_unpack_catalog}
'function void cdf_unpack_dir(cdf_directory_t*, char*)' {cdf_unpack_dir}
'function void cdf_unpack_header(cdf_header_t*, char*)' {cdf_unpack_header}
'function int cdf_unpack_summary_info(const cdf_stream_t*, const cdf_header_t*, cdf_summary_info_header_t*, cdf_property_info_t**, size_t*)' {cdf_unpack_summary_info}
'function int cdf_zero_stream(cdf_stream_t*)' {cdf_zero_stream}
'function int der_cmp(magic_set*, magic*)' {der_cmp}
'function int32_t der_offs(magic_set*, magic*, size_t)' {der_offs}
'function int file_apprentice(magic_set*, const char*, int)' {file_apprentice}
'function int file_ascmagic(magic_set*, const buffer*, int)' {file_ascmagic}
'function int file_ascmagic_with_encoding(magic_set*, const buffer*, unichar*, size_t, const char*, const char*, int)' {file_ascmagic_with_encoding}
'function void file_badread(magic_set*)' {file_badread}
'function void file_badseek(magic_set*)' {file_badseek}
'function int file_buffer(magic_set*, int, const char*, void*, size_t)' {file_buffer}
'function int file_check_mem(magic_set*, unsigned int)' {file_check_mem}
'function int file_encoding(magic_set*, const buffer*, unichar**, size_t*, const char**, const char**, const char**)' {file_encoding}
'function void file_error(magic_set*, int, const char*, ...)' {file_error}
'function const char* file_fmttime(uint64_t, int, char*)' {file_fmttime}
'function int file_fsmagic(magic_set*, const char*, stat*)' {file_fsmagic}
'function const char* file_getbuffer(magic_set*)' {file_getbuffer}
'function int file_is_tar(magic_set*, const buffer*)' {file_is_tar}
'function int file_looks_utf8(const unsigned char*, size_t, unichar*, size_t*)' {file_looks_utf8}
'function void file_magerror(magic_set*, const char*, ...)' {file_magerror}
'function int file_magicfind(magic_set*, const char*, mlist*)' {file_magicfind}
'function void file_magwarn(magic_set*, const char*, ...)' {file_magwarn}
'function void file_mdump(magic*)' {file_mdump}
'function magic_set* file_ms_alloc(int)' {file_ms_alloc}
'function void file_ms_free(magic_set*)' {file_ms_free}
'function void file_oomem(magic_set*, size_t)' {file_oomem}
'function int file_pipe2file(magic_set*, int, void*, size_t)' {file_pipe2file}
'function char* file_pop_buffer(magic_set*, file_pushbuf_t*)' {file_pop_buffer}
'function char* file_printable(char*, size_t, const char*)' {file_printable}
'function size_t file_printedlen(const magic_set*)' {file_printedlen}
'function int file_printf(magic_set*, const char*, ...)' {file_printf}
'function size_t file_pstring_get_length(const magic*, const char*)' {file_pstring_get_length}
'function size_t file_pstring_length_size(const magic*)' {file_pstring_length_size}
'function file_pushbuf_t* file_push_buffer(magic_set*)' {file_push_buffer}
'function int file_regcomp(file_regex_t*, const char*, int)' {file_regcomp}
'function void file_regerror(file_regex_t*, int, magic_set*)' {file_regerror}
'function int file_regexec(file_regex_t*, const char*, size_t, regmatch_t*, int)' {file_regexec}
'function void file_regfree(file_regex_t*)' {file_regfree}
'function int file_replace(magic_set*, const char*, const char*)' {file_replace}
'function int file_reset(magic_set*, int)' {file_reset}
'function void file_showstr(FILE*, const char*, size_t)' {file_showstr}
'function uint64_t file_signextend(magic_set*, magic*, uint64_t)' {file_signextend}
'function int file_softmagic(magic_set*, const buffer*, uint16_t*, uint16_t*, int, int)' {file_softmagic}
'function int file_trycdf(magic_set*, const buffer*)' {file_trycdf}
'function int file_tryelf(magic_set*, const buffer*)' {file_tryelf}
'function int file_vprintf(magic_set*, const char*, __va_list_tag*)' {file_vprintf}
'function int file_zmagic(magic_set*, const buffer*, const char*)' {file_zmagic}
'function const char* fmtcheck(const char*, const char*)' {fmtcheck}
'function ssize_t sread(int, void*, size_t, int)' {sread}
'function size_t strlcat(char*, const char*, size_t)' {strlcat}
'function size_t strlcpy(char*, const char*, size_t)' {strlcpy}
1 function with some indirect sub-type change:
[C]'function const char* magic_buffer(magic_set*, void*, size_t)' at magic.c:524:1 has some indirect sub-type changes:
parameter 1 of type 'magic_set*' has sub-type changes:
in pointed to type 'struct magic_set' at file.h:400:1:
type size changed from 1920 to 1984 (in bits)
1 data member insertion:
'mode_t magic_set::mode', at offset 704 (in bits) at file.h:419:1
9 data member changes:
'struct {const char* s; size_t s_len; size_t offset; size_t rm_len;} magic_set::search' offset changed from 704 to 768 (in bits) (by +64 bits)
'VALUETYPE magic_set::ms_value' offset changed from 960 to 1024 (in bits) (by +64 bits)
'uint16_t magic_set::indir_max' offset changed from 1728 to 1792 (in bits) (by +64 bits)
'uint16_t magic_set::name_max' offset changed from 1744 to 1808 (in bits) (by +64 bits)
'uint16_t magic_set::elf_shnum_max' offset changed from 1760 to 1824 (in bits) (by +64 bits)
'uint16_t magic_set::elf_phnum_max' offset changed from 1776 to 1840 (in bits) (by +64 bits)
'uint16_t magic_set::elf_notes_max' offset changed from 1792 to 1856 (in bits) (by +64 bits)
'uint16_t magic_set::regex_max' offset changed from 1808 to 1872 (in bits) (by +64 bits)
'size_t magic_set::bytes_max' offset changed from 1856 to 1920 (in bits) (by +64 bits)
4 Removed variables:
'int file_formats[49]' {file_formats}
'const char* file_names[]' {file_names}
'const size_t file_nformats' {file_nformats}
'const size_t file_nnames' {file_nnames}
As part of our discussion[3] about what to do with that we would like to ask
about your opinion on the matter. Especially I wanted to ask if reported changes
were intentional and if they're safe for backward compatibility thus if above
report is a false positive. I would be grateful if you can find time to respond.
Thank you.
[1] https://gitlab.com/freedesktop-sdk <https://gitlab.com/freedesktop-sdk>
[2] https://sourceware.org/libabigail <https://sourceware.org/libabigail>
[3] https://gitlab.com/freedesktop-sdk/freedesktop-sdk/merge_requests/900 <https://gitlab.com/freedesktop-sdk/freedesktop-sdk/merge_requests/900>
More information about the File
mailing list