Skip to content

Instantly share code, notes, and snippets.

@aurelijus
Created February 5, 2013 11:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save aurelijus/4713758 to your computer and use it in GitHub Desktop.
Save aurelijus/4713758 to your computer and use it in GitHub Desktop.
Segmentation fault
<?php
class Permission implements \Serializable {
protected $id = 3;
public function serialize()
{
return serialize(array($this->id));
}
public function unserialize($serialized)
{
list($this->id) = unserialize($serialized);
}
}
class UserPermission implements \Serializable {
public $permission;
public $webshop;
public function serialize()
{
return serialize(array($this->webshop, $this->permission));
}
public function unserialize($serialized)
{
list($this->webshop, $this->permission) = unserialize($serialized);
}
}
class Webshop implements \Serializable {
protected $id = 13;
public function serialize()
{
return serialize(array($this->id));
}
public function unserialize($serialized)
{
list($this->id) = unserialize($serialized);
}
}
class AbstractToken implements \Serializable {
public $roles;
public function serialize()
{
return serialize(array($this->roles));
}
public function unserialize($serialized)
{
list($this->roles) = unserialize($serialized);
}
}
class UsernamePasswordToken extends AbstractToken {
private $credentials = null;
private $providerKey = null;
public function serialize()
{
return serialize(array($this->credentials, $this->providerKey, parent::serialize()));
}
public function unserialize($str)
{
list($this->credentials, $this->providerKey, $parentStr) = unserialize($str);
parent::unserialize($parentStr);
}
}
$token = new UsernamePasswordToken();
$webshop = new Webshop;
$permission = new Permission;
$roles = array();
for ($i = 0; $i < 2; $i++) {
$roles[$i] = new UserPermission();
$roles[$i]->webshop = $webshop;
$roles[$i]->permission = $permission;
}
$token->roles = $roles;
var_dump(unserialize(serialize($token)));
@aurelijus
Copy link
Author

Cloning object in UserPermission::serialize helps:

public function serialize()
{
    $this->webshop = clone $this->webshop;
    $this->permission = clone $this->permission;
    return serialize(array($this->webshop, $this->permission));
}

@m6w6
Copy link

m6w6 commented Feb 6, 2013

Avoiding parent::(un)serialize() too

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment