teerytko / python-video4linux2

Automatically exported from code.google.com/p/python-video4linux2
0 stars 0 forks source link

Logitech QuickCam, segfault, memory corruption #7

Open GoogleCodeExporter opened 8 years ago

GoogleCodeExporter commented 8 years ago
juser@dhcp186:~/python-video4linux2$ ./recordpics.py -d /dev/video1
*** glibc detected *** python: malloc(): memory corruption: 0x08445588 ***
(stackdump)

Original issue reported on code.google.com by cfkars...@gmail.com on 30 Oct 2008 at 10:33

GoogleCodeExporter commented 8 years ago
juser@dhcp186:~/python-video4linux2$ svn up
At revision 11.
juser@dhcp186:~/python-video4linux2$ uname -a
Linux dhcp186 2.6.27-7-generic #1 SMP Fri Oct 24 06:42:44 UTC 2008 i686 
GNU/Linux

juser@dhcp186:~/python-video4linux2$ LD_LIBRARY_PATH=/usr/lib/debug gdb 
pythonGNU gdb
6.8-debian
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu"...
(gdb) run ./recordpics.py -d /dev/video1
Starting program: /usr/bin/python ./recordpics.py -d /dev/video1
[Thread debugging using libthread_db enabled]
[New Thread 0xb7e018c0 (LWP 13572)]
*** glibc detected *** /usr/bin/python: malloc(): memory corruption: 0x09c71318 
***
======= Backtrace: =========
/usr/lib/debug/libc.so.6[0xb7e6de25]
/usr/lib/debug/libc.so.6[0xb7e70528]
/usr/lib/debug/libc.so.6(__libc_malloc+0x9c)[0xb7e7204c]
/usr/bin/python(_PyObject_GC_NewVar+0x3b)[0x80f947b]
/usr/bin/python(PyFrame_New+0x2d8)[0x8116ae8]
/usr/bin/python(PyEval_EvalFrameEx+0x6736)[0x80cfba6]
/usr/bin/python(PyEval_EvalFrameEx+0x6785)[0x80cfbf5]
/usr/bin/python(PyEval_EvalCodeEx+0x685)[0x80d0345]
/usr/bin/python(PyEval_EvalCode+0x57)[0x80d0557]
/usr/bin/python(PyRun_FileExFlags+0xef)[0x80edf8f]
/usr/bin/python(PyRun_SimpleFileExFlags+0x19a)[0x80ee25a]
/usr/bin/python(Py_Main+0xc57)[0x80595e7]
/usr/bin/python(main+0x22)[0x8058962]
/usr/lib/debug/libc.so.6(__libc_start_main+0xe5)[0xb7e18685]
/usr/bin/python[0x80588a1]
======= Memory map: ========
08048000-08144000 r-xp 00000000 08:01 345240     /usr/bin/python2.5
08144000-08145000 r--p 000fb000 08:01 345240     /usr/bin/python2.5
08145000-0816a000 rw-p 000fc000 08:01 345240     /usr/bin/python2.5
0816a000-08170000 rw-p 0816a000 00:00 0 
09bde000-09c9f000 rw-p 09bde000 00:00 0          [heap]
b7a00000-b7a21000 rw-p b7a00000 00:00 0 
b7a21000-b7b00000 ---p b7a21000 00:00 0 
b7be3000-b7bf0000 r-xp 00000000 08:01 796255     /lib/libgcc_s.so.1
b7bf0000-b7bf1000 r--p 0000c000 08:01 796255     /lib/libgcc_s.so.1
b7bf1000-b7bf2000 rw-p 0000d000 08:01 796255     /lib/libgcc_s.so.1
b7bfe000-b7c3f000 rw-p b7bfe000 00:00 0 
b7c3f000-b7c42000 r-xp 00000000 08:01 352324    
/usr/lib/python2.5/lib-dynload/_locale.so
b7c42000-b7c43000 r--p 00002000 08:01 352324    
/usr/lib/python2.5/lib-dynload/_locale.so
b7c43000-b7c44000 rw-p 00003000 08:01 352324    
/usr/lib/python2.5/lib-dynload/_locale.so
b7c44000-b7c53000 r-xp 00000000 08:01 352316    
/usr/lib/python2.5/lib-dynload/datetime.so
b7c53000-b7c54000 r--p 0000e000 08:01 352316    
/usr/lib/python2.5/lib-dynload/datetime.so
b7c54000-b7c57000 rw-p 0000f000 08:01 352316    
/usr/lib/python2.5/lib-dynload/datetime.so
b7c57000-b7c58000 r-xp 00000000 08:01 452284    
/home/juser/python-video4linux2/libpyv4l2.so
b7c58000-b7c59000 r--p 00001000 08:01 452284    
/home/juser/python-video4linux2/libpyv4l2.so
b7c59000-b7c5a000 rw-p 00002000 08:01 452284    
/home/juser/python-video4linux2/libpyv4l2.so
b7c5a000-b7c5f000 r-xp 00000000 08:01 351977    
/usr/lib/python2.5/lib-dynload/operator.so
b7c5f000-b7c60000 r--p 00004000 08:01 351977    
/usr/lib/python2.5/lib-dynload/operator.so
b7c60000-b7c61000 rw-p 00005000 08:01 351977    
/usr/lib/python2.5/lib-dynload/operator.so
b7c61000-b7c66000 r-xp 00000000 08:01 351980     
/usr/lib/python2.5/lib-dynload/strop.so
b7c66000-b7c67000 r--p 00004000 08:01 351980     
/usr/lib/python2.5/lib-dynload/strop.so
b7c67000-b7c69000 rw-p 00005000 08:01 351980     
/usr/lib/python2.5/lib-dynload/strop.so
b7c69000-b7caa000 rw-p b7c69000 00:00 0 
b7caa000-b7cbe000 r-xp 00000000 08:01 345417     /usr/lib/libz.so.1.2.3.3
b7cbe000-b7cc0000 rw-p 00013000 08:01 345417     /usr/lib/libz.so.1.2.3.3
b7cc0000-b7cdf000 r-xp 00000000 08:01 350173     /usr/lib/libjpeg.so.62.0.0
b7cdf000-b7ce0000 rw-p 0001e000 08:01 350173     /usr/lib/libjpeg.so.62.0.0
b7ce2000-b7ce9000 r-xp 00000000 08:01 351851     
/usr/lib/python2.5/lib-dynload/array.so
b7ce9000-b7cea000 r--p 00006000 08:01 351851     
/usr/lib/python2.5/lib-dynload/array.so
b7cea000-b7cec000 rw-p 00007000 08:01 351851     
/usr/lib/python2.5/lib-dynload/array.so
b7cec000-b7d1e000 r-xp 00000000 08:01 451272    
/usr/lib/python2.5/site-packages/PIL/_imaging.so
b7d1e000-b7d20000 r--p 00031000 08:01 451272    
/usr/lib/python2.5/site-packages/PIL/_imaging.so
b7d20000-b7d22000 rw-p 00033000 08:01 451272    
/usr/lib/python2.5/site-packages/PIL/_imaging.so
b7d22000-b7d2a000 rw-p b7d22000 00:00 0 
b7d2a000-b7d2f000 r-xp 00000000 08:01 351849    
/usr/lib/python2.5/lib-dynload/_struct.so
b7d2f000-b7d30000 r--p 00004000 08:01 351849    
/usr/lib/python2.5/lib-dynload/_struct.so
b7d30000-b7d31000 rw-p 00005000 08:01 351849    
/usr/lib/python2.5/lib-dynload/_struct.so
b7d31000-b7d45000 r-xp 00000000 08:01 352312    
/usr/lib/python2.5/lib-dynload/_ctypes.so
b7d45000-b7d46000 r--p 00014000 08:01 352312    
/usr/lib/python2.5/lib-dynload/_ctypes.so
b7d46000-b7d48000 rw-p 00015000 08:01 352312    
/usr/lib/python2.5/lib-dynload/_ctypes.so
b7d48000-b7d7e000 r--p 00000000 08:01 367923     /usr/lib/locale/en_US/LC_CTYPE
b7d7e000-b7dbf000 rw-p b7d7e000 00:00 0 
b7dc0000-b7e02000 rw-p b7dc0000 00:00 0 
b7e02000-b7f3f000 r-xp 00000000 08:01 452081     /usr/lib/debug/libc-2.8.90.so
b7f3f000-b7f41000 r--p 0013d000 08:01 452081     /usr/lib/debug/libc-2.8.90.so
b7f41000-b7f42000 rw-p 0013f000 08:01 452081     /usr/lib/debug/libc-2.8.90.so
b7f42000-b7f45000 rw-p b7f42000 00:00 0 
b7f45000-b7f69000 r-xp 00000000 08:01 452085     /usr/lib/debug/libm-2.8.90.so
b7f69000-b7f6a000 r--p 00023000 08:01 452085     /usr/lib/debug/libm-2.8.90.so
b7f6a000-b7f6b000 rw-p 00024000 08:01 452085     /usr/lib/debug/libm-2.8.90.so
b7f6b000-b7f6d000 r-xp 00000000 08:01 452100     
/usr/lib/debug/libutil-2.8.90.so
b7f6d000-b7f6e000 r--p 00001000 08:01 452100     
/usr/lib/debug/libutil-2.8.90.so
b7f6e000-b7f6f000 rw-p 00002000 08:01 452100     
/usr/lib/debug/libutil-2.8.90.so
b7f6f000-b7f70000 rw-p b7f6f000 00:00 0 
b7f70000-b7f72000 r-xp 00000000 08:01 452084     /usr/lib/debug/libdl-2.8.90.so
b7f72000-b7f73000 r--p 00001000 08:01 452084     /usr/lib/debug/libdl-2.8.90.so
b7f73000-b7f74000 rw-p 00002000 08:01 452084     /usr/lib/debug/libdl-2.8.90.so
b7f74000-b7f88000 r-xp 00000000 08:01 452095     
/usr/lib/debug/libpthread-2.8.90.so
b7f88000-b7f89000 r--p 00013000 08:01 452095     
/usr/lib/debug/libpthread-2.8.90.so
b7f89000-b7f8a000 rw-p 00014000 08:01 452095     
/usr/lib/debug/libpthread-2.8.90.so
b7f8a000-b7f8e000 rw-p b7f8a000 00:00 0 
b7f8e000-b7fa8000 r-xp 00000000 08:01 793086     /lib/ld-2.8.90.so
b7fa8000-b7fa9000 r-xp b7fa8000 00:00 0          [vdso]
b7fa9000-b7faa000 r--p 0001a000 08:01 793086     /lib/ld-2.8.90.so
b7faa000-b7fab000 rw-p 0001b000 08:01 793086     /lib/ld-2.8.90.so
bff8f000-bffaa000 rw-p bffe5000 00:00 0          [stack]

