Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package transactional-update for
openSUSE:Factory checked in at 2022-05-18 13:12:47
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/transactional-update (Old)
and /work/SRC/openSUSE:Factory/.transactional-update.new.1538 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "transactional-update"
Wed May 18 13:12:47 2022 rev:87 rq:977663 version:4.0.0~rc4
Changes:
--------
---
/work/SRC/openSUSE:Factory/transactional-update/transactional-update.changes
2022-05-12 22:57:56.280601663 +0200
+++
/work/SRC/openSUSE:Factory/.transactional-update.new.1538/transactional-update.changes
2022-05-18 13:12:53.738647080 +0200
@@ -1,0 +2,11 @@
+Tue May 17 07:59:57 UTC 2022 - Ignaz Forster <[email protected]>
+
+- Version 4.0.0~rc4
+ - Fix building with GCC 12
+ - Fix stack overflow with very long commands / ids [bsc#1196149]
+ - Use separate mount namespace for chroot, allowing overwriting
+ the bind mounts from the update environment - this could have
+ lead to data loss of the bind mount previously
+ - Fix C error and exception handling for snapshots
+
+-------------------------------------------------------------------
Old:
----
transactional-update-4.0.0~rc3.tar.gz
New:
----
transactional-update-4.0.0~rc4.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ transactional-update.spec ++++++
--- /var/tmp/diff_new_pack.dC0qg8/_old 2022-05-18 13:12:54.198647485 +0200
+++ /var/tmp/diff_new_pack.dC0qg8/_new 2022-05-18 13:12:54.198647485 +0200
@@ -26,14 +26,14 @@
%{!?_distconfdir: %global _distconfdir %{_prefix}%{_sysconfdir}}
Name: transactional-update
-Version: 4.0.0~rc3
+Version: 4.0.0~rc4
Release: 0
Summary: Transactional Updates with btrfs and snapshots
License: GPL-2.0-or-later AND LGPL-2.1-or-later
Group: System/Base
URL: https://github.com/openSUSE/transactional-update
#Source0: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz
-Source0: transactional-update-4.0.0~rc3.tar.gz
+Source0: transactional-update-4.0.0~rc4.tar.gz
Source1: transactional-update.check
BuildRequires: autoconf
++++++ transactional-update-4.0.0~rc3.tar.gz ->
transactional-update-4.0.0~rc4.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/transactional-update-4.0.0~rc3/NEWS
new/transactional-update-4.0.0~rc4/NEWS
--- old/transactional-update-4.0.0~rc3/NEWS 2022-05-03 12:42:30.000000000
+0200
+++ new/transactional-update-4.0.0~rc4/NEWS 2022-05-17 09:50:33.000000000
+0200
@@ -2,6 +2,14 @@
Copyright (C) 2016-2021 Thorsten Kukuk, Ignaz Forster et al.
+Version 4.0.0~rc4
+* Fix building with GCC 12
+* Fix stack overflow with very long commands / ids [bsc#1196149]
+* Use separate mount namespace for chroot, allowing overwriting the bind
+ mounts from the update environment - this could have lead to data loss
+ of the bind mount previously
+* Fix C error and exception handling for snapshots
+
Version 4.0.0~rc3
* Add Snapshot interface
* Reworked signal handling: All public signals are sent from the
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/transactional-update-4.0.0~rc3/configure
new/transactional-update-4.0.0~rc4/configure
--- old/transactional-update-4.0.0~rc3/configure 2022-05-03
12:42:58.000000000 +0200
+++ new/transactional-update-4.0.0~rc4/configure 2022-05-17
09:53:37.000000000 +0200
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.71 for transactional-update 4.0.0~rc3.
+# Generated by GNU Autoconf 2.71 for transactional-update 4.0.0~rc4.
#
#
# Copyright (C) 1992-1996, 1998-2017, 2020-2021 Free Software Foundation,
@@ -618,8 +618,8 @@
# Identity of this package.
PACKAGE_NAME='transactional-update'
PACKAGE_TARNAME='transactional-update'
-PACKAGE_VERSION='4.0.0~rc3'
-PACKAGE_STRING='transactional-update 4.0.0~rc3'
+PACKAGE_VERSION='4.0.0~rc4'
+PACKAGE_STRING='transactional-update 4.0.0~rc4'
PACKAGE_BUGREPORT=''
PACKAGE_URL=''
@@ -1425,7 +1425,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 transactional-update 4.0.0~rc3 to adapt to many kinds
of systems.
+\`configure' configures transactional-update 4.0.0~rc4 to adapt to many kinds
of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1498,7 +1498,7 @@
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of transactional-update
4.0.0~rc3:";;
+ short | recursive ) echo "Configuration of transactional-update
4.0.0~rc4:";;
esac
cat <<\_ACEOF
@@ -1646,7 +1646,7 @@
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-transactional-update configure 4.0.0~rc3
+transactional-update configure 4.0.0~rc4
generated by GNU Autoconf 2.71
Copyright (C) 2021 Free Software Foundation, Inc.
@@ -2026,7 +2026,7 @@
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by transactional-update $as_me 4.0.0~rc3, which was
+It was created by transactional-update $as_me 4.0.0~rc4, which was
generated by GNU Autoconf 2.71. Invocation command line was
$ $0$ac_configure_args_raw
@@ -3633,7 +3633,7 @@
# Define the identity of the package.
PACKAGE='transactional-update'
- VERSION='4.0.0~rc3'
+ VERSION='4.0.0~rc4'
printf "%s\n" "#define PACKAGE \"$PACKAGE\"" >>confdefs.h
@@ -22154,7 +22154,7 @@
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by transactional-update $as_me 4.0.0~rc3, which was
+This file was extended by transactional-update $as_me 4.0.0~rc4, which was
generated by GNU Autoconf 2.71. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -22213,7 +22213,7 @@
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config='$ac_cs_config_escaped'
ac_cs_version="\\
-transactional-update config.status 4.0.0~rc3
+transactional-update config.status 4.0.0~rc4
configured by $0, generated by GNU Autoconf 2.71,
with options \\"\$ac_cs_config\\"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/transactional-update-4.0.0~rc3/configure.ac
new/transactional-update-4.0.0~rc4/configure.ac
--- old/transactional-update-4.0.0~rc3/configure.ac 2022-05-03
12:42:30.000000000 +0200
+++ new/transactional-update-4.0.0~rc4/configure.ac 2022-05-17
09:52:31.000000000 +0200
@@ -1,5 +1,5 @@
dnl Process this file with autoconf to produce a configure script.
-AC_INIT(transactional-update, 4.0.0~rc3)
+AC_INIT(transactional-update, 4.0.0~rc4)
# Increase on any interface change and reset revision
LIBTOOL_CURRENT=4
# Increase or reset on any VERSION update
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/transactional-update-4.0.0~rc3/dbus/tukitd.c
new/transactional-update-4.0.0~rc4/dbus/tukitd.c
--- old/transactional-update-4.0.0~rc3/dbus/tukitd.c 2022-05-03
12:42:30.000000000 +0200
+++ new/transactional-update-4.0.0~rc4/dbus/tukitd.c 2022-05-17
09:43:52.000000000 +0200
@@ -140,13 +140,12 @@
int ret = 0;
int exec_ret = 0;
wordexp_t p;
+ const char* transaction = NULL;
struct execute_args* ea = (struct execute_args*)args;
struct tukit_tx* tx = ea->transaction;
- char command[strlen(ea->command) + 1];
- strcpy(command, ea->command);
- char rebootmethod[strlen(ea->rebootmethod) + 1];
- strcpy(rebootmethod, ea->rebootmethod);
+ char *command = strdup(ea->command);
+ char *rebootmethod = strdup(ea->rebootmethod);
enum transactionstates *state = ea->state;
@@ -157,7 +156,12 @@
// avoid timeouts.
sd_bus *bus = NULL;
- const char* transaction = tukit_tx_get_snapshot(tx);
+ if (command == NULL || rebootmethod == NULL) {
+ send_error_signal(bus, rebootmethod, "Error during strdup.", -ENOMEM);
+ goto finish_execute;
+ }
+
+ transaction = tukit_tx_get_snapshot(tx);
if (tx == NULL) {
send_error_signal(bus, transaction, tukit_get_errmsg(), -1);
goto finish_execute;
@@ -210,6 +214,8 @@
sd_bus_flush_close_unref(bus);
tukit_free_tx(tx);
free((void*)transaction);
+ free(command);
+ free(rebootmethod);
return (void*)(intptr_t) ret;
}
@@ -347,12 +353,11 @@
int ret = 0;
int exec_ret = 0;
wordexp_t p;
+ struct tukit_tx* tx = NULL;
struct call_args* ea = (struct call_args*)args;
- char transaction[strlen(ea->transaction) + 1];
- strcpy(transaction, ea->transaction);
- char command[strlen(ea->command) + 1];
- strcpy(command, ea->command);
+ char *transaction = strdup(ea->transaction);
+ char *command = strdup(ea->command);
int chrooted = ea->chrooted;
enum transactionstates *state = ea->state;
@@ -365,7 +370,12 @@
// avoid timeouts.
sd_bus *bus = NULL;
- struct tukit_tx* tx = tukit_new_tx();
+ if (command == NULL || transaction == NULL) {
+ send_error_signal(bus, transaction, "Error during strdup.", -ENOMEM);
+ goto finish_execute;
+ }
+
+ tx = tukit_new_tx();
if (tx == NULL) {
send_error_signal(bus, transaction, tukit_get_errmsg(), -1);
goto finish_execute;
@@ -412,6 +422,8 @@
finish_execute:
sd_bus_flush_close_unref(bus);
tukit_free_tx(tx);
+ free(transaction);
+ free(command);
return (void*)(intptr_t) ret;
}
@@ -573,6 +585,9 @@
char *columns;
size_t list_len = 0;
int columnnum = 1;
+ int ret = 0;
+ struct tukit_sm_list* list = NULL;
+ sd_bus_message *message = NULL;
if (sd_bus_message_read(m, "s", &columns) < 0) {
sd_bus_error_set_const(ret_error, "org.opensuse.tukit.Error", "Could
not read D-Bus parameters.");
@@ -582,44 +597,49 @@
for (int i=0; i < INT_MAX && columns[i]; i++)
columnnum += (columns[i] == ',');
- struct tukit_sm_list* list = tukit_sm_get_list(&list_len, columns);
+ if ((list = tukit_sm_get_list(&list_len, columns)) == NULL) {
+ sd_bus_error_set_const(ret_error, "org.opensuse.tukit.Error",
tukit_get_errmsg());
+ ret = -1;
+ goto finish_snapshotlist;
+ }
- sd_bus_message *message = NULL;
- if (sd_bus_message_new_method_return(m, &message) < 0) {
+ if ((ret = sd_bus_message_new_method_return(m, &message)) < 0) {
sd_bus_error_set_const(ret_error, "org.opensuse.tukit.Error",
"Creating new return method failed.");
- return -1;
+ goto finish_snapshotlist;
}
- if (sd_bus_message_open_container(message, SD_BUS_TYPE_ARRAY, "as") < 0 ) {
+ if ((ret = sd_bus_message_open_container(message, SD_BUS_TYPE_ARRAY,
"as")) < 0 ) {
sd_bus_error_set_const(ret_error, "org.opensuse.tukit.Error",
"Creating container (array of snapshots) failed.");
- return -1;
+ goto finish_snapshotlist;
}
for (int i=0; i < list_len; i++) {
- if (sd_bus_message_open_container(message, SD_BUS_TYPE_ARRAY, "s") < 0
) {
+ if ((ret = sd_bus_message_open_container(message, SD_BUS_TYPE_ARRAY,
"s")) < 0 ) {
sd_bus_error_set_const(ret_error, "org.opensuse.tukit.Error",
"Creating container (array of snapshot data) failed.");
- return -1;
+ goto finish_snapshotlist;
}
for (int j=0; j < columnnum; j++) {
- if (sd_bus_message_append(message, "s",
tukit_sm_get_list_value(list, i, j)) < 0) {
+ if ((ret = sd_bus_message_append(message, "s",
tukit_sm_get_list_value(list, i, j))) < 0) {
sd_bus_error_set_const(ret_error, "org.opensuse.tukit.Error",
"Couldn't append to message (container).");
- return -1;
+ goto finish_snapshotlist;
}
}
- if (sd_bus_message_close_container(message) < 0) {
+ if ((ret = sd_bus_message_close_container(message)) < 0) {
sd_bus_error_set_const(ret_error, "org.opensuse.tukit.Error",
"Closing container (array of snapshot data) failed.");
- return -1;
+ goto finish_snapshotlist;
}
}
- if (sd_bus_message_close_container(message) < 0) {
+ if ((ret = sd_bus_message_close_container(message)) < 0) {
sd_bus_error_set_const(ret_error, "org.opensuse.tukit.Error", "Closing
container (array of snapshot data) failed.");
- return -1;
+ goto finish_snapshotlist;
}
- if (sd_bus_send(sd_bus_message_get_bus(message), message, NULL) < 0) {
+ if ((ret = sd_bus_send(sd_bus_message_get_bus(message), message, NULL)) <
0) {
sd_bus_error_set_const(ret_error, "org.opensuse.tukit.Error", "Sending
message failed.");
- return -1;
+ goto finish_snapshotlist;
}
+
+finish_snapshotlist:
sd_bus_message_unref(message);
tukit_free_sm_list(list);
- return 0;
+ return ret;
}
int event_handler(sd_event_source *s, const struct signalfd_siginfo *si, void
*userdata) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/transactional-update-4.0.0~rc3/lib/Bindings/CBindings.cpp
new/transactional-update-4.0.0~rc4/lib/Bindings/CBindings.cpp
--- old/transactional-update-4.0.0~rc3/lib/Bindings/CBindings.cpp
2022-05-03 12:42:30.000000000 +0200
+++ new/transactional-update-4.0.0~rc4/lib/Bindings/CBindings.cpp
2022-05-17 09:43:52.000000000 +0200
@@ -11,6 +11,7 @@
#include <exception>
#include <thread>
#include <string.h>
+#include <vector>
using namespace TransactionalUpdate;
thread_local std::string errmsg;
@@ -163,7 +164,14 @@
tukit_sm_list tukit_sm_get_list(size_t* len, const char* columns) {
std::unique_ptr<TransactionalUpdate::SnapshotManager> snapshotMgr =
TransactionalUpdate::SnapshotFactory::get();
- auto list = snapshotMgr->getList(columns);
+ std::deque<std::map<std::string,std::string>> list;
+ try {
+ list = snapshotMgr->getList(columns);
+ } catch (const std::exception &e) {
+ fprintf(stderr, "ERROR: %s\n", e.what());
+ errmsg = e.what();
+ return nullptr;
+ }
*len = list.size();
std::string cols(columns);
const size_t numColumns = std::count(cols.begin(), cols.end(), ',') + 1;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/transactional-update-4.0.0~rc3/lib/Transaction.cpp
new/transactional-update-4.0.0~rc4/lib/Transaction.cpp
--- old/transactional-update-4.0.0~rc3/lib/Transaction.cpp 2022-05-03
12:42:30.000000000 +0200
+++ new/transactional-update-4.0.0~rc4/lib/Transaction.cpp 2022-05-17
09:43:52.000000000 +0200
@@ -26,6 +26,7 @@
#include <sched.h>
#include <signal.h>
#include <sys/inotify.h>
+#include <sys/mount.h>
#include <sys/wait.h>
#include <unistd.h>
#include <utime.h>
@@ -38,7 +39,7 @@
class Transaction::impl {
public:
void addSupplements();
- void mount();
+ void snapMount();
int runCommand(char* argv[], bool inChroot, std::string* buffer);
static int inotifyAdd(const char *pathname, const struct stat *sbuf, int
type, struct FTW *ftwb);
int inotifyRead();
@@ -87,7 +88,7 @@
return pImpl->snapshot->getRoot();
}
-void Transaction::impl::mount() {
+void Transaction::impl::snapMount() {
if (unshare(CLONE_NEWNS) < 0) {
throw std::runtime_error{"Creating new mount namespace failed: " +
std::string(strerror(errno))};
}
@@ -228,7 +229,7 @@
fs::copy(fs::path{getRoot() / "etc" / "fstab"}, overlay.upperdir,
fs::copy_options::overwrite_existing);
}
- pImpl->mount();
+ pImpl->snapMount();
pImpl->addSupplements();
if (pImpl->discardIfNoChange) {
// Flag file to indicate this snapshot was initialized with discard
flag
@@ -242,7 +243,7 @@
pImpl->snapshot.reset();
throw std::invalid_argument{"Snapshot " + id + " is not an open
transaction."};
}
- pImpl->mount();
+ pImpl->snapMount();
pImpl->addSupplements();
if (fs::exists(getRoot() / "discardIfNoChange")) {
pImpl->discardIfNoChange = true;
@@ -331,6 +332,13 @@
if (chroot(snapshot->getRoot().c_str()) < 0) {
throw std::runtime_error{"Chrooting to " +
std::string(snapshot->getRoot()) + " failed: " + std::string(strerror(errno))};
}
+ // Prevent mounts from within the chroot environment influence the
tukit organized mounts
+ if (unshare(CLONE_NEWNS) < 0) {
+ throw std::runtime_error{"Creating new mount namespace failed:
" + std::string(strerror(errno))};
+ }
+ if (mount("none", "/", NULL, MS_REC|MS_PRIVATE, NULL) < 0) {
+ throw std::runtime_error{"Setting private mount for command
execution failed: " + std::string(strerror(errno))};
+ }
}
// Set indicator for RPM pre/post sections to detect whether we run in
a