diff options
author | David Kalnischkies <david@kalnischkies.de> | 2018-11-29 22:15:28 +0100 |
---|---|---|
committer | David Kalnischkies <david@kalnischkies.de> | 2018-11-29 22:15:28 +0100 |
commit | 64d7e1c568a7f9e7f32d1dee1ab771f924baa28d (patch) | |
tree | a62ca80d187e5fedbda0ea8fc665bfaadd0de53e | |
parent | f313e09d167cc7a83846ac9d4d5d72ba10cc2638 (diff) |
Use quoted tagnames in config dumps
Tagnames in configuration can include spaces (and other nasties) e.g. in
repository-specific configuration options due to Origin/Label
potentially containing a space. The configuration file format supports
parsing quoted as well as encoded spaces, but the output generated by
apt-config and other places which might be feedback into apt via
parsing (e.g. before calling apt-key in our gpgv method) do not quote
and hence produce invalid configuration files.
Changing the default to be an encoded tagname ensures that the output of
dump can be used as a config file, but other users might not expect
this so that is technically a backward-breaking change.
-rw-r--r-- | apt-pkg/cdrom.cc | 2 | ||||
-rw-r--r-- | apt-pkg/contrib/configuration.cc | 2 | ||||
-rw-r--r-- | cmdline/apt-config.cc | 2 | ||||
-rwxr-xr-x | test/integration/test-apt-config | 14 |
4 files changed, 17 insertions, 3 deletions
diff --git a/apt-pkg/cdrom.cc b/apt-pkg/cdrom.cc index 2c3979ff9..151608b28 100644 --- a/apt-pkg/cdrom.cc +++ b/apt-pkg/cdrom.cc @@ -438,7 +438,7 @@ bool pkgCdrom::WriteDatabase(Configuration &Cnf) /* Write out all of the configuration directives by walking the configuration tree */ - Cnf.Dump(Out, NULL, "%f \"%v\";\n", false); + Cnf.Dump(Out, NULL, "%F \"%v\";\n", false); Out.close(); diff --git a/apt-pkg/contrib/configuration.cc b/apt-pkg/contrib/configuration.cc index 76d1b9370..1c000e586 100644 --- a/apt-pkg/contrib/configuration.cc +++ b/apt-pkg/contrib/configuration.cc @@ -728,7 +728,7 @@ bool Configuration::ExistsAny(const char *Name) const /* Dump the entire configuration space */ void Configuration::Dump(ostream& str) { - Dump(str, NULL, "%f \"%v\";\n", true); + Dump(str, NULL, "%F \"%v\";\n", true); } void Configuration::Dump(ostream& str, char const * const root, char const * const formatstr, bool const emptyValue) diff --git a/cmdline/apt-config.cc b/cmdline/apt-config.cc index 252a56833..8ad7cac68 100644 --- a/cmdline/apt-config.cc +++ b/cmdline/apt-config.cc @@ -67,7 +67,7 @@ static bool DoShell(CommandLine &CmdL) static bool DoDump(CommandLine &CmdL) { bool const empty = _config->FindB("APT::Config::Dump::EmptyValue", true); - std::string const format = _config->Find("APT::Config::Dump::Format", "%f \"%v\";\n"); + std::string const format = _config->Find("APT::Config::Dump::Format", "%F \"%v\";\n"); if (CmdL.FileSize() == 1) _config->Dump(cout, NULL, format.c_str(), empty); else diff --git a/test/integration/test-apt-config b/test/integration/test-apt-config index f2068b789..12df63de1 100755 --- a/test/integration/test-apt-config +++ b/test/integration/test-apt-config @@ -34,3 +34,17 @@ testsuccessequal 'nodoc stage1' aptconfig dump --no-empty --format='%v%n' APT::Build-Profiles unset DEB_BUILD_PROFILES testempty aptconfig dump --no-empty --format='%v%n' APT::Build-Profiles + +cat > spaces.conf <<EOF +Spaces::Test::"Foo Bar" "1 1"; +Spaces::Test2::" Bar Baz " "B B" { + A%20B "C C"; + "B C" "A A"; +}; +EOF +testsuccessequal 'Spaces::Test ""; +Spaces::Test::Foo%20Bar "1 1"; +Spaces::Test2 ""; +Spaces::Test2::%20Bar%20Baz%20 "B B"; +Spaces::Test2::%20Bar%20Baz%20::A%20B "C C"; +Spaces::Test2::%20Bar%20Baz%20::B%20C "A A";' aptconfig dump -c spaces.conf Spaces::Test Spaces::Test2 |