Program received signal SIGABRT, Aborted.
[Switching to Thread 0xb7e018c0 (LWP 13572)]
0xb7e2ca16 in *__GI_raise (sig=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:64
64  ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory.
    in ../nptl/sysdeps/unix/sysv/linux/raise.c
(gdb) bt full
#0  0xb7e2ca16 in *__GI_raise (sig=6)
    at ../nptl/sysdeps/unix/sysv/linux/raise.c:64
    resultvar = <value optimized out>
    pid = -1208741900
    selftid = 13572
#1  0xb7e2e318 in *__GI_abort () at abort.c:88
    act = {__sigaction_handler = {sa_handler = 0x1, sa_sigaction = 0x1}, 
  sa_mask = {__val = {13, 3220861160, 3085982700, 3086656096, 3086656096, 0, 
      3220861300, 134580385, 134531212, 1001, 21206, 134551232, 1001, 
      134523028, 3085731229, 4, 3220861228, 6, 3085169188, 3086225396, 4, 2, 
      3220861344, 3085836024, 6, 3220861228, 4, 0, 3086109113, 3086109109, 
      3086104013, 3086113812}}, sa_flags = -1208853440, 
  sa_restorer = 0xb7f25c3c}
    sigs = {__val = {32, 0 <repeats 31 times>}}
#2  0xb7e67fdd in __libc_message (do_abort=2, 
    fmt=0xb7f279c0 "*** glibc detected *** %s: %s: 0x%s ***\n")
    at ../sysdeps/unix/sysv/linux/libc_fatal.c:170
    ap = 0xbffa7810 "\235H��0��09c71318"
    fd = 6
    on_2 = <value optimized out>
    list = <value optimized out>
    nlist = 7
    cp = <value optimized out>
    written = 6
