Winter Madness - Passing Python objects as Strings

Hendrik van Rooyen mail at microcorp.co.za
Thu Jun 4 03:25:35 EDT 2009


When the days get colder and the nights longer,
then evil things are hatched.

A can is like a pickle, in that it is a string, but anything
can be canned.
Unlike a pickle, a can cannot leave the process, though,
unless the object it points to lives in shared memory.

Here is the output of a test session:
<test output start>
> python -i cantest.py

dir(Can) yields:
['__doc__', '__file__', '__name__', 'can', 'uncan']

Testing string object
s is:          The quick brown fox jumps over the lazy dog
id(s) is:      47794404772392
ps = can(s) :  47794404772392
t = uncan(ps): The quick brown fox jumps over the lazy dog
t is s gives:  True

Testing q = Queue.Queue()
q is:          <Queue.Queue instance at 0x2b780085e830>
id(q) is:      47794404845616
pq = can(q) :  47794404845616
r = uncan(pq): <Queue.Queue instance at 0x2b780085e830>
r is q gives:  True

Testing banana class object
b = banana()   <__main__.banana object at 0x73d190>
id(b) is:      7590288
pb = can(c) :  7590288
c = uncan(pb): <__main__.banana object at 0x73d190>
c is b gives:  True

That's it, folks!
>>> pcan = can(Can.can)
>>> pcan
'47794404843816'
>>> griz = uncan(pcan)
>>> griz is can
True
>>> z = 'foo'
>>> griz(z)
'7557840'
>>> uncan(_)
'foo'
>>> griz
<built-in function can>
>>> # uncanny!
>>>
<end of test output>

Now I have only tested it on my system, which is 64 bit SuSe Linux.
I suspect it is fragile.
I know it is dangerous - if you uncan a random
number, then if you are lucky, you will get a segfault.
If you are not lucky, your life will be completely
changed.

If you have any interest, contact me and I will
send you the source.

- Hendrik





More information about the Python-list mailing list