Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package xdg-dbus-proxy for openSUSE:Factory checked in at 2023-10-03 20:14:59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/xdg-dbus-proxy (Old) and /work/SRC/openSUSE:Factory/.xdg-dbus-proxy.new.28202 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "xdg-dbus-proxy" Tue Oct 3 20:14:59 2023 rev:6 rq:1114704 version:0.1.5 Changes: -------- --- /work/SRC/openSUSE:Factory/xdg-dbus-proxy/xdg-dbus-proxy.changes 2023-01-14 00:02:26.669440657 +0100 +++ /work/SRC/openSUSE:Factory/.xdg-dbus-proxy.new.28202/xdg-dbus-proxy.changes 2023-10-03 20:15:36.387240789 +0200 @@ -1,0 +2,8 @@ +Fri Sep 29 06:20:45 UTC 2023 - Bjørn Lie <[email protected]> + +- Update to version 0.1.5: + + Fix handling of object paths > 255 bytes + + Print better errors when message parsing fails + + Optionally install tests for "as-installed" testing + +------------------------------------------------------------------- Old: ---- xdg-dbus-proxy-0.1.4.tar.xz New: ---- xdg-dbus-proxy-0.1.5.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ xdg-dbus-proxy.spec ++++++ --- /var/tmp/diff_new_pack.hnTwGF/_old 2023-10-03 20:15:56.811977439 +0200 +++ /var/tmp/diff_new_pack.hnTwGF/_new 2023-10-03 20:15:56.811977439 +0200 @@ -18,7 +18,7 @@ Name: xdg-dbus-proxy -Version: 0.1.4 +Version: 0.1.5 Release: 0 Summary: Filtering proxy for D-Bus connections License: LGPL-2.1-or-later ++++++ xdg-dbus-proxy-0.1.4.tar.xz -> xdg-dbus-proxy-0.1.5.tar.xz ++++++ ++++ 2842 lines of diff (skipped) ++++ retrying with extended exclude list diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xdg-dbus-proxy-0.1.4/NEWS new/xdg-dbus-proxy-0.1.5/NEWS --- old/xdg-dbus-proxy-0.1.4/NEWS 2022-05-11 11:12:03.000000000 +0200 +++ new/xdg-dbus-proxy-0.1.5/NEWS 2023-08-07 09:54:47.000000000 +0200 @@ -1,3 +1,12 @@ +Changes in 0.1.5 +================ + +Released 2023-08-07 + + * Fix handling of object paths > 255 bytes + * Print better errors when message parsing fails + * Optionally install tests for "as-installed" testing + Changes in 0.1.4 ================ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xdg-dbus-proxy-0.1.4/aminclude_static.am new/xdg-dbus-proxy-0.1.5/aminclude_static.am --- old/xdg-dbus-proxy-0.1.4/aminclude_static.am 2022-05-11 11:15:06.000000000 +0200 +++ new/xdg-dbus-proxy-0.1.5/aminclude_static.am 2023-08-07 09:54:57.000000000 +0200 @@ -1,6 +1,6 @@ # aminclude_static.am generated automatically by Autoconf -# from AX_AM_MACROS_STATIC on Wed May 11 10:15:06 BST 2022 +# from AX_AM_MACROS_STATIC on Mon Aug 7 09:54:57 CEST 2023 # Code coverage diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xdg-dbus-proxy-0.1.4/compile new/xdg-dbus-proxy-0.1.5/compile --- old/xdg-dbus-proxy-0.1.4/compile 1970-01-01 01:00:00.000000000 +0100 +++ new/xdg-dbus-proxy-0.1.5/compile 2018-09-13 09:02:05.000000000 +0200 @@ -0,0 +1,348 @@ +#!/bin/sh +# Wrapper for compilers which do not understand '-c -o'. + +scriptversion=2016-01-11.22; # UTC + +# Copyright (C) 1999-2017 Free Software Foundation, Inc. +# Written by Tom Tromey <[email protected]>. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to <[email protected]> or send patches to +# <[email protected]>. + +nl=' +' + +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent tools from complaining about whitespace usage. +IFS=" "" $nl" + +file_conv= + +# func_file_conv build_file lazy +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. If the determined conversion +# type is listed in (the comma separated) LAZY, no conversion will +# take place. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv/,$2, in + *,$file_conv,*) + ;; + mingw/*) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin/*) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine/*) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_cl_dashL linkdir +# Make cl look for libraries in LINKDIR +func_cl_dashL () +{ + func_file_conv "$1" + if test -z "$lib_path"; then + lib_path=$file + else + lib_path="$lib_path;$file" + fi + linker_opts="$linker_opts -LIBPATH:$file" +} + +# func_cl_dashl library +# Do a library search-path lookup for cl +func_cl_dashl () +{ + lib=$1 + found=no + save_IFS=$IFS + IFS=';' + for dir in $lib_path $LIB + do + IFS=$save_IFS + if $shared && test -f "$dir/$lib.dll.lib"; then + found=yes + lib=$dir/$lib.dll.lib + break + fi + if test -f "$dir/$lib.lib"; then + found=yes + lib=$dir/$lib.lib + break + fi + if test -f "$dir/lib$lib.a"; then + found=yes + lib=$dir/lib$lib.a + break + fi + done + IFS=$save_IFS + + if test "$found" != yes; then + lib=$lib.lib + fi +} + +# func_cl_wrapper cl arg... +# Adjust compile command to suit cl +func_cl_wrapper () +{ + # Assume a capable shell + lib_path= + shared=: + linker_opts= + for arg + do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + eat=1 + case $2 in + *.o | *.[oO][bB][jJ]) + func_file_conv "$2" + set x "$@" -Fo"$file" + shift + ;; + *) + func_file_conv "$2" + set x "$@" -Fe"$file" + shift + ;; + esac + ;; + -I) + eat=1 + func_file_conv "$2" mingw + set x "$@" -I"$file" + shift + ;; + -I*) + func_file_conv "${1#-I}" mingw + set x "$@" -I"$file" + shift + ;; + -l) + eat=1 + func_cl_dashl "$2" + set x "$@" "$lib" + shift + ;; + -l*) + func_cl_dashl "${1#-l}" + set x "$@" "$lib" + shift + ;; + -L) + eat=1 + func_cl_dashL "$2" + ;; + -L*) + func_cl_dashL "${1#-L}" + ;; + -static) + shared=false + ;; + -Wl,*) + arg=${1#-Wl,} + save_ifs="$IFS"; IFS=',' + for flag in $arg; do + IFS="$save_ifs" + linker_opts="$linker_opts $flag" + done + IFS="$save_ifs" + ;; + -Xlinker) + eat=1 + linker_opts="$linker_opts $2" + ;; + -*) + set x "$@" "$1" + shift + ;; + *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) + func_file_conv "$1" + set x "$@" -Tp"$file" + shift + ;; + *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) + func_file_conv "$1" mingw + set x "$@" "$file" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift + done + if test -n "$linker_opts"; then + linker_opts="-link$linker_opts" + fi + exec "$@" $linker_opts + exit 1 +} + +eat= + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: compile [--help] [--version] PROGRAM [ARGS] + +Wrapper for compilers which do not understand '-c -o'. +Remove '-o dest.o' from ARGS, run PROGRAM with the remaining +arguments, and rename the output as expected. + +If you are trying to build a whole package this is not the +right script to run: please start by reading the file 'INSTALL'. + +Report bugs to <[email protected]>. +EOF + exit $? + ;; + -v | --v*) + echo "compile $scriptversion" + exit $? + ;; + cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ + icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) + func_cl_wrapper "$@" # Doesn't return... + ;; +esac + +ofile= +cfile= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + # So we strip '-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no '-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # '.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` + +# Create the lock directory. +# Note: use '[/\\:.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + test "$cofile" = "$ofile" || mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +exit $ret + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xdg-dbus-proxy-0.1.4/configure.ac new/xdg-dbus-proxy-0.1.5/configure.ac --- old/xdg-dbus-proxy-0.1.4/configure.ac 2022-05-11 11:12:57.000000000 +0200 +++ new/xdg-dbus-proxy-0.1.5/configure.ac 2023-08-07 09:54:47.000000000 +0200 @@ -1,6 +1,6 @@ AC_PREREQ([2.63]) -AC_INIT([xdg-dbus-proxy],[0.1.4]) +AC_INIT([xdg-dbus-proxy],[0.1.5]) AC_CONFIG_AUX_DIR([build-aux]) m4_pattern_forbid([^AX_CODE_COVERAGE$], diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xdg-dbus-proxy-0.1.4/flatpak-proxy.c new/xdg-dbus-proxy-0.1.5/flatpak-proxy.c --- old/xdg-dbus-proxy-0.1.4/flatpak-proxy.c 2022-04-23 18:50:29.000000000 +0200 +++ new/xdg-dbus-proxy-0.1.5/flatpak-proxy.c 2023-08-07 09:38:09.000000000 +0200 @@ -1114,23 +1114,43 @@ } static const char * -get_string (Buffer *buffer, Header *header, guint32 *offset, guint32 end_offset) +get_string (Buffer *buffer, Header *header, guint32 *offset, guint32 end_offset, GError **error) { - guint8 len; + guint32 len; char *str; *offset = align_by_4 (*offset); if (*offset + 4 >= end_offset) - return FALSE; + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "String header would align past boundary"); + return FALSE; + } len = read_uint32 (header, &buffer->data[*offset]); *offset += 4; if ((*offset) + len + 1 > end_offset) - return FALSE; + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "String would align past boundary"); + return FALSE; + } if (buffer->data[(*offset) + len] != 0) - return FALSE; + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "String is not nul-terminated (%.*s)", + buffer->data[(*offset) + len], + (char *) &buffer->data[(*offset)]); + return FALSE; + } str = (char *) &buffer->data[(*offset)]; *offset += len + 1; @@ -1146,31 +1166,69 @@ g_free (header); } +static const char * +header_debug_str (GString *s, Header *header) +{ + if (header->path) + g_string_append_printf (s, "\n\tPath: %s", header->path); + if (header->interface) + g_string_append_printf (s, "\n\tInterface: %s", header->interface); + if (header->member) + g_string_append_printf (s, "\n\tMember: %s", header->member); + if (header->error_name) + g_string_append_printf (s, "\n\tError name: %s", header->error_name); + if (header->destination) + g_string_append_printf (s, "\n\tDestination: %s", header->destination); + if (header->sender) + g_string_append_printf (s, "\n\tSender: %s", header->sender); + return s->str; +} + static Header * -parse_header (Buffer *buffer, guint32 serial_offset, guint32 reply_serial_offset, guint32 hello_serial) +parse_header (Buffer *buffer, guint32 serial_offset, guint32 reply_serial_offset, guint32 hello_serial, GError **error) { guint32 array_len, header_len; guint32 offset, end_offset; guint8 header_type; guint32 reply_serial_pos = 0; const char *signature; + g_autoptr(GError) str_error = NULL; + g_autoptr(GString) header_str = NULL; g_autoptr(Header) header = g_new0 (Header, 1); header->buffer = buffer_ref (buffer); if (buffer->size < 16) - return NULL; + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "Buffer too small: %"G_GSIZE_FORMAT, buffer->size); + return NULL; + } if (buffer->data[3] != 1) /* Protocol version */ - return NULL; + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "Wrong protocol version: %d", buffer->data[3]); + return NULL; + } if (buffer->data[0] == 'B') header->big_endian = TRUE; else if (buffer->data[0] == 'l') header->big_endian = FALSE; else - return NULL; + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "Invalid endianess marker: %c", buffer->data[0]); + return NULL; + } header->type = buffer->data[1]; header->flags = buffer->data[2]; @@ -1179,72 +1237,184 @@ header->serial = read_uint32 (header, &buffer->data[8]); if (header->serial == 0) - return NULL; + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "No serial"); + return NULL; + } array_len = read_uint32 (header, &buffer->data[12]); header_len = align_by_8 (12 + 4 + array_len); g_assert (buffer->size >= header_len); /* We should have verified this when reading in the message */ if (header_len > buffer->size) - return NULL; + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "Header len (%d) bigger than buffer size (%"G_GSIZE_FORMAT")", + header_len, buffer->size); + return NULL; + } offset = 12 + 4; end_offset = offset + array_len; + header_str = g_string_new (NULL); + while (offset < end_offset) { offset = align_by_8 (offset); /* Structs must be 8 byte aligned */ if (offset >= end_offset) - return NULL; + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "Struct would align past boundary%s", + header_debug_str (header_str, header)); + return NULL; + } header_type = buffer->data[offset++]; if (offset >= end_offset) - return NULL; + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "Went past boundary after parsing header_type%s", + header_debug_str (header_str, header)); + return NULL; + } signature = get_signature (buffer, &offset, end_offset); if (signature == NULL) - return NULL; + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "Could not parse signature%s", + header_debug_str (header_str, header)); + return NULL; + } switch (header_type) { case G_DBUS_MESSAGE_HEADER_FIELD_INVALID: + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "Field is invalid%s", + header_debug_str (header_str, header)); return NULL; case G_DBUS_MESSAGE_HEADER_FIELD_PATH: if (strcmp (signature, "o") != 0) - return NULL; - header->path = get_string (buffer, header, &offset, end_offset); + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "Signature is invalid for path ('%s')%s", + signature, + header_debug_str (header_str, header)); + return NULL; + } + header->path = get_string (buffer, header, &offset, end_offset, &str_error); if (header->path == NULL) - return NULL; + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "Could not parse path in path field: %s%s", + str_error->message, + header_debug_str (header_str, header)); + return NULL; + } break; case G_DBUS_MESSAGE_HEADER_FIELD_INTERFACE: if (strcmp (signature, "s") != 0) - return NULL; - header->interface = get_string (buffer, header, &offset, end_offset); + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "Signature is invalid for interface ('%s')%s", + signature, + header_debug_str (header_str, header)); + return NULL; + } + header->interface = get_string (buffer, header, &offset, end_offset, &str_error); if (header->interface == NULL) - return NULL; + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "Could not parse interface in interface field: %s%s", + str_error->message, + header_debug_str (header_str, header)); + return NULL; + } break; case G_DBUS_MESSAGE_HEADER_FIELD_MEMBER: if (strcmp (signature, "s") != 0) - return NULL; - header->member = get_string (buffer, header, &offset, end_offset); + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "Signature is invalid for member ('%s')%s", + signature, + header_debug_str (header_str, header)); + return NULL; + } + header->member = get_string (buffer, header, &offset, end_offset, &str_error); if (header->member == NULL) - return NULL; + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "Could not parse member in member field: %s%s", + str_error->message, + header_debug_str (header_str, header)); + return NULL; + } break; case G_DBUS_MESSAGE_HEADER_FIELD_ERROR_NAME: if (strcmp (signature, "s") != 0) - return NULL; - header->error_name = get_string (buffer, header, &offset, end_offset); + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "Signature is invalid for error ('%s')%s", + signature, + header_debug_str (header_str, header)); + return NULL; + } + header->error_name = get_string (buffer, header, &offset, end_offset, &str_error); if (header->error_name == NULL) - return NULL; + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "Could not parse error in error field: %s%s", + str_error->message, + header_debug_str (header_str, header)); + return NULL; + } break; case G_DBUS_MESSAGE_HEADER_FIELD_REPLY_SERIAL: if (offset + 4 > end_offset) - return NULL; + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "Header too small to fit reply serial%s", + header_debug_str (header_str, header)); + return NULL; + } header->has_reply_serial = TRUE; reply_serial_pos = offset; @@ -1254,31 +1424,85 @@ case G_DBUS_MESSAGE_HEADER_FIELD_DESTINATION: if (strcmp (signature, "s") != 0) - return NULL; - header->destination = get_string (buffer, header, &offset, end_offset); + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "Signature is invalid for destination ('%s')%s", + signature, + header_debug_str (header_str, header)); + return NULL; + } + header->destination = get_string (buffer, header, &offset, end_offset, &str_error); if (header->destination == NULL) - return NULL; + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "Could not parse destination in destination field: %s%s", + str_error->message, + header_debug_str (header_str, header)); + return NULL; + } break; case G_DBUS_MESSAGE_HEADER_FIELD_SENDER: if (strcmp (signature, "s") != 0) - return NULL; - header->sender = get_string (buffer, header, &offset, end_offset); + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "Signature is invalid for sender ('%s')%s", + signature, + header_debug_str (header_str, header)); + return NULL; + } + header->sender = get_string (buffer, header, &offset, end_offset, &str_error); if (header->sender == NULL) - return NULL; + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "Could not parse sender in sender field: %s%s", + str_error->message, + header_debug_str (header_str, header)); + return NULL; + } break; case G_DBUS_MESSAGE_HEADER_FIELD_SIGNATURE: if (strcmp (signature, "g") != 0) - return NULL; + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "Signature is invalid for signature ('%s')%s", + signature, + header_debug_str (header_str, header)); + return NULL; + } header->signature = get_signature (buffer, &offset, end_offset); if (header->signature == NULL) - return NULL; + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "Could not parse signature in signature field%s", + header_debug_str (header_str, header)); + return NULL; + } break; case G_DBUS_MESSAGE_HEADER_FIELD_NUM_UNIX_FDS: if (offset + 4 > end_offset) - return NULL; + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "Header too small to fit Unix FDs%s", + header_debug_str (header_str, header)); + return NULL; + } header->unix_fds = read_uint32 (header, &buffer->data[offset]); offset += 4; @@ -1286,6 +1510,12 @@ default: /* Unknown header field, for safety, fail parse */ + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "Unknown header field (%d)%s", + header_type, + header_debug_str (header_str, header)); return NULL; } } @@ -1294,31 +1524,72 @@ { case G_DBUS_MESSAGE_TYPE_METHOD_CALL: if (header->path == NULL || header->member == NULL) - return NULL; + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "Method call is missing path or member%s", + header_debug_str (header_str, header)); + return NULL; + } break; case G_DBUS_MESSAGE_TYPE_METHOD_RETURN: if (!header->has_reply_serial) - return NULL; + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "Method return has no reply serial%s", + header_debug_str (header_str, header)); + return NULL; + } break; case G_DBUS_MESSAGE_TYPE_ERROR: if (header->error_name == NULL || !header->has_reply_serial) - return NULL; + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "Error is missing error name or reply serial%s", + header_debug_str (header_str, header)); + return NULL; + } break; case G_DBUS_MESSAGE_TYPE_SIGNAL: if (header->path == NULL || header->interface == NULL || header->member == NULL) - return NULL; + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "Signal is missing path, interface or member%s", + header_debug_str (header_str, header)); + return NULL; + } if (strcmp (header->path, "/org/freedesktop/DBus/Local") == 0 || strcmp (header->interface, "org.freedesktop.DBus.Local") == 0) - return NULL; + { + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "Signal is to D-Bus Local path or interface%s", + header_debug_str (header_str, header)); + return NULL; + } break; default: /* Unknown message type, for safety, fail parse */ + g_set_error (error, + G_IO_ERROR, + G_IO_ERROR_INVALID_DATA, + "Unknown message type (%d)%s", + header->type, + header_debug_str (header_str, header)); return NULL; } @@ -2163,14 +2434,16 @@ if (client->authenticated && client->proxy->filter) { g_autoptr(Header) header = NULL; + g_autoptr(GError) error = NULL; BusHandler handler; /* Filter and rewrite outgoing messages as needed */ - header = parse_header (buffer, client->serial_offset, 0, 0); + header = parse_header (buffer, client->serial_offset, 0, 0, &error); if (header == NULL) { - g_warning ("Invalid message header format"); + g_warning ("Invalid message header format from client: %s", + error->message); side_closed (side); buffer_unref (buffer); return; @@ -2271,18 +2544,18 @@ if (client_message_generates_reply (header)) { - const char *error; + const char *error_str; if (client->proxy->log_messages) g_print ("*HIDDEN* (ping)\n"); if ((header->destination != NULL && header->destination[0] == ':') || (header->flags & G_DBUS_MESSAGE_FLAGS_NO_AUTO_START) != 0) - error = "org.freedesktop.DBus.Error.NameHasNoOwner"; + error_str = "org.freedesktop.DBus.Error.NameHasNoOwner"; else - error = "org.freedesktop.DBus.Error.ServiceUnknown"; + error_str = "org.freedesktop.DBus.Error.ServiceUnknown"; - buffer = get_error_for_roundtrip (client, header, error); + buffer = get_error_for_roundtrip (client, header, error_str); expecting_reply = EXPECTED_REPLY_REWRITE; } else @@ -2331,16 +2604,18 @@ if (client->authenticated && client->proxy->filter) { g_autoptr(Header) header = NULL; + g_autoptr(GError) error = NULL; GDBusMessage *rewritten; FlatpakPolicy policy; ExpectedReplyType expected_reply; /* Filter and rewrite incoming messages as needed */ - header = parse_header (buffer, 0, client->serial_offset, client->hello_serial); + header = parse_header (buffer, 0, client->serial_offset, client->hello_serial, &error); if (header == NULL) { - g_warning ("Invalid message header format"); + g_warning ("Invalid message header format from bus: %s", + error->message); buffer_unref (buffer); side_closed (side); return; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xdg-dbus-proxy-0.1.4/meson.build new/xdg-dbus-proxy-0.1.5/meson.build --- old/xdg-dbus-proxy-0.1.4/meson.build 2022-05-11 11:13:17.000000000 +0200 +++ new/xdg-dbus-proxy-0.1.5/meson.build 2023-08-07 09:54:47.000000000 +0200 @@ -1,7 +1,7 @@ project( 'xdg-dbus-proxy', 'c', - version : '0.1.4', + version : '0.1.5', meson_version : '>=0.49.0', default_options : [ 'warning_level=2', diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xdg-dbus-proxy-0.1.4/meson_options.txt new/xdg-dbus-proxy-0.1.5/meson_options.txt --- old/xdg-dbus-proxy-0.1.4/meson_options.txt 2022-04-23 18:50:29.000000000 +0200 +++ new/xdg-dbus-proxy-0.1.5/meson_options.txt 2023-08-07 09:38:09.000000000 +0200 @@ -1,4 +1,10 @@ option( + 'installed_tests', + type : 'boolean', + description : 'Build and install "as-installed" tests', + value : 'false', +) +option( 'man', type : 'feature', description : 'generate man pages', diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xdg-dbus-proxy-0.1.4/missing new/xdg-dbus-proxy-0.1.5/missing --- old/xdg-dbus-proxy-0.1.4/missing 1970-01-01 01:00:00.000000000 +0100 +++ new/xdg-dbus-proxy-0.1.5/missing 2018-09-13 09:02:05.000000000 +0200 @@ -0,0 +1,215 @@ +#!/bin/sh +# Common wrapper for a few potentially missing GNU programs. + +scriptversion=2016-01-11.22; # UTC + +# Copyright (C) 1996-2017 Free Software Foundation, Inc. +# Originally written by Fran,cois Pinard <[email protected]>, 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try '$0 --help' for more information" + exit 1 +fi + +case $1 in + + --is-lightweight) + # Used by our autoconf macros to check whether the available missing + # script is modern enough. + exit 0 + ;; + + --run) + # Back-compat with the calling convention used by older automake. + shift + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due +to PROGRAM being missing or too old. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + +Supported PROGRAM values: + aclocal autoconf autoheader autom4te automake makeinfo + bison yacc flex lex help2man + +Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and +'g' are ignored when checking the name. + +Send bug reports to <[email protected]>." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: unknown '$1' option" + echo 1>&2 "Try '$0 --help' for more information" + exit 1 + ;; + +esac + +# Run the given program, remember its exit status. +"$@"; st=$? + +# If it succeeded, we are done. +test $st -eq 0 && exit 0 + +# Also exit now if we it failed (or wasn't found), and '--version' was +# passed; such an option is passed most likely to detect whether the +# program is present and works. +case $2 in --version|--help) exit $st;; esac + +# Exit code 63 means version mismatch. This often happens when the user +# tries to use an ancient version of a tool on a file that requires a +# minimum version. +if test $st -eq 63; then + msg="probably too old" +elif test $st -eq 127; then + # Program was missing. + msg="missing on your system" +else + # Program was found and executed, but failed. Give up. + exit $st +fi + +perl_URL=http://www.perl.org/ +flex_URL=http://flex.sourceforge.net/ +gnu_software_URL=http://www.gnu.org/software + +program_details () +{ + case $1 in + aclocal|automake) + echo "The '$1' program is part of the GNU Automake package:" + echo "<$gnu_software_URL/automake>" + echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/autoconf>" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + autoconf|autom4te|autoheader) + echo "The '$1' program is part of the GNU Autoconf package:" + echo "<$gnu_software_URL/autoconf/>" + echo "It also requires GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + esac +} + +give_advice () +{ + # Normalize program name to check for. + normalized_program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + + printf '%s\n' "'$1' is $msg." + + configure_deps="'configure.ac' or m4 files included by 'configure.ac'" + case $normalized_program in + autoconf*) + echo "You should only need it if you modified 'configure.ac'," + echo "or m4 files included by it." + program_details 'autoconf' + ;; + autoheader*) + echo "You should only need it if you modified 'acconfig.h' or" + echo "$configure_deps." + program_details 'autoheader' + ;; + automake*) + echo "You should only need it if you modified 'Makefile.am' or" + echo "$configure_deps." + program_details 'automake' + ;; + aclocal*) + echo "You should only need it if you modified 'acinclude.m4' or" + echo "$configure_deps." + program_details 'aclocal' + ;; + autom4te*) + echo "You might have modified some maintainer files that require" + echo "the 'autom4te' program to be rebuilt." + program_details 'autom4te' + ;; + bison*|yacc*) + echo "You should only need it if you modified a '.y' file." + echo "You may want to install the GNU Bison package:" + echo "<$gnu_software_URL/bison/>" + ;; + lex*|flex*) + echo "You should only need it if you modified a '.l' file." + echo "You may want to install the Fast Lexical Analyzer package:" + echo "<$flex_URL>" + ;; + help2man*) + echo "You should only need it if you modified a dependency" \ + "of a man page." + echo "You may want to install the GNU Help2man package:" + echo "<$gnu_software_URL/help2man/>" + ;; + makeinfo*) + echo "You should only need it if you modified a '.texi' file, or" + echo "any other file indirectly affecting the aspect of the manual." + echo "You might want to install the Texinfo package:" + echo "<$gnu_software_URL/texinfo/>" + echo "The spurious makeinfo call might also be the consequence of" + echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" + echo "want to install GNU make:" + echo "<$gnu_software_URL/make/>" + ;; + *) + echo "You might have modified some files without having the proper" + echo "tools for further handling them. Check the 'README' file, it" + echo "often tells you about the needed prerequisites for installing" + echo "this package. You may also peek at any GNU archive site, in" + echo "case some other package contains this missing '$1' program." + ;; + esac +} + +give_advice "$1" | sed -e '1s/^/WARNING: /' \ + -e '2,$s/^/ /' >&2 + +# Propagate the correct exit status (expected to be 127 for a program +# not found, 63 for a program that failed due to version mismatch). +exit $st + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xdg-dbus-proxy-0.1.4/tests/Makefile.am.inc new/xdg-dbus-proxy-0.1.5/tests/Makefile.am.inc --- old/xdg-dbus-proxy-0.1.4/tests/Makefile.am.inc 2022-04-23 18:47:31.000000000 +0200 +++ new/xdg-dbus-proxy-0.1.5/tests/Makefile.am.inc 2023-08-07 09:38:09.000000000 +0200 @@ -13,6 +13,7 @@ test_proxy_LDADD = $(COMMON_LIBS) EXTRA_DIST += tests/meson.build +EXTRA_DIST += tests/tap.test.in EXTRA_DIST += tests/use-as-subproject/README EXTRA_DIST += tests/use-as-subproject/config.h EXTRA_DIST += tests/use-as-subproject/dummy-config.h.in diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xdg-dbus-proxy-0.1.4/tests/meson.build new/xdg-dbus-proxy-0.1.5/tests/meson.build --- old/xdg-dbus-proxy-0.1.4/tests/meson.build 2022-04-23 18:47:31.000000000 +0200 +++ new/xdg-dbus-proxy-0.1.5/tests/meson.build 2023-08-07 09:38:09.000000000 +0200 @@ -1,3 +1,7 @@ +enable_installed_tests = get_option('installed_tests') and not meson.is_subproject() +installed_testdir = get_option('libexecdir') / 'installed-tests' / meson.project_name() +installed_tests_metadir = get_option('datadir') / 'installed-tests' / meson.project_name() + test_programs = [ [ 'test-proxy', @@ -6,6 +10,8 @@ 'test-proxy.c', dependencies : common_deps, include_directories : common_include_directories, + install : enable_installed_tests, + install_dir : installed_testdir, ), ], ] @@ -32,4 +38,16 @@ env : test_env, ) endif + + if enable_installed_tests + configure_file( + input : 'tap.test.in', + output : name + '.test', + configuration : { + 'basename' : name, + 'installed_testdir' : get_option('prefix') / installed_testdir, + }, + install_dir : installed_tests_metadir, + ) + endif endforeach diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' --exclude Makefile.in --exclude configure --exclude config.guess --exclude '*.pot' --exclude mkinstalldirs --exclude aclocal.m4 --exclude config.sub --exclude depcomp --exclude install-sh --exclude ltmain.sh old/xdg-dbus-proxy-0.1.4/tests/tap.test.in new/xdg-dbus-proxy-0.1.5/tests/tap.test.in --- old/xdg-dbus-proxy-0.1.4/tests/tap.test.in 1970-01-01 01:00:00.000000000 +0100 +++ new/xdg-dbus-proxy-0.1.5/tests/tap.test.in 2023-08-07 09:38:09.000000000 +0200 @@ -0,0 +1,4 @@ +[Test] +Type=session +Exec=@installed_testdir@/@basename@ --tap +Output=TAP
