Under a non-UTF-8 locale, Chromium returns the parent folder for an accented folder name without raising, so a write meant for that folder replaced a file of the same name in its parent. Each step of a path walk now compares the handle with its parent and refuses NOM_NON_CONVERTI — LECTURE on reads, ECRITURE on writes — and nothing lands elsewhere. The test launcher gives Chromium LANG=C.UTF-8 when the locale is not UTF-8, as the containers do, and the matrix installs ps where an image lacks it. Checked: 1776 node and 45 browser tests; the guard holds under LC_ALL=C. --- FR --- [FIX] stockage web : refuser un nom non converti, lancement en UTF-8 Hors locale UTF-8, Chromium rend le dossier parent pour un nom de dossier accentué, sans lever : une écriture destinée à ce dossier remplaçait un fichier homonyme de son parent. Chaque pas d'un chemin compare désormais le dossier obtenu à son parent et refuse NOM_NON_CONVERTI — LECTURE en lecture, ECRITURE en écriture — : rien n'atterrit ailleurs. Le lanceur des épreuves donne LANG=C.UTF-8 à Chromium quand la locale n'est pas UTF-8, comme les conteneurs, et la matrice installe ps là où une image en manque. Vérifié : 1776 node, 45 navigateur ; la garde tient sous LC_ALL=C. Assisted-by: Claude Opus 5.5
46 lines
2.2 KiB
JavaScript
46 lines
2.2 KiB
JavaScript
// © 2026 TechnoLibre (http://www.technolibre.ca)
|
|
// License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)
|
|
|
|
// Options du Chromium des épreuves du navigateur, que vitest.config.js passe
|
|
// au fournisseur Playwright. Playwright lance par défaut le Chromium qu'il a
|
|
// téléchargé ; GTT_CHROMIUM désigne un autre exécutable. Sous NixOS, où les
|
|
// binaires téléchargés ne démarrent pas, scripts/installation/shell.nix y
|
|
// met celui de nixpkgs.
|
|
//
|
|
// Sous Linux, Chromium convertit le nom d'une entrée de l'OPFS par les
|
|
// paramètres régionaux de son processus : hors UTF-8, un nom hors ASCII ne
|
|
// se convertit pas, et les épreuves du navigateur n'éprouvent plus le
|
|
// stockage. Les paramètres régionaux qui décident de cette conversion sont
|
|
// ceux de LC_CTYPE : LC_ALL, puis LC_CTYPE, puis LANG, la première variable
|
|
// non vide ; aucune, c'est « C ». Quand ils ne sont pas UTF-8, Chromium
|
|
// reçoit une copie de l'environnement sous LANG=C.UTF-8, LC_ALL et LC_CTYPE
|
|
// retirés puisqu'ils l'emporteraient sur LANG, comme
|
|
// scripts/verifier_systemes.sh le lance dans ses conteneurs. Seul le nom des
|
|
// paramètres régionaux se lit : un nom UTF-8 que l'hôte n'a pas générés
|
|
// laisse Chromium sous « C », et l'épreuve de l'OPFS du navigateur nomme
|
|
// alors cette cause. C.UTF-8 vient avec la glibc 2.35 et suivantes, et avec
|
|
// les distributions qui le livrent avant ; l'environnement reçu reste tel
|
|
// quel.
|
|
|
|
// Un nom de paramètres régionaux dont le jeu de caractères est UTF-8 :
|
|
// « fr_CA.UTF-8 », « C.utf8 », « de_DE.UTF-8@euro ».
|
|
const NOM_UTF8 = /\.utf-?8(@[^.]*)?$/i;
|
|
|
|
// Paramètres régionaux de LC_CTYPE que env donne, « C » sans aucun.
|
|
function caracteresDe(env) {
|
|
for (const variable of ['LC_ALL', 'LC_CTYPE', 'LANG']) {
|
|
if (env[variable]) return env[variable];
|
|
}
|
|
return 'C';
|
|
}
|
|
|
|
export function optionsChromium(env) {
|
|
const lancement = {};
|
|
if (env.GTT_CHROMIUM) lancement.executablePath = env.GTT_CHROMIUM;
|
|
if (!NOM_UTF8.test(caracteresDe(env))) {
|
|
lancement.env = { ...env, LANG: 'C.UTF-8' };
|
|
delete lancement.env.LC_ALL;
|
|
delete lancement.env.LC_CTYPE;
|
|
}
|
|
return Object.keys(lancement).length > 0 ? { launchOptions: lancement } : {};
|
|
}
|