From owner-freebsd-hackers Mon Jan 29 08:43:52 1996 Return-Path: owner-hackers Received: (from root@localhost) by freefall.freebsd.org (8.7.3/8.7.3) id IAA12558 for hackers-outgoing; Mon, 29 Jan 1996 08:43:52 -0800 (PST) Received: from trout.sri.MT.net (trout.sri.MT.net [204.182.243.12]) by freefall.freebsd.org (8.7.3/8.7.3) with SMTP id IAA12541 for ; Mon, 29 Jan 1996 08:43:35 -0800 (PST) Received: (from root@localhost) by trout.sri.MT.net (8.6.12/8.6.12) id JAA13825 for hackers@FreeBSD.org; Mon, 29 Jan 1996 09:43:23 -0700 Date: Mon, 29 Jan 1996 09:43:23 -0700 From: Nate Williams Message-Id: <199601291643.JAA13825@trout.sri.MT.net> To: hackers@FreeBSD.org Subject: Net patch for ATAPI driver Sender: owner-hackers@FreeBSD.org Precedence: bulk Newsgroups: comp.unix.bsd.freebsd.misc Path: helena.MT.net!news.sprintlink.net!ns.pilot.net!news2.pilot.net!xilinx!neocad.xilinx.com!uucp-1.csn.net!csn!magnus.acs.ohio-state.edu!math.ohio-state.edu!howland.reston.ans.net!ix.netcom.com!netcom.com!kientzle From: kientzle@netcom.com Subject: Patch for `wcd.c' in 2.1R Message-ID: Summary: TOCENTRY mis-handles small requests, leadouts Organization: NETCOM On-line Communication Services (408 261-4700 guest) Date: Sun, 28 Jan 1996 06:07:30 GMT Lines: 70 Sender: kientzle@netcom13.netcom.com Not completely sure who to send this to, but I'm certain someone here can relay this to the right place: I ran into some trouble getting `xcdplayer' to work with an ATAPI CD-ROM drive. Comparing it's operation to `xcd' (which works fine), I narrowed down the problem to the handling of `ioctl(CDIOREADTOCENTRYS)' in `wcd.c'. Briefly, the 2.1R version doesn't honor requests for entry 170 (the leadout entry), and it fails to completely convert from LBA to MSF format for small requests. Here's the patch: %%%%%CUT%HERE%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% *** wcd.c.orig Fri Jan 26 20:30:25 1996 --- wcd.c Sat Jan 27 19:44:13 1996 *************** *** 733,744 **** struct toc buf; u_long len; if (! t->toc.hdr.ending_track) return (EIO); ! if (te->starting_track < toc->hdr.starting_track || ! te->starting_track > toc->hdr.ending_track) return (EINVAL); ! len = (toc->hdr.ending_track - te->starting_track + 2) * sizeof(toc->tab[0]); if (te->data_len < len) --- 733,749 ---- struct toc buf; u_long len; + u_char starting_track = te->starting_track; if (! t->toc.hdr.ending_track) return (EIO); ! ! if (starting_track == 170) /* Handle leadout request */ ! starting_track = toc->hdr.ending_track+1; ! ! if (starting_track < toc->hdr.starting_track || ! starting_track > toc->hdr.ending_track +1 ) return (EINVAL); ! len = (toc->hdr.ending_track - starting_track + 2) * sizeof(toc->tab[0]); if (te->data_len < len) *************** *** 754,763 **** toc = &buf; e = toc->tab + toc->hdr.ending_track - ! te->starting_track + 2; while (--e >= toc->tab) lba2msf (e->addr.lba, &e->addr.msf.minute, &e->addr.msf.second, &e->addr.msf.frame); } ! if (copyout (toc->tab + te->starting_track - toc->hdr.starting_track, te->data, len) != 0) error = EFAULT; --- 759,768 ---- toc = &buf; e = toc->tab + toc->hdr.ending_track - ! toc->hdr.starting_track + 2; while (--e >= toc->tab) lba2msf (e->addr.lba, &e->addr.msf.minute, &e->addr.msf.second, &e->addr.msf.frame); } ! if (copyout (toc->tab + starting_track - toc->hdr.starting_track, te->data, len) != 0) error = EFAULT; %%%%%CUT%HERE%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%