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();