From c17073e97d8f4577b3fc2e0b457d61f0d75b9f74 Mon Sep 17 00:00:00 2001
From: Cerdic <cedric@yterium.com>
Date: Mon, 27 Nov 2023 14:35:16 +0100
Subject: [PATCH] =?UTF-8?q?fix:=20si=20la=20lecture=20d'un=20stream=20ne?=
 =?UTF-8?q?=20trig=20jamais=20feof,=20se=20fier=20=C3=A0=20fread()=3D=3D?=
 =?UTF-8?q?=3Dfalse=20+=20reduire=20le=20timeout=20pour=20eviter=20de=20de?=
 =?UTF-8?q?grader=20trop=20les=20perf?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Refs: #5769
---
 ecrire/inc/distant.php | 21 +++++++++++++++++++--
 1 file changed, 19 insertions(+), 2 deletions(-)

diff --git a/ecrire/inc/distant.php b/ecrire/inc/distant.php
index 71ce1f9351..d60dfd88f3 100644
--- a/ecrire/inc/distant.php
+++ b/ecrire/inc/distant.php
@@ -761,15 +761,32 @@ function recuperer_body($handle, $taille_max = _INC_DISTANT_MAX_SIZE, $fichier =
 		}
 		$result = 0; // on renvoie la taille du fichier
 	}
+
+	$max_longueur_morceaux = 16384;
 	while (!feof($handle) && $taille < $taille_max) {
-		$res = fread($handle, 16384);
-		$taille += strlen($res);
+		$res = fread($handle, $max_longueur_morceaux);
+		// si feof ne trig pas mais on est à la fin, fread retourne false
+		if ($res === false) {
+			break;
+		}
+
+		$taille_morceau = strlen($res);
+		$taille += $taille_morceau;
+
 		if ($fp) {
 			fwrite($fp, $res);
 			$result = $taille;
 		} else {
 			$result .= $res;
 		}
+
+		// si on a un morceau plus court que taille maxi mais que feof ne trig pas
+		// reduire le timeout par precaution, car on a surement atteint la fin et le prochain fread va sinon durer 10s
+		if (($taille_morceau < $max_longueur_morceaux)
+			&& !feof($handle)
+			&& (_INC_DISTANT_CONNECT_TIMEOUT > 1)) {
+			@stream_set_timeout($handle, 1);
+		}
 	}
 	if ($fp) {
 		spip_fclose_unlock($fp);
-- 
GitLab