#3  0xb7e6de25 in malloc_printerr (action=2, 
    str=0xb7f2489d "malloc(): memory corruption", ptr=0x9c71318)
    at malloc.c:5949
    buf = "09c71318"
    cp = 0x6 <Address 0x6 out of bounds>
#4  0xb7e70528 in _int_malloc (av=0xb7f42140, bytes=360) at malloc.c:4207
    iters = 0
    nb = 368
    idx = 46
    bin = <value optimized out>
    victim = (mchunkptr) 0x9c71310
    size = 164156976
    victim_index = <value optimized out>
    remainder = <value optimized out>
    remainder_size = <value optimized out>
    block = 4
    bit = <value optimized out>
    map = <value optimized out>
    fwd = (mchunkptr) 0x180
    bck = (mchunkptr) 0x0
#5  0xb7e7204c in *__GI___libc_malloc (bytes=360) at malloc.c:3551
    ar_ptr = (mstate) 0xb7f42140
    victim = (void *) 0x8163fe0
    hook = <value optimized out>
#6  0x080f947b in _PyObject_GC_NewVar (tp=0x8163fe0, nitems=8)
---Type <return> to continue, or q <return> to quit---
    at ../Modules/gcmodule.c:1324
    size = <value optimized out>
#7  0x08116ae8 in PyFrame_New (tstate=0x9bde1b8, code=0xb7d9c4e8, 
    globals=0xb7d8f9bc, locals=0x0) at ../Objects/frameobject.c:614
    extras = 6
    back = (PyFrameObject *) 0x9c7aecc
    f = (PyFrameObject *) 0x0
    builtins = (PyObject *) 0xb7dc3824
    i = <value optimized out>
