On Fri, Dec 16, 2005 at 05:40:09PM -0700, dann frazier wrote:
>Package: cdrecord
>Version: 4:2.01+01a03-4
>Severity: important
>
>A backtrace is below[1].  The 4:2.01+01a03-4 release didn't segv, but reported
>an error[2].

Bugger. I _think_ I've found the problem, some debug left in that was
a little too i386-specific. I have an ia64 here, but not with a CD-R
drive attached to be able to test the fix. Can you test a rebuild with
the patch 27_scsi_buffer_size replaced with the version attached
please?

-- 
Steve McIntyre, Cambridge, UK.                                [EMAIL PROTECTED]
Google-bait:
  Debian does NOT ship free CDs. Please do NOT contact the mailing
  lists asking us to send them to you.
#! /bin/sh /usr/share/dpatch/dpatch-run
## 27_scsi_buffer_size.dpatch by Steve McIntyre <[EMAIL PROTECTED]>
##
## All lines beginning with `## DP:' are a description of the patch.
## DP: If we can't get a buffer as big as we would like, shrink the desired
## size until it works. Bug #330371

@DPATCH@
diff -urNad cdrtools-2.01+01a03/cdda2wav/interface.c 
/tmp/dpep.KsKoR8/cdrtools-2.01+01a03/cdda2wav/interface.c
--- cdrtools-2.01+01a03/cdda2wav/interface.c    2005-12-17 12:37:57.000000000 
+0000
+++ /tmp/dpep.KsKoR8/cdrtools-2.01+01a03/cdda2wav/interface.c   2005-12-17 
12:38:31.000000000 +0000
@@ -484,6 +484,7 @@
 {
   int retval = 0;
   struct stat fstatstruct;
+  long bufsize = 0;
 
   /*  The device (given by pdevname) can be:
       a. an SCSI device specified with a /dev/xxx name,
@@ -559,10 +560,15 @@
       dontneedroot();
       if (global.nsectors > (unsigned) scg_bufsize(scgp, 
3*1024*1024)/CD_FRAMESIZE_RAW)
         global.nsectors = scg_bufsize(scgp, 3*1024*1024)/CD_FRAMESIZE_RAW;
-      if (global.overlap >= global.nsectors)
-        global.overlap = global.nsectors-1;
 
-       init_scsibuf(scgp, global.nsectors*CD_FRAMESIZE_RAW);
+      bufsize = global.nsectors * CD_FRAMESIZE_RAW;
+
+       init_scsibuf(scgp, &bufsize);
+    global.nsectors = bufsize / CD_FRAMESIZE_RAW;
+
+  if (global.overlap >= global.nsectors)
+      global.overlap = global.nsectors-1;
+
        if (global.scanbus) {
                select_target(scgp, stdout);
                exit(0);
diff -urNad cdrtools-2.01+01a03/cdda2wav/scsi_cmds.c 
/tmp/dpep.KsKoR8/cdrtools-2.01+01a03/cdda2wav/scsi_cmds.c
--- cdrtools-2.01+01a03/cdda2wav/scsi_cmds.c    2005-12-17 12:37:57.000000000 
+0000
+++ /tmp/dpep.KsKoR8/cdrtools-2.01+01a03/cdda2wav/scsi_cmds.c   2005-12-17 
12:38:31.000000000 +0000
@@ -1780,11 +1780,11 @@
 
 static caddr_t scsibuffer;     /* page aligned scsi transfer buffer */
 
-void init_scsibuf __PR((SCSI *, unsigned));
+void init_scsibuf __PR((SCSI *, long *));
 
 void init_scsibuf(scgp, amt)
        SCSI *scgp;
-       unsigned amt;
+       long *amt;
 {
        if (scsibuffer != NULL) {
                fprintf(stderr, "the SCSI transfer buffer has already been 
allocated!\n");
diff -urNad cdrtools-2.01+01a03/cdda2wav/scsi_cmds.h 
/tmp/dpep.KsKoR8/cdrtools-2.01+01a03/cdda2wav/scsi_cmds.h
--- cdrtools-2.01+01a03/cdda2wav/scsi_cmds.h    2005-12-17 12:37:57.000000000 
+0000
+++ /tmp/dpep.KsKoR8/cdrtools-2.01+01a03/cdda2wav/scsi_cmds.h   2005-12-17 
12:38:31.000000000 +0000
@@ -40,7 +40,7 @@
 get_orig_sectorsize __PR((SCSI *scgp, unsigned char *m4, unsigned char *m10,
                     unsigned char *m11));
 int heiko_mmc __PR(( SCSI *scgp ));
-void init_scsibuf __PR(( SCSI *scgp, unsigned amt ));
+void init_scsibuf __PR(( SCSI *scgp, long *amt ));
 int    myscsierr __PR(( SCSI *scgp ));
 
 extern int accepts_fua_bit;
diff -urNad cdrtools-2.01+01a03/cdrecord/cdrecord.c 
/tmp/dpep.KsKoR8/cdrtools-2.01+01a03/cdrecord/cdrecord.c
--- cdrtools-2.01+01a03/cdrecord/cdrecord.c     2005-12-17 12:38:26.000000000 
+0000
+++ /tmp/dpep.KsKoR8/cdrtools-2.01+01a03/cdrecord/cdrecord.c    2005-12-17 
12:38:31.000000000 +0000
@@ -280,6 +280,7 @@
        char    errstr[80];
        BOOL    gracedone = FALSE;
        char    *suf = '\0';
+    size_t wanted_bufsize = 0;
 
 /* cut the Debian specific suffix from the executable filename */
        suf = strstr(av[0], ".mmap");
@@ -584,12 +585,18 @@
        if (lverbose && driveropts)
                printf("Driveropts: '%s'\n", driveropts);
 
-/*     bufsize = scg_bufsize(scgp, CDR_BUF_SIZE);*/
        bufsize = scg_bufsize(scgp, bufsize);
        if (lverbose || debug)
                error("SCSI buffer size: %ld\n", bufsize);
-       if ((buf = scg_getbuf(scgp, bufsize)) == NULL)
-               comerr("Cannot get SCSI I/O buffer.\n");
+
+    wanted_bufsize = bufsize;
+    buf = scg_getbuf(scgp, &bufsize);
+
+    if (NULL == buf)
+        comerr("Cannot get SCSI I/O buffer of size %d bytes.\n", bufsize);
+
+    if ((lverbose || debug) && (bufsize != wanted_bufsize))
+        errmsgno(EX_BAD, "Asked for SCSI I/O buffer size %d bytes, could only 
get %d.\n", wanted_bufsize, bufsize);
 
        if ((flags & F_SCANBUS) != 0) {
                select_target(scgp, stdout);
diff -urNad cdrtools-2.01+01a03/include/scg/scsitransp.h 
/tmp/dpep.KsKoR8/cdrtools-2.01+01a03/include/scg/scsitransp.h
--- cdrtools-2.01+01a03/include/scg/scsitransp.h        2005-12-17 
12:37:57.000000000 +0000
+++ /tmp/dpep.KsKoR8/cdrtools-2.01+01a03/include/scg/scsitransp.h       
2005-12-17 12:38:31.000000000 +0000
@@ -144,7 +144,7 @@
 extern int     scg_initiator_id        __PR((SCSI *scgp));
 extern int     scg_isatapi             __PR((SCSI *scgp));
 extern int     scg_reset               __PR((SCSI *scgp, int what));
-extern void    *scg_getbuf             __PR((SCSI *scgp, long));
+extern void    *scg_getbuf             __PR((SCSI *scgp, long *amt));
 extern void    scg_freebuf             __PR((SCSI *scgp));
 extern long    scg_bufsize             __PR((SCSI *scgp, long));
 extern void    scg_setnonstderrs       __PR((SCSI *scgp, const char **));
diff -urNad cdrtools-2.01+01a03/libscg/scg/scsitransp.h 
/tmp/dpep.KsKoR8/cdrtools-2.01+01a03/libscg/scg/scsitransp.h
--- cdrtools-2.01+01a03/libscg/scg/scsitransp.h 2005-12-17 12:37:57.000000000 
+0000
+++ /tmp/dpep.KsKoR8/cdrtools-2.01+01a03/libscg/scg/scsitransp.h        
2005-12-17 12:38:31.000000000 +0000
@@ -144,7 +144,7 @@
 extern int     scg_initiator_id        __PR((SCSI *scgp));
 extern int     scg_isatapi             __PR((SCSI *scgp));
 extern int     scg_reset               __PR((SCSI *scgp, int what));
-extern void    *scg_getbuf             __PR((SCSI *scgp, long));
+extern void    *scg_getbuf             __PR((SCSI *scgp, long *amt));
 extern void    scg_freebuf             __PR((SCSI *scgp));
 extern long    scg_bufsize             __PR((SCSI *scgp, long));
 extern void    scg_setnonstderrs       __PR((SCSI *scgp, const char **));
diff -urNad cdrtools-2.01+01a03/libscg/scsitransp.c 
/tmp/dpep.KsKoR8/cdrtools-2.01+01a03/libscg/scsitransp.c
--- cdrtools-2.01+01a03/libscg/scsitransp.c     2005-12-17 12:38:26.000000000 
+0000
+++ /tmp/dpep.KsKoR8/cdrtools-2.01+01a03/libscg/scsitransp.c    2005-12-17 
12:39:03.000000000 +0000
@@ -63,7 +63,7 @@
 EXPORT int     scg_initiator_id __PR((SCSI *scgp));
 EXPORT int     scg_isatapi     __PR((SCSI *scgp));
 EXPORT int     scg_reset       __PR((SCSI *scgp, int what));
-EXPORT void    *scg_getbuf     __PR((SCSI *scgp, long));
+EXPORT void    *scg_getbuf     __PR((SCSI *scgp, long *amt));
 EXPORT void    scg_freebuf     __PR((SCSI *scgp));
 EXPORT long    scg_bufsize     __PR((SCSI *scgp, long));
 EXPORT void    scg_setnonstderrs __PR((SCSI *scgp, const char **));
@@ -233,14 +233,23 @@
 EXPORT void *
 scg_getbuf(scgp, amt)
        SCSI    *scgp;
-       long    amt;
+       long    *amt;
 {
        void    *buf;
+    size_t   pagesize = getpagesize();
+    long     bufsize = *amt;
 
-       if (amt <= 0 || amt > scg_bufsize(scgp, amt))
+       if (bufsize <= 0 || bufsize > scg_bufsize(scgp, bufsize))
                return ((void *)0);
 
-       buf = SCGO_GETBUF(scgp, amt);
+    while (bufsize >= (4*pagesize)) {
+        buf = SCGO_GETBUF(scgp, bufsize);
+        if (buf)
+            break;
+        bufsize -= pagesize;
+    }
+
+    *amt = bufsize;
        scgp->bufptr = buf;
        return (buf);
 }
diff -urNad cdrtools-2.01+01a03/mkisofs/diag/scsi.c 
/tmp/dpep.KsKoR8/cdrtools-2.01+01a03/mkisofs/diag/scsi.c
--- cdrtools-2.01+01a03/mkisofs/diag/scsi.c     2005-12-17 12:37:57.000000000 
+0000
+++ /tmp/dpep.KsKoR8/cdrtools-2.01+01a03/mkisofs/diag/scsi.c    2005-12-17 
12:38:31.000000000 +0000
@@ -156,7 +156,7 @@
        }
 
        bufsize = scg_bufsize(scgp, BUF_SIZE);
-       if ((buf = scg_getbuf(scgp, bufsize)) == NULL) {
+       if ((buf = scg_getbuf(scgp, &bufsize)) == NULL) {
                errmsg("Cannot get SCSI I/O buffer.\n");
                scg_close(scgp);
                return (-1);
diff -urNad cdrtools-2.01+01a03/mkisofs/scsi.c 
/tmp/dpep.KsKoR8/cdrtools-2.01+01a03/mkisofs/scsi.c
--- cdrtools-2.01+01a03/mkisofs/scsi.c  2005-12-17 12:37:57.000000000 +0000
+++ /tmp/dpep.KsKoR8/cdrtools-2.01+01a03/mkisofs/scsi.c 2005-12-17 
12:38:31.000000000 +0000
@@ -156,7 +156,7 @@
        }
 
        bufsize = scg_bufsize(scgp, BUF_SIZE);
-       if ((buf = scg_getbuf(scgp, bufsize)) == NULL) {
+       if ((buf = scg_getbuf(scgp, &bufsize)) == NULL) {
                errmsg("Cannot get SCSI I/O buffer.\n");
                scg_close(scgp);
                return (-1);
diff -urNad cdrtools-2.01+01a03/readcd/readcd.c 
/tmp/dpep.KsKoR8/cdrtools-2.01+01a03/readcd/readcd.c
--- cdrtools-2.01+01a03/readcd/readcd.c 2005-12-17 12:37:57.000000000 +0000
+++ /tmp/dpep.KsKoR8/cdrtools-2.01+01a03/readcd/readcd.c        2005-12-17 
12:38:31.000000000 +0000
@@ -390,7 +390,7 @@
        if (Sbufsize == 0)
                Sbufsize = 256*1024L;
        Sbufsize = scg_bufsize(scgp, Sbufsize);
-       if ((Sbuf = scg_getbuf(scgp, Sbufsize)) == NULL)
+       if ((Sbuf = scg_getbuf(scgp, &Sbufsize)) == NULL)
                comerr("Cannot get SCSI I/O buffer.\n");
 
        is_suid = geteuid() != getuid();
diff -urNad cdrtools-2.01+01a03/rscsi/rscsi.c 
/tmp/dpep.KsKoR8/cdrtools-2.01+01a03/rscsi/rscsi.c
--- cdrtools-2.01+01a03/rscsi/rscsi.c   2005-12-17 12:38:26.000000000 +0000
+++ /tmp/dpep.KsKoR8/cdrtools-2.01+01a03/rscsi/rscsi.c  2005-12-17 
12:38:31.000000000 +0000
@@ -86,7 +86,7 @@
 LOCAL  void    readbuf         __PR((char *buf, int n));
 LOCAL  void    voidarg         __PR((int n));
 LOCAL  void    readarg         __PR((char *buf, int n));
-LOCAL  char *  preparebuffer   __PR((int size));
+LOCAL  char *  preparebuffer   __PR((long *size));
 LOCAL  int     checkscsi       __PR((char *decive));
 LOCAL  void    rscsirespond    __PR((int ret, int err));
 LOCAL  void    rscsireply      __PR((int ret));
@@ -584,7 +584,7 @@
 LOCAL void
 getbuf()
 {
-       int     ret = 0;
+       long    ret = 0;
        char    amt[CMD_SIZE];
 
        readarg(amt, sizeof(amt));
@@ -594,7 +594,7 @@
                return;
        }
        ret = scg_bufsize(scsi_ptr, atol(amt));
-       if (preparebuffer(ret) == NULL)
+       if (preparebuffer(&ret) == NULL)
                ret = -1;
        rscsirespond(ret, geterrno());
 }
@@ -929,26 +929,26 @@
 
 LOCAL char *
 preparebuffer(size)
-       int     size;
+       long    *size;
 {
-       Sbufsize = size;
-       if ((Sbuf = scg_getbuf(scsi_ptr, Sbufsize)) == NULL) {
+       Sbufsize = *size;
+       if ((Sbuf = scg_getbuf(scsi_ptr, &Sbufsize)) == NULL) {
                Sbufsize = 0L;
                return (Sbuf);
        }
-       size = Sbufsize + 1024; /* Add protocol overhead */
+       *size = Sbufsize + 1024;        /* Add protocol overhead */
 
 #ifdef SO_SNDBUF
-       while (size > 512 &&
-              setsockopt(STDOUT_FILENO, SOL_SOCKET, SO_SNDBUF, (char *)&size, 
sizeof (size)) < 0)
-               size -= 512;
-       DEBUG1("rscsid: sndsize: %d\n", size);
+       while (*size > 512 &&
+              setsockopt(STDOUT_FILENO, SOL_SOCKET, SO_SNDBUF, (char *)size, 
sizeof (*size)) < 0)
+               *size -= 512;
+       DEBUG1("rscsid: sndsize: %d\n", *size);
 #endif
 #ifdef SO_RCVBUF
-       while (size > 512 &&
-              setsockopt(STDIN_FILENO, SOL_SOCKET, SO_RCVBUF, (char *)&size, 
sizeof (size)) < 0)
-               size -= 512;
-       DEBUG1("rscsid: rcvsize: %d\n", size);
+       while (*size > 512 &&
+              setsockopt(STDIN_FILENO, SOL_SOCKET, SO_RCVBUF, (char *)size, 
sizeof (*size)) < 0)
+               *size -= 512;
+       DEBUG1("rscsid: rcvsize: %d\n", *size);
 #endif
        return (Sbuf);
 }
diff -urNad cdrtools-2.01+01a03/scgcheck/scgcheck.c 
/tmp/dpep.KsKoR8/cdrtools-2.01+01a03/scgcheck/scgcheck.c
--- cdrtools-2.01+01a03/scgcheck/scgcheck.c     2005-12-17 12:37:57.000000000 
+0000
+++ /tmp/dpep.KsKoR8/cdrtools-2.01+01a03/scgcheck/scgcheck.c    2005-12-17 
12:38:31.000000000 +0000
@@ -460,23 +460,31 @@
 getbuf(scgp)
        SCSI    *scgp;
 {
+    long wanted_size = 0;
+    
        bufsize = scg_bufsize(scgp, MAX_BUF_SIZE);
                printf("Max DMA buffer size: %ld\n", bufsize);
                fprintf(logfile, "Max DMA buffer size: %ld\n", bufsize);
        seterrno(0);
-       if ((buf = scg_getbuf(scgp, bufsize)) == NULL) {
+    wanted_size = bufsize;
+       if ((buf = scg_getbuf(scgp, &bufsize)) == NULL) {
                errmsg("Cannot get SCSI buffer (%ld bytes).\n", bufsize);
                fprintf(logfile, "%s. Cannot get SCSI buffer (%ld bytes).\n",
                        errmsgstr(geterrno()), bufsize);
        } else {
+        if (wanted_size != bufsize)
+            fprintf(logfile, "Max buffer available: %ld but wanted %ld\n", 
bufsize, wanted_size);
                scg_freebuf(scgp);
        }
 
        bufsize = scg_bufsize(scgp, BUF_SIZE);
+    wanted_size = bufsize;
        if (debug)
                error("SCSI buffer size: %ld\n", bufsize);
-       if ((buf = scg_getbuf(scgp, bufsize)) == NULL)
+       if ((buf = scg_getbuf(scgp, &bufsize)) == NULL)
                comerr("Cannot get SCSI I/O buffer.\n");
+    if (wanted_size != bufsize)
+        fprintf(logfile, "Max buffer available: %ld but wanted %ld\n", 
bufsize, wanted_size);
 }
 
 EXPORT void
diff -urNad cdrtools-2.01+01a03/scgskeleton/skel.c 
/tmp/dpep.KsKoR8/cdrtools-2.01+01a03/scgskeleton/skel.c
--- cdrtools-2.01+01a03/scgskeleton/skel.c      2005-12-17 12:37:57.000000000 
+0000
+++ /tmp/dpep.KsKoR8/cdrtools-2.01+01a03/scgskeleton/skel.c     2005-12-17 
12:38:31.000000000 +0000
@@ -247,7 +247,7 @@
        if (Sbufsize == 0)
                Sbufsize = 256*1024L;
        Sbufsize = scg_bufsize(scgp, Sbufsize);
-       if ((Sbuf = scg_getbuf(scgp, Sbufsize)) == NULL)
+       if ((Sbuf = scg_getbuf(scgp, &Sbufsize)) == NULL)
                comerr("Cannot get SCSI I/O buffer.\n");
 
        is_suid = geteuid() != getuid();

Reply via email to