[SRU] py3clean fails when using alternate character set
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
cloud-init (Ubuntu) |
New
|
Undecided
|
Unassigned | ||
Jammy |
Invalid
|
Undecided
|
Unassigned | ||
Noble |
Fix Committed
|
Undecided
|
Unassigned | ||
dh-python (Ubuntu) |
Invalid
|
Undecided
|
Unassigned | ||
Jammy |
Invalid
|
Undecided
|
Unassigned | ||
Noble |
Invalid
|
Undecided
|
Unassigned | ||
python3-defaults (Ubuntu) |
Confirmed
|
Critical
|
Matthias Klose | ||
Jammy |
Fix Committed
|
Critical
|
Unassigned | ||
Noble |
Fix Committed
|
Critical
|
Unassigned | ||
ubuntu-advantage-tools (Ubuntu) |
New
|
Undecided
|
Unassigned | ||
Jammy |
Invalid
|
Undecided
|
Unassigned | ||
Noble |
New
|
Undecided
|
Unassigned |
Bug Description
[ Impact ]
With the current version of python3-defaults in jammy and noble, packages which utilize py3compile and py3clean in their maintscripts (which is more or less any package which includes Python modules), and which also are affected by diversions installed by dpkg-divert, will fail to install/
As this has the potential to break apt upgrade, the impact is quite severe (especially if this occurs during a dist-upgrade). However, the scope is probably *fairly* limited given this only affects systems with non-UTF-8 locales (something that has not been the default for many years), and which produce non-ASCII output (e.g. French characters with diacriticals) in their localized messages for dpkg -L.
[ Rectification Plan ]
Firstly, python3-defaults must be patched in oracular, noble, and jammy. doko has uploaded the fix upstream and synced this to oracular. Benjamin has sponsored the noble and jammy SRUs.
Next, affected packages must be patched to include a "Breaks" line on earlier versions of python3-minimal (the python3-defaults binary package containing py3clean and py3compile).
Packages which install Python modules are easily selected, but those affected by diversions are (computationally) impossible to select (see comment 18 for details). Thus, determining the set of affected packages was non-trivial, but Benjamin has kindly produced such a list by empirical means (see comment 24). These will be added to the ticket as they are uploaded.
[ Known affected packages ]
```
$ for section in main restricted universe multiverse; do echo "noble $section:"; sqlite3 affected.sqlite3 "SELECT package, source FROM package_affected WHERE section = '$section' and install_affected = 1 AND (remove_affected = 1 OR remove_affected ISNULL) ORDER BY package;"; echo; done
noble main:
cloud-init|
nvme-stas|nvme-stas
python3-
targetcli-
ubiquity|ubiquity
ubiquity-
ubiquity-
ubuntu-
ubuntu-
walinuxagent|
noble restricted:
noble universe:
a2d|a2d
apertium-
blueman|blueman
borgmatic|borgmatic
condor|condor
cpupower-
debomatic|debomatic
dell-recovery|
deluge-web|deluge
depthcharge-
dhcpy6d|dhcpy6d
dkimpy-
fenrir|fenrir
galileo|galileo
glances|glances
graphite-
grokmirror|
guerillabackup|
ionit|ionit
jupyterhub|
liquidctl|liquidctl
localslackirc|
logdata-
lomiri|lomiri
mailman3|mailman3
mailman3-
matrix-
mom|mom
mopidy|mopidy
mpd-sima|mpd-sima
nordugrid-
notus-scanner|
nrpe-ng|nrpe-ng
onionprobe|
openscap-
ospd-openvas|
pagekite|pagekite
pagure|pagure
pagure-
pagure-
pglistener|
policyd-
postfix-
powa-collector|
prelude-
prometheus-
prometheus-
pyroman|pyroman
python3-
python3-
python3-pyro5|pyro5
qweborf|weborf
razercfg|razercfg
sgt-launcher|
sms4you|sms4you
supervisor|
syncplay-
timekpr-
twms|twms
ubiquity-
vanguards|vanguards
vaultlocker|
voctomix-
xdiagnose|xdiagnose
noble multiverse:
r4d|r4d
virtualbox|
```
On Ubuntu 22.04 (jammy) only packages in universe are affected:
```
$ sqlite3 affected-
ganeti-3.0|ganeti
sgt-launcher|
```
Note: Due to time constraints, 3861/59351 (6 %) universe package haven't been analyzed.
Code and resulting database can be found on https:/
[ Test Plan ]
Where $series is jammy or noble as appropriate, and $package is the name of the affected package being SRU'd:
$ lxc launch ubuntu:$series py3clean-test
$ lxc shell py3clean-test
# locale-gen fr_FR
Generating locales (this might take a while)...
fr_FR.
Generation complete.
# update-locale LANG=fr_FR
# exit
# adjust terminal to ISO-8859-1
$ lxc shell py3clean-test
# apt update && apt install --reinstall $package
With the current version of python3-defaults in jammy and noble this should fail at the final apt install --reinstall step. With the proposed version, it should succeed.
[ What Could Go Wrong? ]
The potential for regression is low since the python3-defaults changes are minimal and have been reasonably tested, and the only change to affected packages is the addition of a Breaks clause (i.e. the content of the packages are unaffected, just the meta-data).
The major cause for concern is that we are not 100% certain that the Breaks addition is sufficient to fix this. The Debian policy manual is ambiguous as to whether Breaks implies that the fixed package must be unpacked *before* the prerm maintscript of the package it breaks is executed; the policy manual mentions this must happen before the "unpack" phase, but prerm scripts run *before* the unpack phase. However, in all experiments run so far, this did indeed resolve the problem.
Still, as an extra hedge against failure here, we intend that the python3-defaults SRU is released ASAP, and that we then delay a week to allow it to propagate before releasing SRUs for the affected packages.
[ Original Description ]
We noticed this in bug 2060769 but think it is a separate issue.
dh_python3 is putting a py3clean invocation into package prerm maintainer scripts. When that runs, it explodes if the system character set is for example ISO-8859-1.
This appears to affect every package for which dh_python3 has inserted a call to py3clean into the package prerm.
python3-minimal 3.12.3-0ubuntu1
In this reproducer, cloud-init is at 24.1.3-0ubuntu3.3.
Steps to reproduce:
$ lxc launch ubuntu:noble rbasak-pro-l8n
$ lxc shell rbasak-pro-l8n
# locale-gen fr_FR
Generating locales (this might take a while)...
fr_FR.
Generation complete.
# update-locale LANG=fr_FR
# exit
# adjust terminal to ISO-8859-1
$ lxc shell rbasak-pro-l8n
# apt update && apt install --reinstall cloud-init
Expected results: success
Actual results:
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances... Fait
Lecture des informations d'état... Fait
0 mis à jour, 0 nouvellement installés, 1 réinstallés, 0 à enlever et 5 non mis à jour.
Il est nécessaire de prendre 598 ko dans les archives.
Après cette opération, 0 o d'espace disque supplémentaires seront utilisés.
Réception de :1 http://
598 ko réceptionnés en 1s (926 ko/s)
Préconfiguration des paquets...
(Lecture de la base de données... 34406 fichiers et répertoires déjà installés.)
Préparation du dépaquetage de .../cloud-
Traceback (most recent call last):
File "/usr/bin/
main()
File "/usr/bin/
pfiles = set(dpf.
File "/usr/share/
stdout = str(stdout, 'utf-8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9 in position 2417: invalid continuation byte
dpkg: avertissement: le sous-processus ancien paquet cloud-init script pre-removal a renvoyé un état de sortie d'erreur 1
dpkg: tentative d'exécution du script du nouveau paquet à la place...
Traceback (most recent call last):
File "/usr/bin/
main()
File "/usr/bin/
pfiles = set(dpf.
File "/usr/share/
stdout = str(stdout, 'utf-8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9 in position 2417: invalid continuation byte
dpkg: erreur de traitement de l'archive /var/cache/
le sous-processus nouveau cloud-init paquet pre-removal script a renvoyé un état de sortie d'erreur 1
dmesg: read kernel buffer failed: Operation not permitted
File "/usr/bin/
main()
File "/usr/bin/
compile(files, versions,
File "/usr/bin/
for fn, versions_to_compile in filter_files(files, e_patterns, versions):
File "/usr/bin/
for fpath in files:
File "/usr/share/
for fn in files:
File "/usr/share/
stdout = str(stdout, 'utf-8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9 in position 2417: invalid continuation byte
dpkg: erreur lors du nettoyage:
le sous-processus paquet cloud-init script post-installation installé a renvoyé un état de sortie d'erreur 1
Des erreurs ont été rencontrées pendant l'exécution :
/var/cache/
E: Sub-process /usr/bin/dpkg returned an error code (1)
tags: | added: patch |
Changed in python3-defaults (Ubuntu): | |
assignee: | nobody → Matthias Klose (doko) |
Changed in cloud-init (Ubuntu Jammy): | |
status: | New → Invalid |
Changed in ubuntu-advantage-tools (Ubuntu Jammy): | |
status: | New → Invalid |
summary: |
- py3clean fails when using alternate character set + [SRU] py3clean fails when using alternate character set |
description: | updated |
Investigating this a bit further, /usr/share/ python3/ debpython/ files.py is calling "dpkg -L <package>" and when that fails to decode as UTF-8 we get the error.
I tried that for cloud-init and this in stdout for "dpkg -L cloud-init":
/etc/systemd/ system/ sshd-keygen@ .service. d/disable- sshd-keygen- if-cloud- init-active. conf
/lib
détourné par base-files vers : /lib.usr-is-merged
/lib/systemd
/lib/systemd/system
So it seems that the issue only occurs if it lists a diversion (such as the base-files usrmerge diversion) in the output and that is being translated out of ASCII 7-bit.