#8  0x080cfba6 in PyEval_EvalFrameEx (f=0x9c7aecc, throwflag=0)
    at ../Python/ceval.c:3670
    sp = (PyObject **) 0x9c7b038
    stack_pointer = (PyObject **) 0x9c7b038
    next_instr = (unsigned char *) 0x9c40708 "\001|\003"
    opcode = <value optimized out>
    oparg = 1
    why = <value optimized out>
    err = 0
    x = (PyObject *) 0x9bedbec
    v = (PyObject *) 0xb7c81c6c
    w = (PyObject *) 0x9be2070
    u = (PyObject *) 0x8163fe0
    t = <value optimized out>
    stream = (PyObject *) 0xbffa79d8
    freevars = (PyObject **) 0x9c7b030
    retval = (PyObject *) 0x0
    tstate = (PyThreadState *) 0x9bde1b8
    co = (PyCodeObject *) 0xb7d88380
    instr_ub = -1
    instr_lb = 0
    instr_prev = -1
    first_instr = (unsigned char *) 0x9c405f4 "t"
    names = (PyObject *) 0xb7dca17c
    consts = (PyObject *) 0xb7de61ac
#9  0x080cfbf5 in PyEval_EvalFrameEx (f=0x9befe54, throwflag=0)
    at ../Python/ceval.c:3681
    sp = (PyObject **) 0x9beff90
    stack_pointer = (PyObject **) 0x9beff90
    next_instr = (unsigned char *) 0xb7d9977e "\001n\001"
    opcode = <value optimized out>
    oparg = 0
    why = <value optimized out>
    err = 0
    x = (PyObject *) 0x0
    v = (PyObject *) 0xb7dc3824
    w = (PyObject *) 0x5
    u = (PyObject *) 0x8163fe0
    t = <value optimized out>
    stream = (PyObject *) 0x10
---Type <return> to continue, or q <return> to quit---
    freevars = (PyObject **) 0x9beff8c
    retval = (PyObject *) 0x0
    tstate = (PyThreadState *) 0x9bde1b8
    co = (PyCodeObject *) 0xb7d88458
    instr_ub = -1
    instr_lb = 0
    instr_prev = -1
    first_instr = (unsigned char *) 0xb7d9971c "d"
    names = (PyObject *) 0xb7d8962c
    consts = (PyObject *) 0xb7dfe8cc
