Skip to content

Commit 2cce35b

Browse files
committed
[21683] Fix crash when setting read-only props
1 parent 9b09e2e commit 2cce35b

5 files changed

Lines changed: 44 additions & 0 deletions

File tree

engine/src/executionerrors.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2777,6 +2777,9 @@ enum Exec_errors
27772777
// {EE-0909} android permission: bad permission name
27782778
EE_BAD_PERMISSION_NAME,
27792779

2780+
// {EE-0910} Property: value is not a data
2781+
EE_PROPERTY_NOTADATA
2782+
27802783
};
27812784

27822785
extern const char *MCexecutionerrors;

engine/src/widget.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -668,6 +668,28 @@ bool MCWidget::setcustomprop(MCExecContext& ctxt, MCNameRef p_set_name, MCNameRe
668668
!MCExtensionConvertFromScriptType(ctxt, t_set_type, InOut(t_value)))
669669
{
670670
CatchError(ctxt);
671+
672+
Exec_errors t_error;
673+
674+
MCResolvedTypeInfo t_resolved_type;
675+
if (!MCTypeInfoResolve(t_set_type, t_resolved_type))
676+
return false;
677+
678+
if ( t_resolved_type . named_type == kMCBooleanTypeInfo)
679+
t_error = EE_PROPERTY_NAB;
680+
681+
else if (t_resolved_type . named_type == kMCNumberTypeInfo)
682+
t_error = EE_PROPERTY_NAN;
683+
else if (t_resolved_type . named_type == kMCStringTypeInfo)
684+
t_error = EE_PROPERTY_NAS;
685+
else if (t_resolved_type . named_type == kMCArrayTypeInfo || t_resolved_type . named_type == kMCProperListTypeInfo)
686+
t_error = EE_PROPERTY_NOTANARRAY;
687+
else if (t_resolved_type . named_type == kMCDataTypeInfo)
688+
t_error = EE_PROPERTY_NOTADATA;
689+
else
690+
t_error = EE_PROPERTY_CANTSET;
691+
692+
ctxt . LegacyThrow(t_error);
671693
return false;
672694
}
673695

libscript/src/script-error.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,3 +397,13 @@ MCScriptCreateErrorExpectedError(MCErrorRef& r_error)
397397
MCSTR("error propagated without error object"),
398398
nil);
399399
}
400+
401+
bool MCScriptThrowAttemptToSetReadOnlyPropertyError(MCScriptInstanceRef p_instance, MCNameRef p_property)
402+
{
403+
return MCErrorCreateAndThrow(kMCScriptCannotSetReadOnlyPropertyErrorTypeInfo,
404+
"module",
405+
p_instance -> module -> name,
406+
"property",
407+
p_property,
408+
nil);
409+
}

libscript/src/script-instance.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,10 @@ MCScriptSetPropertyInInstance(MCScriptInstanceRef self,
420420
MCScriptDefinition *t_setter;
421421
t_setter = t_property_def->setter != 0 ? self->module->definitions[t_property_def->setter - 1] : nil;
422422

423+
// If there is no setter for the property then this is an error.
424+
if (t_setter == nil)
425+
return MCScriptThrowAttemptToSetReadOnlyPropertyError(self, p_property);
426+
423427
/* LOAD CHECK */
424428
__MCScriptAssert__(t_setter != nil,
425429
"property has no setter");

libscript/src/script-private.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -606,6 +606,11 @@ MCScriptInternalHandlerQuery(MCHandlerRef handler,
606606
bool
607607
MCScriptThrowPropertyNotFoundError(MCScriptInstanceRef instance,
608608
MCNameRef property);
609+
610+
bool
611+
MCScriptThrowAttemptToSetReadOnlyPropertyError(MCScriptInstanceRef instance,
612+
MCNameRef property);
613+
609614
bool
610615
MCScriptThrowHandlerNotFoundError(MCScriptInstanceRef instance,
611616
MCNameRef handler);

0 commit comments

Comments
 (0)