__builtins__ magic behavior

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Patrick Maupin

    __builtins__ magic behavior

    __builtins__ in 2.5.2 doesn't seem to behave like I remember it did
    the last time I did some custom stuff with it, a very long time ago.

    This isn't surprising, because of ongoing optimization, but it's hard
    to google for '__builtins__' so I didn't really find any documentation
    on the current CPython behavior, which in some cases seems quite
    strange to me.

    The documentation node at http://docs.python.org/ref/naming.html has a
    "here be dragons" note on __builtins__, which is nice as far as it
    goes, but doesn't provide any help for people wanting to abuse the
    current CPython implementation. Additionally, the sentence
    immediately above the note, "__builtins __ can be set to a user-created
    dictionary to create a weak form of restricted execution" not only
    contradicts the note, but in some cases appears not to be true.

    When the code below is run, either standalone or by importing it, the
    builtins used are different depending on whether exec is used with
    globals() or with a copy of globals(). Any explanations for this
    behavior would be much appreciated.

    Thanks,
    Pat

    Executing:
    {{{
    original = __builtins__
    if hasattr(origina l, '__dict__'): original = original.__dict __
    copy = original.copy()

    # Make the dictionaries different and use new one
    copy['foo'] = 'bar'
    del copy['len']
    del original['chr']
    __builtins__ = copy

    testcode = '''
    try: print foo
    except: print "foo not found"
    try: print len
    except: print "len not found"
    try: print chr
    except: print "chr not found"
    print
    '''

    x = globals()
    assert type(x) is dict
    y = {}
    y.update(x)
    assert y == x

    print 'Executing in globals()'
    exec testcode in x

    print 'Executing in copy'
    exec testcode in y
    }}}

    results in:

    Executing in globals()
    foo not found
    <built-in function len>
    chr not found

    Executing in copy
    bar
    len not found
    <built-in function chr>
Working...