Bien que les tests fuzz, j'ai trouvé que c'est possible, en définissant
var=$'\365\\'
, pour que les deux commands suivantes (utilisées pour supprimer tout jusqu'au dernier saut de ligne) se bloquent indéfiniment, consommant 100% de CPU dans Bash 4.2.25 (1) -release (x86_64-pc-linux-gnu):
[ -n "${var##*$'\n'}" ] [[ -n "${var##*$'\n'}" ]]
Le process bash
ne peut pas être interrompu avec SIGINT
( Ctrl – C ou kill -SIGINT $pid
) ou SIGTERM
, mais doit être tué avec SIGKILL
.
J'ai essayé d'inspecter la valeur en utilisant
uniname -bcp <<<"$var"
mais ça aussi. uniname
, cependant, peut être tué avec SIGINT
.
J'ai aussi vérifié d'autres commands de base, mais toutes fonctionnent bien:
echo "$var" printf '%q\n' "$var" touch -- "$var" rm -- "$var"
Que se passe t-il ici? Est-ce reproductible par d'autres? Et ce comportement est-il défini?
C'est un bogue dans bash-4.2
jusqu'au patch 29 dans les locales UTF-8 liées au globbing avec des strings contenant des caractères UTF-8 invalides ( \365\\
).
Vous pouvez également le reproduire avec:
: *$'\365x'
Cela a été corrigé dans le patch 30 , voir la description du patch et la discussion sur la list de diffusion pour plus de détails.