Hello community, here is the log from the commit of package babeltrace for openSUSE:Factory checked in at 2018-07-04 23:48:10 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/babeltrace (Old) and /work/SRC/openSUSE:Factory/.babeltrace.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "babeltrace" Wed Jul 4 23:48:10 2018 rev:4 rq:617763 version:1.5.5 Changes: -------- --- /work/SRC/openSUSE:Factory/babeltrace/babeltrace.changes 2018-04-06 17:45:41.983830358 +0200 +++ /work/SRC/openSUSE:Factory/.babeltrace.new/babeltrace.changes 2018-07-04 23:48:15.304348008 +0200 @@ -1,0 +2,8 @@ +Sun Jun 17 18:47:02 UTC 2018 - [email protected] + +- Update to version 1.5.5: + * Propagate error from packet_seek in case of truncated packet. + * Fix: report truncated files while reading. +- Use tarball signing. + +------------------------------------------------------------------- Old: ---- babeltrace-1.5.4.tar.bz2 New: ---- babeltrace-1.5.5.tar.bz2 babeltrace-1.5.5.tar.bz2.asc babeltrace.keyring ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ babeltrace.spec ++++++ --- /var/tmp/diff_new_pack.Mjo88J/_old 2018-07-04 23:48:15.956347286 +0200 +++ /var/tmp/diff_new_pack.Mjo88J/_new 2018-07-04 23:48:15.956347286 +0200 @@ -19,13 +19,15 @@ %define soname libbabeltrace %define sover 1 Name: babeltrace -Version: 1.5.4 +Version: 1.5.5 Release: 0 Summary: Common Trace Format Babel Tower License: MIT AND GPL-2.0-only Group: Development/Languages/C and C++ Url: https://diamon.org/babeltrace Source: https://efficios.com/files/babeltrace/%{name}-%{version}.tar.bz2 +Source1: https://efficios.com/files/babeltrace/%{name}-%{version}.tar.bz2.asc +Source2: %{name}.keyring BuildRequires: bison BuildRequires: flex BuildRequires: pkgconfig ++++++ babeltrace-1.5.4.tar.bz2 -> babeltrace-1.5.5.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/babeltrace-1.5.4/ChangeLog new/babeltrace-1.5.5/ChangeLog --- old/babeltrace-1.5.4/ChangeLog 2018-02-01 04:05:00.000000000 +0100 +++ new/babeltrace-1.5.5/ChangeLog 2018-03-26 21:34:10.000000000 +0200 @@ -1,3 +1,7 @@ +2018-03-26 babeltrace 1.5.5 (Purple Day) + * Propagate error from packet_seek in case of truncated packet + * Fix: report truncated files while reading + 2018-01-31 babeltrace 1.5.4 (Gorilla Suit Day) * Fix: use signed accessors for clock offsets * Fix: signedness error in python complements diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/babeltrace-1.5.4/bindings/python/Makefile.in new/babeltrace-1.5.5/bindings/python/Makefile.in --- old/babeltrace-1.5.4/bindings/python/Makefile.in 2018-02-01 04:05:09.000000000 +0100 +++ new/babeltrace-1.5.5/bindings/python/Makefile.in 2018-03-26 21:34:20.000000000 +0200 @@ -620,9 +620,9 @@ maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -@USE_PYTHON_FALSE@uninstall-local: -@USE_PYTHON_FALSE@install-exec-local: @USE_PYTHON_FALSE@clean-local: +@USE_PYTHON_FALSE@install-exec-local: +@USE_PYTHON_FALSE@uninstall-local: clean: clean-recursive clean-am: clean-generic clean-libtool clean-local mostlyclean-am diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/babeltrace-1.5.4/configure new/babeltrace-1.5.5/configure --- old/babeltrace-1.5.4/configure 2018-02-01 04:05:07.000000000 +0100 +++ new/babeltrace-1.5.5/configure 2018-03-26 21:34:18.000000000 +0200 @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for babeltrace 1.5.4. +# Generated by GNU Autoconf 2.69 for babeltrace 1.5.5. # # Report bugs to <[email protected]>. # @@ -590,8 +590,8 @@ # Identity of this package. PACKAGE_NAME='babeltrace' PACKAGE_TARNAME='babeltrace' -PACKAGE_VERSION='1.5.4' -PACKAGE_STRING='babeltrace 1.5.4' +PACKAGE_VERSION='1.5.5' +PACKAGE_STRING='babeltrace 1.5.5' PACKAGE_BUGREPORT='[email protected]' PACKAGE_URL='https://diamon.org/babeltrace' @@ -1410,7 +1410,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures babeltrace 1.5.4 to adapt to many kinds of systems. +\`configure' configures babeltrace 1.5.5 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1482,7 +1482,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of babeltrace 1.5.4:";; + short | recursive ) echo "Configuration of babeltrace 1.5.5:";; esac cat <<\_ACEOF @@ -1625,7 +1625,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -babeltrace configure 1.5.4 +babeltrace configure 1.5.5 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2048,7 +2048,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by babeltrace $as_me 1.5.4, which was +It was created by babeltrace $as_me 1.5.5, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -3035,7 +3035,7 @@ # Define the identity of the package. PACKAGE='babeltrace' - VERSION='1.5.4' + VERSION='1.5.5' cat >>confdefs.h <<_ACEOF @@ -18592,7 +18592,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by babeltrace $as_me 1.5.4, which was +This file was extended by babeltrace $as_me 1.5.5, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -18663,7 +18663,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -babeltrace config.status 1.5.4 +babeltrace config.status 1.5.5 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/babeltrace-1.5.4/configure.ac new/babeltrace-1.5.5/configure.ac --- old/babeltrace-1.5.4/configure.ac 2018-02-01 04:05:00.000000000 +0100 +++ new/babeltrace-1.5.5/configure.ac 2018-03-26 21:34:10.000000000 +0200 @@ -1,5 +1,5 @@ AC_PREREQ([2.50]) -AC_INIT([babeltrace],[1.5.4],[[email protected]],[],[https://diamon.org/babeltrace]) +AC_INIT([babeltrace],[1.5.5],[[email protected]],[],[https://diamon.org/babeltrace]) AC_SUBST([BABELTRACE_LIBRARY_VERSION], [1:0:0]) AC_CONFIG_HEADERS([config.h]) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/babeltrace-1.5.4/converter/babeltrace.c new/babeltrace-1.5.5/converter/babeltrace.c --- old/babeltrace-1.5.4/converter/babeltrace.c 2018-02-01 04:05:00.000000000 +0100 +++ new/babeltrace-1.5.5/converter/babeltrace.c 2018-03-26 21:34:10.000000000 +0200 @@ -669,6 +669,7 @@ struct bt_iter_pos *begin_pos = NULL, *end_pos = NULL; struct bt_ctf_event *ctf_event; int ret; + int error_holder = 0; sout = container_of(td_write, struct ctf_text_stream_pos, trace_descriptor); @@ -695,11 +696,18 @@ goto end; } ret = bt_iter_next(bt_ctf_get_iter(iter)); - if (ret < 0) { + if (ret == -ERANGE) { + /* + * Remember that a range (truncated packet) + * error occurred and continue. + */ + error_holder = 1; + continue; + } else if (ret < 0) { goto end; } } - ret = 0; + ret = error_holder; end: bt_ctf_iter_destroy(iter); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/babeltrace-1.5.4/formats/ctf/ctf.c new/babeltrace-1.5.5/formats/ctf/ctf.c --- old/babeltrace-1.5.4/formats/ctf/ctf.c 2018-02-01 04:05:00.000000000 +0100 +++ new/babeltrace-1.5.5/formats/ctf/ctf.c 2018-03-26 21:34:10.000000000 +0200 @@ -478,6 +478,29 @@ } static +void ctf_print_truncated_packet(FILE *fp, struct ctf_stream_definition *stream, + uint64_t packet_size, uint64_t remaining_file_size) +{ + fprintf(fp, "[error] Packet size (%" PRIu64 " bits) is larger than remaining file size (%" PRIu64 " bits) in trace with UUID \"", + packet_size, remaining_file_size); + print_uuid(fp, stream->stream_class->trace->uuid); + fprintf(fp, "\""); + + if (stream->stream_class->trace->parent.path[0] != '\0') { + fprintf(fp, ", at path: \"%s\"", + stream->stream_class->trace->parent.path); + } + + fprintf(fp, ", within stream id %" PRIu64, stream->stream_id); + if (stream->path[0] != '\0') { + fprintf(fp, ", at relative path: \"%s\"", stream->path); + } + + fprintf(fp, ".\n"); + fflush(fp); +} + +static int ctf_read_event(struct bt_stream_pos *ppos, struct ctf_stream_definition *stream) { struct ctf_stream_pos *pos = @@ -491,8 +514,12 @@ if (unlikely(pos->offset == EOF)) return EOF; - if (ctf_pos_get_event(pos)) + ret = ctf_pos_get_event(pos); + if (ret == -BT_PACKET_SEEK_ERROR_TRUNCATED_PACKET) { + return -ERANGE; + } else if (ret) { return EOF; + } /* save the current position as a restore point */ pos->last_offset = pos->offset; @@ -1059,7 +1086,7 @@ case SEEK_SET: /* Fall-through */ break; /* OK */ default: - ret = -1; + ret = -BT_PACKET_SEEK_ERROR; goto end; } @@ -1072,7 +1099,7 @@ if (ret) { fprintf(stderr, "[error] Unable to unmap old base: %s.\n", strerror(errno)); - ret = -1; + ret = -BT_PACKET_SEEK_ERROR; goto end; } pos->base_mma = NULL; @@ -1093,7 +1120,7 @@ pos->cur_index = 0; break; default: - ret = -1; + ret = -BT_PACKET_SEEK_ERROR; goto end; } pos->content_size = -1U; /* Unknown at this point */ @@ -1105,6 +1132,7 @@ assert(ret == 0); pos->offset = 0; } else { + uint64_t remaining_file_size; read_next_packet: switch (whence) { case SEEK_CUR: @@ -1127,7 +1155,7 @@ pos->cur_index = index; break; default: - ret = -1; + ret = -BT_PACKET_SEEK_ERROR; goto end; } @@ -1176,10 +1204,22 @@ if (packet_index->data_offset == -1) { ret = find_data_offset(pos, file_stream, packet_index); if (ret < 0) { - ret = -1; + ret = -BT_PACKET_SEEK_ERROR; goto end; } } + + remaining_file_size = (pos->file_length - ((uint64_t) packet_index->offset)) * CHAR_BIT; + if (packet_index->packet_size > remaining_file_size) { + fflush(stdout); + ctf_print_truncated_packet(stderr, &file_stream->parent, + packet_index->packet_size, + remaining_file_size); + pos->offset = EOF; + ret = -BT_PACKET_SEEK_ERROR_TRUNCATED_PACKET; + goto end; + } + pos->content_size = packet_index->content_size; pos->packet_size = packet_index->packet_size; pos->mmap_offset = packet_index->offset; @@ -1708,8 +1748,7 @@ static int create_stream_one_packet_index(struct ctf_stream_pos *pos, struct ctf_trace *td, - struct ctf_file_stream *file_stream, - size_t filesize) + struct ctf_file_stream *file_stream) { struct packet_index packet_index; uint64_t stream_id = 0; @@ -1724,8 +1763,8 @@ first_packet = 1; } - if (filesize - pos->mmap_offset < (packet_map_len >> LOG2_CHAR_BIT)) { - packet_map_len = (filesize - pos->mmap_offset) << LOG2_CHAR_BIT; + if (pos->file_length - pos->mmap_offset < (packet_map_len >> LOG2_CHAR_BIT)) { + packet_map_len = (pos->file_length - pos->mmap_offset) << LOG2_CHAR_BIT; } if (pos->base_mma) { @@ -1843,7 +1882,7 @@ packet_index.packet_size = bt_get_unsigned_int(field); } else { /* Use file size for packet size */ - packet_index.packet_size = filesize * CHAR_BIT; + packet_index.packet_size = pos->file_length * CHAR_BIT; } /* read content size from header */ @@ -1855,7 +1894,7 @@ packet_index.content_size = bt_get_unsigned_int(field); } else { /* Use packet size if non-zero, else file size */ - packet_index.content_size = packet_index.packet_size ? : filesize * CHAR_BIT; + packet_index.content_size = packet_index.packet_size ? : pos->file_length * CHAR_BIT; } /* read timestamp begin from header */ @@ -1912,9 +1951,9 @@ } } else { /* Use file size for packet size */ - packet_index.packet_size = filesize * CHAR_BIT; + packet_index.packet_size = pos->file_length * CHAR_BIT; /* Use packet size if non-zero, else file size */ - packet_index.content_size = packet_index.packet_size ? : filesize * CHAR_BIT; + packet_index.content_size = packet_index.packet_size ? : pos->file_length * CHAR_BIT; } /* Validate content size and packet size values */ @@ -1924,12 +1963,6 @@ return -EINVAL; } - if (packet_index.packet_size > ((uint64_t) filesize - packet_index.offset) * CHAR_BIT) { - fprintf(stderr, "[error] Packet size (%" PRIu64 " bits) is larger than remaining file size (%" PRIu64 " bits).\n", - packet_index.packet_size, ((uint64_t) filesize - packet_index.offset) * CHAR_BIT); - return -EINVAL; - } - if (packet_index.content_size < pos->offset) { fprintf(stderr, "[error] Invalid CTF stream: content size is smaller than packet headers.\n"); return -EINVAL; @@ -1952,7 +1985,7 @@ /* Retry with larger mapping */ retry: - if (packet_map_len == ((filesize - pos->mmap_offset) << LOG2_CHAR_BIT)) { + if (packet_map_len == ((pos->file_length - pos->mmap_offset) << LOG2_CHAR_BIT)) { /* * Reached EOF, but still expecting header/context data. */ @@ -1975,17 +2008,12 @@ struct ctf_file_stream *file_stream) { struct ctf_stream_pos *pos; - struct stat filestats; int ret; pos = &file_stream->pos; - ret = fstat(pos->fd, &filestats); - if (ret < 0) - return ret; - /* Deal with empty files */ - if (!filestats.st_size) { + if (!pos->file_length) { if (file_stream->parent.trace_packet_header || file_stream->parent.stream_packet_context) { /* @@ -2008,9 +2036,8 @@ } } - for (pos->mmap_offset = 0; pos->mmap_offset < filestats.st_size; ) { - ret = create_stream_one_packet_index(pos, td, file_stream, - filestats.st_size); + for (pos->mmap_offset = 0; pos->mmap_offset < pos->file_length; ) { + ret = create_stream_one_packet_index(pos, td, file_stream); if (ret) return ret; } @@ -2195,6 +2222,7 @@ file_stream->pos.last_offset = LAST_OFFSET_POISON; file_stream->pos.fd = -1; file_stream->pos.index_fp = NULL; + file_stream->pos.file_length = statbuf.st_size; strncpy(file_stream->parent.path, path, PATH_MAX); file_stream->parent.path[PATH_MAX - 1] = '\0'; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/babeltrace-1.5.4/formats/lttng-live/lttng-live-comm.c new/babeltrace-1.5.5/formats/lttng-live/lttng-live-comm.c --- old/babeltrace-1.5.4/formats/lttng-live/lttng-live-comm.c 2018-02-01 04:05:00.000000000 +0100 +++ new/babeltrace-1.5.5/formats/lttng-live/lttng-live-comm.c 2018-03-26 21:34:10.000000000 +0200 @@ -1223,7 +1223,7 @@ ret = handle_seek_position(index, whence, viewer_stream, pos, file_stream); if (ret != 0) { - ret = -1; + ret = -BT_PACKET_SEEK_ERROR; goto end; } @@ -1266,7 +1266,7 @@ if (!lttng_live_should_quit()) { fprintf(stderr, "[error] get_next_index failed\n"); } - ret = -1; + ret = -BT_PACKET_SEEK_ERROR; goto end; } printf_verbose("Index received : packet_size : %" PRIu64 @@ -1389,7 +1389,7 @@ pos->offset = EOF; if (!lttng_live_should_quit()) { fprintf(stderr, "[error] get_data_packet failed\n"); - ret = -1; + ret = -BT_PACKET_SEEK_ERROR; } else { ret = 0; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/babeltrace-1.5.4/include/babeltrace/ctf/types.h new/babeltrace-1.5.5/include/babeltrace/ctf/types.h --- old/babeltrace-1.5.4/include/babeltrace/ctf/types.h 2018-02-01 04:05:00.000000000 +0100 +++ new/babeltrace-1.5.5/include/babeltrace/ctf/types.h 2018-03-26 21:34:10.000000000 +0200 @@ -92,6 +92,7 @@ int dummy; /* dummy position, for length calculation */ struct bt_stream_callbacks *cb; /* Callbacks registered for iterator. */ + size_t file_length; /* length of backing file, in bytes. */ void *priv; }; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/babeltrace-1.5.4/include/babeltrace/error.h new/babeltrace-1.5.5/include/babeltrace/error.h --- old/babeltrace-1.5.4/include/babeltrace/error.h 2018-02-01 04:05:00.000000000 +0100 +++ new/babeltrace-1.5.5/include/babeltrace/error.h 2018-03-26 21:34:10.000000000 +0200 @@ -30,6 +30,11 @@ * SOFTWARE. */ +enum bt_packet_seek_error { + BT_PACKET_SEEK_ERROR = 1, + BT_PACKET_SEEK_ERROR_TRUNCATED_PACKET = 2, +}; + /* * bt_packet_seek_get_error: get the return code of the last packet_seek use. * diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/babeltrace-1.5.4/lib/iterator.c new/babeltrace-1.5.5/lib/iterator.c --- old/babeltrace-1.5.4/lib/iterator.c 2018-02-01 04:05:00.000000000 +0100 +++ new/babeltrace-1.5.5/lib/iterator.c 2018-03-26 21:34:10.000000000 +0200 @@ -864,6 +864,10 @@ */ ret = 0; goto reinsert; + } else if (ret == -ERANGE) { + removed = bt_heap_remove(iter->stream_heap); + assert(removed == file_stream); + goto end; } else if (ret) { goto end; } ++++++ babeltrace.keyring ++++++ pub rsa4096 2013-01-08 [SC] [expires: 2018-11-29] 7F49 314A 26E0 DE78 4276 80E0 5F1B 2A07 89F1 2B11 uid [ unknown] J�r�mie Galarneau <[email protected]> uid [ unknown] J�r�mie Galarneau <[email protected]> sub rsa4096 2013-01-08 [E] -----BEGIN PGP PUBLIC KEY BLOCK----- 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 =oPHw -----END PGP PUBLIC KEY BLOCK-----
