@@ -422,31 +422,36 @@ private function parseOk($packet) {
422
422
}
423
423
424
424
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
+ }
447
449
448
- $ len += 1 + $ intlen + $ datalen ;
450
+ $ len += 1 + $ intlen + $ datalen ;
451
+ }
449
452
}
453
+ } else {
454
+ $ this ->connInfo ->statusInfo = "" ;
450
455
}
451
456
} else {
452
457
$ this ->connInfo ->statusInfo = substr ($ packet , $ off );
@@ -944,7 +949,7 @@ private function goneAway() {
944
949
}
945
950
$ this ->closeSocket ();
946
951
if (null !== $ cb = $ this ->config ->restore ) {
947
- $ cb ($ this , $ this ->connectionState < self ::READY );
952
+ $ cb (spl_object_hash ( $ this ) , $ this ->connectionState < self ::READY );
948
953
/* @TODO if packet not completely sent, resend? */
949
954
}
950
955
}
0 commit comments