#10 0x080d0345 in PyEval_EvalCodeEx (co=0xb7d88458, globals=0xb7ddaacc, 
    locals=0xb7ddaacc, args=0x0, argcount=0, kws=0x0, kwcount=0, defs=0x0, 
    defcount=0, closure=0x0) at ../Python/ceval.c:2858
    f = (PyFrameObject *) 0x9befe54
    retval = <value optimized out>
    freevars = (PyObject **) 0x9beff8c
    tstate = (PyThreadState *) 0x9bde1b8
    x = <value optimized out>
    u = (PyObject *) 0xbffa995c
#11 0x080d0557 in PyEval_EvalCode (co=0xb7d88458, globals=0xb7ddaacc, 
    locals=0xb7ddaacc) at ../Python/ceval.c:514
No locals.
#12 0x080edf8f in PyRun_FileExFlags (fp=0x9bde008, 
    filename=0xbffa995c "./recordpics.py", start=257, globals=0xb7ddaacc, 
    locals=0xb7ddaacc, closeit=1, flags=0xbffa7f08)
    at ../Python/pythonrun.c:1273
    ret = (PyObject *) 0x0
    mod = <value optimized out>
    arena = <value optimized out>
#13 0x080ee25a in PyRun_SimpleFileExFlags (fp=0x9bde008, 
    filename=0xbffa995c "./recordpics.py", closeit=1, flags=0xbffa7f08)
    at ../Python/pythonrun.c:879
    m = <value optimized out>
    d = (PyObject *) 0xb7ddaacc
    v = <value optimized out>
    ext = 0xbffa9967 "s.py"
#14 0x080595e7 in Py_Main (argc=3, argv=0xbffa7fd4) at ../Modules/main.c:532
    c = <value optimized out>
    sts = <value optimized out>
    command = 0x0
    filename = 0x6 <Address 0x6 out of bounds>
    module = 0x0
    fp = (FILE *) 0x9bde008
    p = <value optimized out>
    inspect = 0
    unbuffered = 0
    skipfirstline = 0
    stdin_is_interactive = <value optimized out>
    help = 0
---Type <return> to continue, or q <return> to quit---
    version = 0
    saw_inspect_flag = 0
    saw_unbuffered_flag = 0
    cf = {cf_flags = 0}
#15 0x08058962 in main (argc=Cannot access memory at address 0x3504
) at ../Modules/python.c:23
No locals.

Original comment by cfkars...@gmail.com on 30 Oct 2008 at 10:39

GoogleCodeExporter commented 8 years ago
Looks like this is still happening with a Bt878 card, tested on Ubuntu Intrepid 
with
--
02:09.0 Multimedia video controller: Brooktree Corporation Bt878 Video Capture 
(rev 02)
        Flags: bus master, medium devsel, latency 66, IRQ 18
        Memory at 44000000 (32-bit, prefetchable) [size=4K]
        Kernel driver in use: bttv
        Kernel modules: bttv

02:09.1 Multimedia controller: Brooktree Corporation Bt878 Audio Capture (rev 
02)
        Flags: bus master, medium devsel, latency 66, IRQ 11
        Memory at 44100000 (32-bit, prefetchable) [size=4K]
--

Mungewell.

Original comment by mungew...@gmail.com on 4 Feb 2009 at 12:13

Attachments:

GoogleCodeExporter commented 8 years ago
'ioctl(fd, VIDIOC_G_FMT, f)' is segfaulting.

it looks like is passes the wrong structure, it passes 'PixFormat()' when it 
should
pass 'struct v4l2_format'.

http://v4l2spec.bytesex.org/spec/r10944.htm

Mungewell.

Original comment by mungew...@gmail.com on 4 Feb 2009 at 12:31

GoogleCodeExporter commented 8 years ago
A really nasty hack is to add some spare space at the end of the PixFormat()
structure, which prevents the segfault
---
class PixFormat(Structure):
        _fields_        =       [
                ('type',                                        c_long),
                ('width',                                       c_uint32),
                ('height',                              c_uint32),
                ('pixelformat',         c_char * 4),
                ('field',                                       c_uint32),
                ('bytesperline',        c_uint32),
                ('sizeimage',                   c_uint32),
                ('colorspace',          c_uint32),
                ('priv',                                        c_uint32),
                ('fps_num',                                     c_uint32),
                ('fps_den',                                     c_uint32),
                ('blank_space',                                 c_char * 512),
        ]
