From b20ac9f0dfb631c5ff1fd07660400b60e39f282d Mon Sep 17 00:00:00 2001
From: "Committo,Ergo:sum" <esj@rezo.net>
Date: Mon, 15 Oct 2007 12:16:33 +0000
Subject: [PATCH] =?UTF-8?q?Joli=20bug:=20si=20c'est=20l'heure=20de=20renou?=
 =?UTF-8?q?veller=20l'alea=20mais=20que,=20pour=20une=20raison=20ou=20pour?=
 =?UTF-8?q?=20une=20autre,=20le=20cache=20des=20meta=20devient=20inaccessi?=
 =?UTF-8?q?ble=20en=20=C3=A9criture,=20le=20cache=20devient=20faux=20et=20?=
 =?UTF-8?q?le=20nombre=20de=20fichiers=20de=20sessions=20explose.=20On=20b?=
 =?UTF-8?q?linde.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ecrire/inc/flock.php |  6 +++---
 ecrire/inc/meta.php  | 15 ++++++++++-----
 2 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/ecrire/inc/flock.php b/ecrire/inc/flock.php
index 9e47388dce..9fecf5ccf2 100644
--- a/ecrire/inc/flock.php
+++ b/ecrire/inc/flock.php
@@ -184,19 +184,19 @@ function jeune_fichier($fichier, $n)
 // http://doc.spip.org/@supprimer_fichier
 function supprimer_fichier($fichier, $lock=true) {
 	if (!@file_exists($fichier))
-		return;
+		return true;
 
 	if ($lock) {
 		// verrouiller le fichier destination
 		if (!$fp = spip_fopen_lock($fichier, 'a', LOCK_EX))
-			return;
+			return false;
 	
 		// liberer le verrou
 		spip_fclose_unlock($fp);
 	}
 	
 	// supprimer
-	@unlink($fichier);
+	return @unlink($fichier);
 }
 // Supprimer brutalement, si le fichier existe
 // http://doc.spip.org/@spip_unlink
diff --git a/ecrire/inc/meta.php b/ecrire/inc/meta.php
index 11f908ba1d..7a5b15daf1 100644
--- a/ecrire/inc/meta.php
+++ b/ecrire/inc/meta.php
@@ -19,23 +19,28 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 function inc_meta_dist()
 {
 	// Lire les meta, en cache si present, valide et lisible
-	if ($old = jeune_fichier(_FILE_META, 1<<24)
+	if ($new = jeune_fichier(_FILE_META, 1<<24)
 #   AND (@filemtime(_FILE_META) > @filemtime(_DIR_RESTREINT . '.svn/entries'))
 	    AND lire_fichier(_FILE_META, $meta))
 		$GLOBALS['meta'] = @unserialize($meta);
 	// sinon lire en base
 
-	if (!$GLOBALS['meta']) $old = !lire_metas();
+	if (!$GLOBALS['meta']) $new = !lire_metas();
 	// renouveller l'alea au besoin
 	if (test_espace_prive()
 	AND $GLOBALS['meta']
-	AND (time() > _RENOUVELLE_ALEA +  @$GLOBALS['meta']['alea_ephemere_date'])) {
+	    AND (time() >/* _RENOUVELLE_ALEA + */ @$GLOBALS['meta']['alea_ephemere_date'])) {
+	  // si on n'a pas l'acces en ecriture sur le cache,
+	  // ne pas renouveller l'alea sinon le cache devient faux
+		if (supprimer_fichier(_FILE_META)) {
 			include_spip('inc/acces');
 			renouvelle_alea();
+			$new = false; 
+		} else spip_log("impossible d'ecrire dans " . _FILE_META);
 	}
-	// et refaire le cache si on a pu lire
+	// et refaire le cache si on a du lire en base
 
-	if (!$old) ecrire_fichier(_FILE_META, serialize($GLOBALS['meta']));
+	if (!$new) ecrire_fichier(_FILE_META, serialize($GLOBALS['meta']));
 }
 
 // fonctions aussi appelees a l'install ==> spip_query en premiere requete 
-- 
GitLab