Skip to content

Commit 899a833

Browse files
authored
Merge pull request #20243 from erickskrauch/fix_behaviors_attachment
Fix restored vulnerability after #20232
2 parents 964fe57 + 05a8fbe commit 899a833

File tree

2 files changed

+34
-6
lines changed

2 files changed

+34
-6
lines changed

Diff for: framework/base/Component.php

+3-1
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,9 @@ public function __set($name, $value)
190190
$name = trim(substr($name, 3));
191191
if ($value instanceof Behavior) {
192192
$this->attachBehavior($name, $value);
193-
} elseif ((isset($value['class']) && is_subclass_of($value['class'], Behavior::class)) || (isset($value['__class']) && is_subclass_of($value['__class'], Behavior::class))) {
193+
} elseif (isset($value['__class']) && is_subclass_of($value['__class'], Behavior::class)) {
194+
$this->attachBehavior($name, Yii::createObject($value));
195+
} elseif (!isset($value['__class']) && isset($value['class']) && is_subclass_of($value['class'], Behavior::class)) {
194196
$this->attachBehavior($name, Yii::createObject($value));
195197
} elseif (is_string($value) && is_subclass_of($value, Behavior::class, true)) {
196198
$this->attachBehavior($name, Yii::createObject($value));

Diff for: tests/framework/base/ComponentTest.php

+31-5
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
use yii\base\Behavior;
1111
use yii\base\Component;
1212
use yii\base\Event;
13+
use yii\base\InvalidConfigException;
14+
use yii\base\UnknownMethodException;
1315
use yiiunit\TestCase;
1416

1517
function globalEventHandler($event)
@@ -331,19 +333,39 @@ public function testAttachBehavior()
331333

332334
$this->assertSame($behavior, $component->detachBehavior('a'));
333335
$this->assertFalse($component->hasProperty('p'));
334-
$this->expectException('yii\base\UnknownMethodException');
335-
$component->test();
336+
try {
337+
$component->test();
338+
$this->fail('Expected exception ' . UnknownMethodException::class . " wasn't thrown");
339+
} catch (UnknownMethodException $e) {
340+
// Expected
341+
}
336342

337-
$p = 'as b';
338343
$component = new NewComponent();
339-
$component->$p = ['class' => 'NewBehavior'];
340-
$this->assertSame($behavior, $component->getBehavior('a'));
344+
$component->{'as b'} = ['class' => NewBehavior::class];
345+
$this->assertInstanceOf(NewBehavior::class, $component->getBehavior('b'));
341346
$this->assertTrue($component->hasProperty('p'));
342347
$component->test();
343348
$this->assertTrue($component->behaviorCalled);
344349

345350
$component->{'as c'} = ['__class' => NewBehavior::class];
346351
$this->assertNotNull($component->getBehavior('c'));
352+
353+
$component->{'as d'} = [
354+
'__class' => NewBehavior2::class,
355+
'class' => NewBehavior::class,
356+
];
357+
$this->assertInstanceOf(NewBehavior2::class, $component->getBehavior('d'));
358+
359+
// CVE-2024-4990
360+
try {
361+
$component->{'as e'} = [
362+
'__class' => 'NotExistsBehavior',
363+
'class' => NewBehavior::class,
364+
];
365+
$this->fail('Expected exception ' . InvalidConfigException::class . " wasn't thrown");
366+
} catch (InvalidConfigException $e) {
367+
$this->assertSame('Class is not of type yii\base\Behavior or its subclasses', $e->getMessage());
368+
}
347369
}
348370

349371
public function testAttachBehaviors()
@@ -546,6 +568,10 @@ public function test()
546568
}
547569
}
548570

571+
class NewBehavior2 extends Behavior
572+
{
573+
}
574+
549575
class NewComponent2 extends Component
550576
{
551577
public $a;

0 commit comments

Comments
 (0)