--

Original comment by mungew...@gmail.com on 4 Feb 2009 at 12:50

GoogleCodeExporter commented 8 years ago
Just for reference my Bt878 card now reports:
--
simon@myth2:~/python-video4linux2-fps$ ./pyv4l2.py 
Available devices:  ['/dev/video0']
        /dev/video0
Capabilities:
        Capture
        VBICapture
        ReadWrite
        Overlay
        Streaming
        Tuner
Input 0:
                Name:   Television
                Type:   tuner
                Standards: ['PAL_B', 'PAL_G', 'PAL_D', 'PAL_K', 'PAL_I', 'PAL_H',
'PAL_N', 'PAL_M', 'PAL', 'NTSC_M_JP', 'SECAM_B', 'PAL_D1', 'SECAM_G', 'SECAM_D',
'SECAM_K', 'SECAM_H', 'NTSC', 'SECAM_L', 'SECAM_K1', 'SECAM_LC', 'NTSC_M_KR',
'PAL_B1', 'PAL_60', 'NTSC_M', 'PAL_Nc']
Input 1:
                Name:   Composite1
                Type:   camera
                Standards: ['PAL_B', 'PAL_G', 'PAL_D', 'PAL_K', 'PAL_I', 'PAL_H',
'PAL_N', 'PAL_M', 'PAL', 'NTSC_M_JP', 'SECAM_B', 'PAL_D1', 'SECAM_G', 'SECAM_D',
'SECAM_K', 'SECAM_H', 'NTSC', 'SECAM_L', 'SECAM_K1', 'SECAM_LC', 'NTSC_M_KR',
'PAL_B1', 'PAL_60', 'NTSC_M', 'PAL_Nc']
Input 2:
                Name:   S-Video
                Type:   camera
                Standards: ['PAL_B', 'PAL_G', 'PAL_D', 'PAL_K', 'PAL_I', 'PAL_H',
'PAL_N', 'PAL_M', 'PAL', 'NTSC_M_JP', 'SECAM_B', 'PAL_D1', 'SECAM_G', 'SECAM_D',
'SECAM_K', 'SECAM_H', 'NTSC', 'SECAM_L', 'SECAM_K1', 'SECAM_LC', 'NTSC_M_KR',
'PAL_B1', 'PAL_60', 'NTSC_M', 'PAL_Nc']
Input 3:
                Name:   Composite3
                Type:   camera
                Standards: ['PAL_B', 'PAL_G', 'PAL_D', 'PAL_K', 'PAL_I', 'PAL_H',
'PAL_N', 'PAL_M', 'PAL', 'NTSC_M_JP', 'SECAM_B', 'PAL_D1', 'SECAM_G', 'SECAM_D',
'SECAM_K', 'SECAM_H', 'NTSC', 'SECAM_L', 'SECAM_K1', 'SECAM_LC', 'NTSC_M_KR',
'PAL_B1', 'PAL_60', 'NTSC_M', 'PAL_Nc']
Pixel formats: 
        GREY    8 bpp, gray
        HI24    8 bpp, dithered color
        RGBO    15 bpp RGB, le
        RGBQ    15 bpp RGB, be
        RGBP    16 bpp RGB, le
        RGBR    16 bpp RGB, be
        BGR3    24 bpp RGB, le
        BGR4    32 bpp RGB, le
        RGB4    32 bpp RGB, be
        YUYV    4:2:2, packed, YUYV
        YUYV    4:2:2, packed, YUYV
        UYVY    4:2:2, packed, UYVY
        422P    4:2:2, planar, Y-Cb-Cr
        YU12    4:2:0, planar, Y-Cb-Cr
        YV12    4:2:0, planar, Y-Cr-Cb
        411P    4:1:1, planar, Y-Cb-Cr
        YUV9    4:1:0, planar, Y-Cb-Cr
        YVU9    4:1:0, planar, Y-Cr-Cb
Resolutions: 
        320x240
        320x480
        352x240
        384x288
        480x480
        512x480
        640x480
        720x480
--

Original comment by mungew...@gmail.com on 4 Feb 2009 at 1:49