Package: libconfig
Version: 1.4.9-2
Usertags: goto-cc

During a rebuild of all packages in a clean sid chroot (and cowbuilder+pbuilder)
the build failed with the following error. Please note that we use our research
compiler tool-chain (using tools from the cbmc package), which permits extended
reporting on type inconsistencies at link time.

[...]
libtool: link: gcc -shared  -fPIC -DPIC  .libs/libconfig_la-libconfig.o 
.libs/libconfig_la-scanner.o .libs/libconfig_la-grammar.o 
.libs/libconfig_la-scanctx.o .libs/libconfig_la-strbuf.o    -O2 -Wl,-z 
-Wl,relro   -Wl,-soname -Wl,libconfig.so.9 -o .libs/libconfig.so.9.1.3

error: conflicting function declarations "libconfig_yy_delete_buffer"
old definition in module libconfig file scanner.h line 202
void (struct yy_buffer_state *, void *)
new definition in module scanner file scanner.c line 1743
void (struct yy_buffer_state *b, void *yyscanner)

reason for conflict in types listed below (struct/struct):
composite type component counts differ (13/12)
struct yy_buffer_state {
  struct _IO_FILE * yy_input_file;
  char * yy_ch_buf;
  char * yy_buf_pos;
  unsigned int yy_buf_size;
  signed int yy_n_chars;
  signed int yy_is_our_buffer;
  signed int yy_is_interactive;
  signed int yy_at_bol;
  signed int yy_bs_lineno;
  signed int yy_bs_column;
  signed int yy_fill_buffer;
  signed int yy_buffer_status;
  unsigned int <padding>;
}
struct yy_buffer_state {
  struct _IO_FILE * yy_input_file;
  char * yy_ch_buf;
  char * yy_buf_pos;
  unsigned long int yy_buf_size;
  signed int yy_n_chars;
  signed int yy_is_our_buffer;
  signed int yy_is_interactive;
  signed int yy_at_bol;
  signed int yy_bs_lineno;
  signed int yy_bs_column;
  signed int yy_fill_buffer;
  signed int yy_buffer_status;
}
Makefile:518: recipe for target 'libconfig.la' failed
make[5]: *** [libconfig.la] Error 64
make[5]: Leaving directory 
'/srv/jenkins-slave/workspace/sid-goto-cc-libconfig/libconfig-1.4.9/lib'
Makefile:437: recipe for target 'all' failed
make[4]: *** [all] Error 2

The difference in the two struct types is an additional padding, which is really
caused by the different types of the yy_buf_size member. Consequently the
offsets of all subsequent members will differ, resulting in undefined behaviour.

Reviewing the struct declaration in scanner.h yields further insight:

http://sources.debian.net/src/libconfig/1.4.9-2/lib/scanner.h?hl=143,144,145,146#L143

It seems that libconfig.c will not have YY_TYPEDEF_YY_SIZE_T set, and thus
yy_size_t is set to unsigned.

Best,
Michael

Attachment: pgpC50jwX6cli.pgp
Description: PGP signature

Reply via email to