Date: Fri, 27 Oct 2000 10:15:08 GMT From: James Risner <risner@install.stdio.com> To: FreeBSD-gnats-submit@freebsd.org Subject: bin/22347: dd copies incorrect data after 2^32 bytes and I/O error Message-ID: <200010271015.e9RAF8n02396@install.stdio.com>
next in thread | raw e-mail | index | archive | help
>Number: 22347
>Category: bin
>Synopsis: dd copies incorrect data after 2^32 bytes and I/O error
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Fri Oct 27 07:20:01 PDT 2000
>Closed-Date:
>Last-Modified:
>Originator: James Risner
>Release: FreeBSD 4.1-STABLE i386
>Organization:
OpenWorld, Inc.
>Environment:
Copyright (c) 1992-2000 The FreeBSD Project.
Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
The Regents of the University of California. All rights reserved.
FreeBSD 4.1-STABLE #0: Sun Sep 10 10:40:36 GMT 2000
risner@install.stdio.com:/usr/obj/usr/src/sys/AKIRA
Timecounter "i8254" frequency 1193182 Hz
CPU: AMD-K6(tm) 3D+ Processor (399.81-MHz 586-class CPU)
Origin = "AuthenticAMD" Id = 0x591 Stepping = 1
Features=0x8021bf<FPU,VME,DE,PSE,TSC,MSR,MCE,CX8,PGE,MMX>
AMD Features=0x80000800<SYSCALL,3DNow!>
real memory = 100663296 (98304K bytes)
avail memory = 94384128 (92172K bytes)
Preloaded elf kernel "kernel" at 0xc0339000.
ccd0-3: Concatenated disk drivers
K6-family MTRR support enabled (2 registers)
md0: Malloc disk
npx0: <math processor> on motherboard
npx0: INT 16 interface
pcib0: <Host to PCI bridge> on motherboard
pci0: <PCI bus> on pcib0
isab0: <Intel 82371SB PCI to ISA bridge> at device 7.0 on pci0
isa0: <ISA bus> on isab0
atapci0: <Intel PIIX3 ATA controller> port 0xe800-0xe80f at device 7.1 on pci0
ata0: at 0x1f0 irq 14 on atapci0
ata1: at 0x170 irq 15 on atapci0
uhci0: <Intel 82371SB (PIIX3) USB controller> port 0xe400-0xe41f irq 12 at device 7.2 on pci0
usb0: <Intel 82371SB (PIIX3) USB controller> on uhci0
usb0: USB revision 1.0
uhub0: Intel UHCI root hub, class 9/0, rev 1.00/1.00, addr 1
uhub0: 2 ports with 2 removable, self powered
pci0: <Trident model 9750 VGA-compatible display device> at 10.0 irq 10
fxp0: <Intel Pro 10/100B/100+ Ethernet> port 0xe000-0xe03f mem 0xe5000000-0xe50fffff,0xe5800000-0xe5800fff irq 11 at device 11.0 on pci0
fxp0: Ethernet address 00:90:27:94:8b:87
fdc0: <NEC 72065B or clone> at port 0x3f0-0x3f5,0x3f7 irq 6 drq 2 on isa0
fdc0: FIFO enabled, 8 bytes threshold
fd0: <1440-KB 3.5" drive> on fdc0 drive 0
atkbdc0: <Keyboard controller (i8042)> at port 0x60,0x64 on isa0
atkbd0: <AT Keyboard> flags 0x1 irq 1 on atkbdc0
kbd0 at atkbd0
vga0: <Generic ISA VGA> at port 0x3c0-0x3df iomem 0xa0000-0xbffff on isa0
sc0: <System console> at flags 0x100 on isa0
sc0: VGA <6 virtual consoles, flags=0x300>
sio0 at port 0x3f8-0x3ff irq 4 flags 0x10 on isa0
sio0: type 16550A
sio1 at port 0x2f8-0x2ff irq 3 on isa0
sio1: type 16550A
ppc0: <Parallel port> at port 0x378-0x37f irq 7 on isa0
ppc0: SMC-like chipset (ECP/EPP/PS2/NIBBLE) in COMPATIBLE mode
ppc0: FIFO with 16/16/16 bytes threshold
ppi0: <Parallel I/O> on ppbus0
lpt0: <Printer> on ppbus0
lpt0: Interrupt-driven port
ad0: 32253MB <IBM-DPTA-353750> [65531/16/63] at ata0-master using WDMA2
ata0-slave: DMA limited to UDMA33, non-ATA66 compliant cable
ad1: 25965MB <Maxtor 92720U8> [52755/16/63] at ata0-slave using WDMA2
ad2: 16479MB <Maxtor 91728D8> [33483/16/63] at ata1-master using WDMA2
ata1-slave: DMA limited to UDMA33, non-ATA66 compliant cable
ad3: 25965MB <Maxtor 92720U8> [52755/16/63] at ata1-slave using WDMA2
Mounting root from ufs:/dev/ad0s1a
pid 147 (dumpfs), uid 0: exited on signal 10 (core dumped)
ad3: HARD READ ERROR blk# 44391983 status=59 error=40
"$FreeBSD: src/bin/dd/dd.c,v 1.27.2.1 2000/08/07 08:30:17 ps Exp $";
"$FreeBSD: src/bin/dd/position.c,v 1.17.2.1 2000/08/07 08:30:17 ps Exp $";
/dev/ad3:
# /dev/ad3c:
type: ESDI
disk: wd3s1
label: busted disk2
flags:
bytes/sector: 512
sectors/track: 63
tracks/cylinder: 16
sectors/cylinder: 1008
cylinders: 52754
sectors/unit: 53176977
rpm: 3600
interleave: 1
trackskew: 0
cylinderskew: 0
headswitch: 0 # milliseconds
track-to-track seek: 0 # milliseconds
drivedata: 0
8 partitions:
# size offset fstype [fsize bsize bps/cpg]
c: 53176977 0 unused 0 0 # (Cyl. 0 - 52754*)
d: 39283345 13893632 4.2BSD 1024 8192 16 # (Cyl. 13783*- 52754*)
e: 13885440 8192 vinum # (Cyl. 8*- 13783*)
/dev/ad1:
# /dev/ad1c:
type: ESDI
disk: wd1s1
label: good disk
flags:
bytes/sector: 512
sectors/track: 63
tracks/cylinder: 16
sectors/cylinder: 1008
cylinders: 52754
sectors/unit: 53176977
rpm: 3600
interleave: 1
trackskew: 0
cylinderskew: 0
headswitch: 0 # milliseconds
track-to-track seek: 0 # milliseconds
drivedata: 0
8 partitions:
# size offset fstype [fsize bsize bps/cpg]
c: 53176977 0 unused 0 0 # (Cyl. 0 - 52754*)
d: 39283345 13893632 4.2BSD 1024 8192 16 # (Cyl. 13783*- 52754*)
e: 13885440 8192 vinum # (Cyl. 8*- 13783*)
>Description:
When using /bin/dd with bad sectors, /bin/dd truncates the seek location to 32 bits
after errors.
>How-To-Repeat:
When /bin/dd copies data from a disk with an I/O error and the disk has
bad sectors more than 2^32 bytes into the file, dd does lseeks to skip the bad
sectors. This lseek is not cast to off_t which causes it to be truncated at 32 bits.
This both causes dd to copy the wrong data.
>Fix:
*** dd.c.orig Fri Oct 27 02:58:31 2000
--- dd.c Fri Oct 27 03:02:03 2000
***************
*** 416,422 ****
if (pending != 0) {
if (force)
pending--;
! if (lseek(out.fd, pending, SEEK_CUR) ==
-1)
err(2, "%s: seek error creating sparse file",
out.name);
--- 416,422 ----
if (pending != 0) {
if (force)
pending--;
! if (lseek(out.fd, (off_t) pending, SEEK_CUR) ==
-1)
err(2, "%s: seek error creating sparse file",
out.name);
*** position.c.orig Fri Oct 27 02:58:45 2000
--- position.c Fri Oct 27 03:01:49 2000
***************
*** 70,76 ****
/* If known to be seekable, try to seek on it. */
if (in.flags & ISSEEK) {
errno = 0;
! if (lseek(in.fd, in.offset * in.dbsz, SEEK_CUR) == -1 &&
errno != 0)
err(1, "%s", in.name);
return;
--- 70,76 ----
/* If known to be seekable, try to seek on it. */
if (in.flags & ISSEEK) {
errno = 0;
! if (lseek(in.fd, (off_t) (in.offset * in.dbsz), SEEK_CUR) == -1 &&
errno != 0)
err(1, "%s", in.name);
return;
***************
*** 132,138 ****
*/
if (out.flags & (ISSEEK | ISPIPE)) {
errno = 0;
! if (lseek(out.fd, out.offset * out.dbsz, SEEK_CUR) == -1 &&
errno != 0)
err(1, "%s", out.name);
return;
--- 132,138 ----
*/
if (out.flags & (ISSEEK | ISPIPE)) {
errno = 0;
! if (lseek(out.fd, (off_t) (out.offset * out.dbsz), SEEK_CUR) == -1 &&
errno != 0)
err(1, "%s", out.name);
return;
>Release-Note:
>Audit-Trail:
>Unformatted:
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200010271015.e9RAF8n02396>
