[Python-Dev] Bug 216405

Thomas Heller thomas.heller@ion-tof.com
Fri, 19 Oct 2001 14:49:40 +0200


I know most of you are busy with the release, but may I beg again
that SF bug #216405 be finally fixed in Python 2.2?

I can apply the patch myself, if nobody has time, but
I need an OK from Guido ;-)
The bug is currently marked closed, resolution is set to 'later'.

http://sourceforge.net/tracker/index.php?func=detail&aid=216405&group_id=5470&atid=105470

I know that the buffer stuff is somewhat (broken|fragile|dangerous,
pick your favorite here), but this does at least fix a small point.

Here is the complete patch against the current CVS sources, I've
made a build with this patch applied, and the whole test suite runs
the same way as it does without this patch (can only test on windows):

147 tests OK.
34 tests skipped:
    test_al test_bsddb test_cd test_cl test_commands test_crypt
    test_dbm test_dl test_fcntl test_fork1 test_gdbm test_gl test_grp
    test_gzip test_imgfile test_largefile test_linuxaudiodev
    test_mhlib test_minidom test_nis test_openpty test_poll test_pty
    test_pwd test_pyexpat test_sax test_signal test_socket_ssl
    test_socketserver test_sunaudiodev test_sundry test_timing
    test_zipfile test_zlib
8 skips unexpected on win32:
    test_zipfile test_bsddb test_sax test_sundry test_minidom
    test_zlib test_pyexpat test_gzip

Thomas

Index: bufferobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/bufferobject.c,v
retrieving revision 2.15
diff -c -r2.15 bufferobject.c
*** bufferobject.c      2001/08/24 18:34:26     2.15
--- bufferobject.c      2001/10/19 12:46:33
***************
*** 73,83 ****
                offset = count;
        if ( offset + size > count )
                size = count - offset;
! 
!       /* if the base object is another buffer, then "deref" it */
!       if ( PyBuffer_Check(base) )
                base = ((PyBufferObject *)base)->b_base;
! 
        return _PyBuffer_FromMemory(base, (char *)p + offset, size, readonly);
  }
  
--- 73,85 ----
                offset = count;
        if ( offset + size > count )
                size = count - offset;
!       
!       /* if the base object is another buffer, then "deref" it,
!        * except if the base of the other buffer is NULL
!        */
!       if ( PyBuffer_Check(base) && (((PyBufferObject *)base)->b_base) )
                base = ((PyBufferObject *)base)->b_base;
!       
        return _PyBuffer_FromMemory(base, (char *)p + offset, size, readonly);
  }