diff -urNad cdrtools-2.01.01/cdda2wav/interface.c patched-cdrtools-2.01.01/cdda2wav/interface.c
--- cdrtools-2.01.01/cdda2wav/interface.c	2004-08-05 11:57:27.000000000 +0200
+++ patched-cdrtools-2.01.01/cdda2wav/interface.c	2006-01-12 18:57:07.000000000 +0100
@@ -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,11 +560,23 @@
       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;
+
+      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;
+	  global.overlap = global.nsectors-1;
 
-	init_scsibuf(scgp, global.nsectors*CD_FRAMESIZE_RAW);
-	if (global.scanbus) {
+
+      	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.01/cdda2wav/scsi_cmds.c patched-cdrtools-2.01.01/cdda2wav/scsi_cmds.c
--- cdrtools-2.01.01/cdda2wav/scsi_cmds.c	2003-03-31 13:51:14.000000000 +0200
+++ patched-cdrtools-2.01.01/cdda2wav/scsi_cmds.c	2006-01-12 19:01:47.000000000 +0100
@@ -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.01/cdda2wav/scsi_cmds.h patched-cdrtools-2.01.01/cdda2wav/scsi_cmds.h
--- cdrtools-2.01.01/cdda2wav/scsi_cmds.h	2003-04-01 23:18:27.000000000 +0200
+++ patched-cdrtools-2.01.01/cdda2wav/scsi_cmds.h	2006-01-12 19:02:45.000000000 +0100
@@ -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.01/cdrecord/cdrecord.c patched-cdrtools-2.01.01/cdrecord/cdrecord.c
--- cdrtools-2.01.01/cdrecord/cdrecord.c	2006-01-12 01:31:23.000000000 +0100
+++ patched-cdrtools-2.01.01/cdrecord/cdrecord.c	2006-01-12 19:48:16.000000000 +0100
@@ -272,6 +272,7 @@
 	SCSI	*scgp = NULL;
 	char	errstr[80];
 	BOOL	gracedone = FALSE;
+	size_t	wanted_bufsize = 0;
 
 #ifdef __EMX__
 	/* This gives wildcard expansion with Non-Posix shells with EMX */
@@ -559,13 +560,19 @@
 	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);
 		exit(0);
diff -urNad cdrtools-2.01.01/libscg/scg/scsitransp.h patched-cdrtools-2.01.01/libscg/scg/scsitransp.h
--- cdrtools-2.01.01/libscg/scg/scsitransp.h	2003-05-03 19:09:17.000000000 +0200
+++ patched-cdrtools-2.01.01/libscg/scg/scsitransp.h	2006-01-12 19:18:09.000000000 +0100
@@ -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.01/libscg/scsitransp.c patched-cdrtools-2.01.01/libscg/scsitransp.c
--- cdrtools-2.01.01/libscg/scsitransp.c	2004-06-17 22:20:27.000000000 +0200
+++ patched-cdrtools-2.01.01/libscg/scsitransp.c	2006-01-12 19:26:50.000000000 +0100
@@ -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,15 +233,24 @@
 EXPORT void *
 scg_getbuf(scgp, amt)
 	SCSI	*scgp;
-	long	amt;
+	long	*amt;
 {
-	void	*buf;
+	void	*buf = NULL;
+	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);
-	scgp->bufptr = buf;
+	while (bufsize >= pagesize) {
+	    buf = SCGO_GETBUF(scgp, bufsize);
+	    if (buf)
+		    break;
+	    bufsize -= pagesize;
+	}
+	
+	*amt = bufsize;
+	    scgp->bufptr = buf;
 	return (buf);
 }
 
diff -urNad cdrtools-2.01.01/mkisofs/diag/scsi.c patched-cdrtools-2.01.01/mkisofs/diag/scsi.c
--- cdrtools-2.01.01/mkisofs/diag/scsi.c	2005-05-01 20:59:29.000000000 +0200
+++ patched-cdrtools-2.01.01/mkisofs/diag/scsi.c	2006-01-12 19:28:21.000000000 +0100
@@ -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.01/mkisofs/scsi.c patched-cdrtools-2.01.01/mkisofs/scsi.c
--- cdrtools-2.01.01/mkisofs/scsi.c	2005-05-01 20:59:29.000000000 +0200
+++ patched-cdrtools-2.01.01/mkisofs/scsi.c	2006-01-12 19:28:21.000000000 +0100
@@ -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.01/readcd/readcd.c patched-cdrtools-2.01.01/readcd/readcd.c
--- cdrtools-2.01.01/readcd/readcd.c	2005-06-11 15:22:10.000000000 +0200
+++ patched-cdrtools-2.01.01/readcd/readcd.c	2006-01-12 19:29:50.000000000 +0100
@@ -392,7 +392,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.01/rscsi/rscsi.c patched-cdrtools-2.01.01/rscsi/rscsi.c
--- cdrtools-2.01.01/rscsi/rscsi.c	2005-05-16 14:59:33.000000000 +0200
+++ patched-cdrtools-2.01.01/rscsi/rscsi.c	2006-01-12 20:06:43.000000000 +0100
@@ -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));
@@ -574,7 +574,7 @@
 LOCAL void
 getbuf()
 {
-	int	ret = 0;
+	long	ret = 0;
 	char	amt[CMD_SIZE];
 
 	readarg(amt, sizeof(amt));
@@ -584,7 +584,7 @@
 		return;
 	}
 	ret = scg_bufsize(scsi_ptr, atol(amt));
-	if (preparebuffer(ret) == NULL)
+	if (preparebuffer(&ret) == NULL)
 		ret = -1;
 	rscsirespond(ret, geterrno());
 }
@@ -919,26 +919,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.01/scgcheck/scgcheck.c patched-cdrtools-2.01.01/scgcheck/scgcheck.c
--- cdrtools-2.01.01/scgcheck/scgcheck.c	2004-09-08 19:49:48.000000000 +0200
+++ patched-cdrtools-2.01.01/scgcheck/scgcheck.c	2006-01-12 19:50:23.000000000 +0100
@@ -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)
+		    fprint(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)
+	    fprint(logfile, "Max buffer available: %ld but wanted %ld\n", bufsize, wanted_size);
 }
 
 EXPORT void
diff -urNad cdrtools-2.01.01/scgskeleton/skel.c patched-cdrtools-2.01.01/scgskeleton/skel.c
--- cdrtools-2.01.01/scgskeleton/skel.c	2004-07-11 00:57:27.000000000 +0200
+++ patched-cdrtools-2.01.01/scgskeleton/skel.c	2006-01-12 19:45:39.000000000 +0100
@@ -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();

    Source: geocities.com/de/linux_piewie/download

               ( geocities.com/de/linux_piewie)                   ( geocities.com/de)