diff options
-rw-r--r-- | inc/taskmanager.inc.php | 25 |
1 files 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,11 +314,25 @@ 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 */ private static function updateRecvTimeout($deadline) |