[squeak-dev] Mirror primitives

Eliot Miranda eliot.miranda at gmail.com
Tue Sep 8 06:28:06 UTC 2009


On Mon, Sep 7, 2009 at 5:36 PM, Igor Stasenko<siguctua at gmail.com> wrote:
> 2009/9/7 Eliot Miranda <eliot.miranda at gmail.com>:
>>
>>
>> Eliot (phone)
>>
>> On 7 Sep 2009, at 14:35, "Jecel Assumpcao Jr" <jecel at merlintec.com> wrote:
>>
>>> I would just like to mention that Self (and it is likely that Newspeak
>>> too, but I haven't looked) has mirror *objects* and not mirror
>>> *primitives*. Yes, these objects actually use primitives to get their
>>> work done but these primitives don't work for any objects other than
>>> mirrors (and if Self didn't have a global namespace for primitives, this
>>> check wouldn't even be necessary since non mirror objects wouldn't even
>>> have a way to try to invoke these primitives).
>>>
>>> The mirror objects operate on only one object that is stored as an
>>> "instance variable" when the mirror was created, so you can't pass
>>> random objects as parameters. To have a secure system you would only
>>> have to control the code that allows new mirrors to be created.
>>> Unfortunately, Self didn't do that but instead allows anybody to create
>>> a mirror on anybody else. It wouldn't be very hard to do, however. Of
>>> course, as has already been pointed out this wouldn't get you much in
>>> terms of security if you keep all the current holes that Squeak has.
>>>
>>
>> Ok, that presents a straight-forward e xtension to the primitive
>> implementations (forgive typoes; I'm at the park + kids).  If the argument
>> count is higher than the base primitive's we insist on the receiver being a
>> context who's receiver is the object to be acted upon, e.g.
>>
>> primitiveInstVarAt
>>    (argumentCount > 2
>>    and: [(self isIntegerObject: (self stackValue:  argumentCount))
>>             or: [(self isContext: (self stackValue:  argumentCount)) not
>>             or: [(self fetchPointer: ReceiverIndex ofObject: (self
>> stackValue:  argumentCount)) ~= (self stackValue: 2)]]]]) ifTrue:
>>            [^self primitiveFail].
>>
>>     ....
>>
>> then the mirror primitives are safe.
>>
>> Yes?
>>
>
> sorry, can't follow.. its hard to grok through the slang code, even if
> its a smalltalk.
> Can you please provide the analogous simplified implementation in
> non-slang code which will show the actual intent of safety checks?

primitiveInstVarAt
      argumentCount > 2 ifTrue:"if so this is a mirror prim"
          [ | receiver objectToFetchInstVarFrom |
          receiver := self stackValue: argumentCount.
          objectToFetchInstVarFrom := self stackValue: 2.
          (receiver isContext not
           or: [receiver receiver ~= objectToFetchInstVarFrom]) ifTrue:
               [^self primitiveFail]].

     ... go fetch the inst var ...


>
>>
>>
>>> One possible objection to mirror objects is that you might need to
>>> create them exactly in situations where creating new objects might cause
>>> problems (low memory or certain kinds of bugs).
>>>
>>> http://bracha.org/mirrors.pdf has good background information for
>>> anybody having problems keeping up with this thread.
>>>
>>> -- Jecel
>>>
>>>
>>
>>
>
>
>
> --
> Best regards,
> Igor Stasenko AKA sig.
>
>



More information about the Squeak-dev mailing list