Skip to content

Commit 31d2956

Browse files
committed
Fixed bug amphp#25 (Notice: Uninitialized string offset)
WTF MySQL protocol...
1 parent 19e5272 commit 31d2956

File tree

1 file changed

+29
-24
lines changed

1 file changed

+29
-24
lines changed

lib/Processor.php

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -422,31 +422,36 @@ private function parseOk($packet) {
422422
}
423423

424424
if ($this->capabilities & self::CLIENT_SESSION_TRACK) {
425-
$this->connInfo->statusInfo = DataTypes::decodeStringOff($packet, $off);
426-
427-
if ($this->connInfo->statusFlags & StatusFlags::SERVER_SESSION_STATE_CHANGED) {
428-
$sessionState = DataTypes::decodeString(substr($packet, $off), $intlen, $sessionStateLen);
429-
$len = 0;
430-
while ($len < $sessionStateLen) {
431-
$data = DataTypes::decodeString(substr($sessionState, $len + 1), $datalen, $intlen);
432-
433-
switch ($type = DataTypes::decode_int8(substr($sessionState, $len))) {
434-
case SessionStateTypes::SESSION_TRACK_SYSTEM_VARIABLES:
435-
$var = DataTypes::decodeString($data, $varintlen, $strlen);
436-
$this->connInfo->sessionState[SessionStateTypes::SESSION_TRACK_SYSTEM_VARIABLES][$var] = DataTypes::decodeString(substr($data, $varintlen + $strlen));
437-
break;
438-
case SessionStateTypes::SESSION_TRACK_SCHEMA:
439-
$this->connInfo->sessionState[SessionStateTypes::SESSION_TRACK_SCHEMA] = DataTypes::decodeString($data);
440-
break;
441-
case SessionStateTypes::SESSION_TRACK_STATE_CHANGE:
442-
$this->connInfo->sessionState[SessionStateTypes::SESSION_TRACK_STATE_CHANGE] = DataTypes::decodeString($data);
443-
break;
444-
default:
445-
throw new \UnexpectedValueException("$type is not a valid mysql session state type");
446-
}
425+
// Even though it seems required according to 14.1.3.1, there is no length encoded string, i.e. no trailing NULL byte ....???
426+
if (\strlen($packet) > 7) {
427+
$this->connInfo->statusInfo = DataTypes::decodeStringOff($packet, $off);
428+
429+
if ($this->connInfo->statusFlags & StatusFlags::SERVER_SESSION_STATE_CHANGED) {
430+
$sessionState = DataTypes::decodeString(substr($packet, $off), $intlen, $sessionStateLen);
431+
$len = 0;
432+
while ($len < $sessionStateLen) {
433+
$data = DataTypes::decodeString(substr($sessionState, $len + 1), $datalen, $intlen);
434+
435+
switch ($type = DataTypes::decode_int8(substr($sessionState, $len))) {
436+
case SessionStateTypes::SESSION_TRACK_SYSTEM_VARIABLES:
437+
$var = DataTypes::decodeString($data, $varintlen, $strlen);
438+
$this->connInfo->sessionState[SessionStateTypes::SESSION_TRACK_SYSTEM_VARIABLES][$var] = DataTypes::decodeString(substr($data, $varintlen + $strlen));
439+
break;
440+
case SessionStateTypes::SESSION_TRACK_SCHEMA:
441+
$this->connInfo->sessionState[SessionStateTypes::SESSION_TRACK_SCHEMA] = DataTypes::decodeString($data);
442+
break;
443+
case SessionStateTypes::SESSION_TRACK_STATE_CHANGE:
444+
$this->connInfo->sessionState[SessionStateTypes::SESSION_TRACK_STATE_CHANGE] = DataTypes::decodeString($data);
445+
break;
446+
default:
447+
throw new \UnexpectedValueException("$type is not a valid mysql session state type");
448+
}
447449

448-
$len += 1 + $intlen + $datalen;
450+
$len += 1 + $intlen + $datalen;
451+
}
449452
}
453+
} else {
454+
$this->connInfo->statusInfo = "";
450455
}
451456
} else {
452457
$this->connInfo->statusInfo = substr($packet, $off);
@@ -944,7 +949,7 @@ private function goneAway() {
944949
}
945950
$this->closeSocket();
946951
if (null !== $cb = $this->config->restore) {
947-
$cb($this, $this->connectionState < self::READY);
952+
$cb(spl_object_hash($this), $this->connectionState < self::READY);
948953
/* @TODO if packet not completely sent, resend? */
949954
}
950955
}

0 commit comments

Comments
 (0)