La migration des logos echoue si il y a des logos SVG
En tout cas dans certains cas, constatés sur la migration d'un site local.
L'ajout du logo svg via ajouter_documents()
déclenche une sanitization, laquelle se finit par un ecrire_fichier()
https://git.spip.net/spip/medias/src/branch/master/sanitizer/svg.php#L88
Manque de chance, le ecrire_fichier()
echoue lorsqu'il essaye de poser le lock dès le début
https://git.spip.net/spip/spip/src/branch/master/ecrire/inc/flock.php#L222
Je pense que c'est parce que c'est immédiatement après un rename()
ou copy()
En tout cas le patch suivant fixe le problème
diff --git a/ecrire/action/editer_logo.php b/ecrire/action/editer_logo.php
index 3583cd0ee..194bd3087 100644
--- a/ecrire/action/editer_logo.php
+++ b/ecrire/action/editer_logo.php
@@ -150,6 +150,14 @@ function logo_modifier($objet, $id_objet, $etat, $source) {
}
function logo_migrer_en_base($objet, $time_limit) {
+ if (!$tmp_dir = tempnam(_DIR_TMP, 'tmp_upload')) {
+ $tmp_dir = _DIR_TMP;
+ }
+ else {
+ spip_unlink($tmp_dir);
+ @mkdir($tmp_dir);
+ $tmp_dir .= '/';
+ }
$dir_logos_erreurs = sous_repertoire(_DIR_IMG, 'logo_erreurs');
$dir_logos = sous_repertoire(_DIR_IMG, 'logo');
@@ -233,9 +241,10 @@ function logo_migrer_en_base($objet, $time_limit) {
$date_modif = null;
}
// logo_modifier commence par supprimer le logo existant, donc on le deplace pour pas le perdre
- @rename($d, $dir_logos . $nom);
+ @rename($d, $tmp_dir . $nom);
// et on le declare comme nouveau logo
- logo_modifier($objet, $id_objet, $mode, $dir_logos . $nom);
+ logo_modifier($objet, $id_objet, $mode, $tmp_dir . $nom);
+ @unlink($tmp_dir . $nom);
if ($date_modif) {
sql_updateq($table, ['date_modif' => $date_modif], "$_id_objet=$id_objet");
}
@@ -259,6 +268,7 @@ function logo_migrer_en_base($objet, $time_limit) {
if ($time_limit and time() > $time_limit) {
effacer_meta('drapeau_edition');
+ spip_unlink($tmp_dir);
return;
}
}
@@ -269,5 +279,6 @@ function logo_migrer_en_base($objet, $time_limit) {
}
$GLOBALS['meta']['articles_modif'] = $articles_modif;
+ spip_unlink($tmp_dir);
effacer_meta('drapeau_edition');
}