From 3f084dd48ffac58fa3d1563c1afa4f9ae84c4474 Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Tue, 25 Feb 2020 16:02:34 +0100 Subject: [inc/Taskmanager] Reset connection on error --- inc/taskmanager.inc.php | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/inc/taskmanager.inc.php b/inc/taskmanager.inc.php index c8ea9d0c..85d5ee39 100644 --- a/inc/taskmanager.inc.php +++ b/inc/taskmanager.inc.php @@ -36,7 +36,10 @@ class Taskmanager { $len = strlen($message); $sent = socket_send(self::$sock, pack('N', $len) . $message, $len + 4, 0); - return $sent === $len + 4; + if ($sent === $len + 4) + return true; + self::reset(); + return false; } /** @@ -255,11 +258,13 @@ class Taskmanager while (($bytes = socket_recv(self::$sock, $buf, 4, MSG_WAITALL)) !== false) { if ($bytes !== 4) { error_log('TM: Short read'); + self::reset(); return false; } $len = unpack('Nx', $buf)['x']; if ($len < 0 || $len > 1024 * 1024) { error_log('TM: Invalid payload length: ' . $len); + self::reset(); return false; } $message = ''; @@ -268,10 +273,12 @@ class Taskmanager $ret = socket_recv(self::$sock, $buf, $len, 0); if ($ret === false) { error_log('TM: Error reading payload'); + self::reset(); return false; } if ($ret <= 0) { error_log('TM: Taskmanager closed connection'); + self::reset(); return false; } $message .= $buf; @@ -307,10 +314,24 @@ class Taskmanager if (++$tries > 10) return false; } - error_log('Reading taskmanager reply failed, socket error ' . socket_last_error()); + error_log('TM: Reading reply failed, socket error ' . socket_last_error()); return false; } + /** + * Closes connection and resets the variable. + * Should be called if something goes wrong when + * sending or receiving and the send or receive + * buffer might be in an undefined state. + */ + private static function reset() + { + if (self::$sock === false) + return; + socket_close(self::$sock); + self::$sock = false; + } + /** * @param float $deadline end time */ -- cgit v1.2.3-55-g7522