From unknown Tue Jun 17 20:13:44 2025 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Mailer: MIME-tools 5.509 (Entity 5.509) Content-Type: text/plain; charset=utf-8 From: bug#12656 <12656@debbugs.gnu.org> To: bug#12656 <12656@debbugs.gnu.org> Subject: Status: cp since 8.11 corrupts files Reply-To: bug#12656 <12656@debbugs.gnu.org> Date: Wed, 18 Jun 2025 03:13:44 +0000 retitle 12656 cp since 8.11 corrupts files reassign 12656 coreutils submitter 12656 "Mike Gerth" severity 12656 normal tag 12656 fixed thanks From debbugs-submit-bounces@debbugs.gnu.org Mon Oct 15 11:55:57 2012 Received: (at submit) by debbugs.gnu.org; 15 Oct 2012 15:55:57 +0000 Received: from localhost ([127.0.0.1]:45430 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TNn1G-0002IE-Lx for submit@debbugs.gnu.org; Mon, 15 Oct 2012 11:55:57 -0400 Received: from eggs.gnu.org ([208.118.235.92]:60798) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TNmGm-0001E4-V6 for submit@debbugs.gnu.org; Mon, 15 Oct 2012 11:07:55 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TNmFL-0001Gs-QI for submit@debbugs.gnu.org; Mon, 15 Oct 2012 11:06:35 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00,HTML_MESSAGE, RCVD_IN_DNSWL_HI autolearn=unavailable version=3.3.2 Received: from lists.gnu.org ([208.118.235.17]:36576) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TNmFL-0001Go-Mk for submit@debbugs.gnu.org; Mon, 15 Oct 2012 11:06:23 -0400 Received: from eggs.gnu.org ([208.118.235.92]:46126) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TNmFI-0006sg-LT for bug-coreutils@gnu.org; Mon, 15 Oct 2012 11:06:23 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TNmF6-0001A6-GE for bug-coreutils@gnu.org; Mon, 15 Oct 2012 11:06:20 -0400 Received: from mail.avm.de ([212.42.244.120]:59480) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TNmF5-00014K-SI for bug-coreutils@gnu.org; Mon, 15 Oct 2012 11:06:08 -0400 Received: from mail-notes.avm.de (mail-notes.avm.de [172.16.0.1]) by mail.avm.de (8.13.8/8.13.8/SuSE Linux 0.8) with ESMTP id q9FF60fo005174 for ; Mon, 15 Oct 2012 17:06:02 +0200 To: bug-coreutils@gnu.org MIME-Version: 1.0 Subject: cp since 8.11 corrupts files X-KeepSent: 02A3B91E:8B4BD4B7-C1257A98:004EAEE2; type=4; name=$KeepSent X-Mailer: Lotus Notes Release 8.5.3 September 15, 2011 Message-ID: From: "Mike Gerth" Date: Mon, 15 Oct 2012 17:05:56 +0200 X-MIMETrack: Serialize by Router on ANIS1/AVM(Release 8.5.3FP1|March 07, 2012) at 15.10.2012 17:06:02, Serialize complete at 15.10.2012 17:06:02 Content-Type: multipart/alternative; boundary="=_alternative 0052F103C1257A98_=" X-AntiVirus: checked by AntiVir MailGate (version: 2.1.2-11; AVE: 7.9.10.68; VDF: 7.11.46.46; host: mail.avm.de) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 3) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 3) X-Received-From: 208.118.235.17 X-Spam-Score: -4.2 (----) X-Debbugs-Envelope-To: submit X-Mailman-Approved-At: Mon, 15 Oct 2012 11:55:53 -0400 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: -4.2 (----) Dies ist eine mehrteilige Nachricht im MIME-Format. --=_alternative 0052F103C1257A98_= Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: quoted-printable Hello, I noticed an error in cp (8.11 upwards till 8.19) when copying many files=20 from an fragmented ext3fs (to an empty partition). ERROR: The copied file has exact length.=20 The SourceFile has in the middle a 4K-block filled with ZERO, the=20 DestFile this 4k-block and the previous 4k-block also filled with ZERO. =20 I can reproduce this: Conditions: *I have a strong fragmented 110GB ext3-partition with >300 = Files *I have to copy about 100 files (ca. 15GB) to another=20 HDD-Partition or ramdisk *cp must be 8.11 or higher (compiled under SLES11SP2=20 kernel 3.0) (everything is ok with 6.11. 8.05..8.10) *Command:=20 cp819 $FILES $DEST #here the corruption comes *$FILES is a list of about 100 DatabaseFiles. The=20 last one is the file that becomes corrupted =20 I can =5FNOT=5F reproduce this: *with cp <8.11 *Command: for F in $FILES; do cp -dp $SRC$F $DEST$F ;done=20 #no corruption Reproduce: *tested with SLES11SP1, SLES11SP2, Ubuntu 12.04 (cp less 8.11 is good, cp 8.11 upwards corrupts the file) *when I bulk copy the about 100 files, the corruption always=20 happen with the same file and same position *if I copy less files or the single file there is no corruption=20 *if I copy all files there are more corruptions Additional info: # ./fragments /mnt/Source/ Summary statistics for /mnt/Source/ including subdirectories: blocks files fragmented percent fragm./file --------------------------------------------------- 1 1 0 0.00 1.00 <=3D 12 0 0 0.00 0.00 <=3D 524 0 0 0.00 0.00 <=3D 1036 0 0 0.00 0.00 <=3D 4108 11 11 100.00 54.00 > 4108 307 307 100.00 159.71 --------------------------------------------------- all 319 318 99.69 155.57 > 1 318 318 100.00 156.05 Fragmentation index: 0.428 percent. frag: 49625 n: 318 n=5Fblocks: 11513587 (n=5Ffrag: 318) #cmp Julius.nsf /mnt/ramdisk/Julius.nsf Julius.nsf /mnt/ramdisk/Julius.nsf differ: char 18395137, line 345000 18395137=3D4491*4K + 1 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D #dd if=3DJuliusGOOD.nsf bs=3D4096 skip=3D4491 |hexdump -C |more 00000000 16 00 00 ff 00 10 00 00 00 00 00 00 00 00 02 00=20 |................| 00000010 00 00 00 00 00 00 00 00 10 0f 00 00 00 00 00 00=20 |................| 00000020 af 2f 06 00 1d 00 16 0a 00 00 00 00 40 09 88 00=20 |./..........@...| .... 00000a30 00 00 00 6e 64 65 00 00 00 00 00 00 00 00 00 00=20 |...nde..........| 00000a40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00=20 |................| * 00000c00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00=20 |................| 00000c10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00=20 |................| * 00000e00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00=20 |................| 00000e10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00=20 |................| * 00002000 18 00 00 ff 00 10 00 00 00 00 00 00 00 00 02 00=20 |................| --------------- #dd if=3D/mnt/ramdisk/JuliusBAD.nsf bs=3D4096 skip=3D4491 |hexdump -C |more 00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00=20 |................| * 00002000 18 00 00 ff 00 10 00 00 00 00 00 00 00 00 02 00=20 |................| =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D # filefrag JuliusGood.nsf -v Filesystem type is: ef53 Filesystem cylinder groups is approximately 881 File size of JuliusGood.nsf is 175935488 (42953 blocks, blocksize 4096) ext logical physical expected length flags 0 0 2008262 2 merged 1 2 2008281 2008263 7 merged 2 9 2008303 2008287 1 merged 3 10 2008307 2008303 2 merged 4 12 2008310 2008308 2 merged 5 14 2008319 2008311 1 merged 6 15 2008321 2008319 4 merged 7 19 2031582 2008324 2 merged 8 21 2033663 2031583 41 merged 9 62 2033706 2033703 1 merged 10 63 2033704 2033706 2 merged 11 65 2033707 2033705 22 merged 12 87 2033736 2033728 23 merged 13 110 7961027 2033758 1 merged 14 111 7961587 7961027 1 merged 15 112 7943051 7961587 2 merged 16 114 7932925 7943052 1 merged 17 115 7939414 7932925 1 merged 18 116 2053842 7939414 2 merged 19 119 7961063 2053843 1 merged 20 120 7961059 7961063 2 merged 21 122 2033759 7961060 160 merged 22 282 7943053 2033918 1 merged 23 283 7961035 7943053 1 merged 24 284 7961030 7961035 1 merged 25 285 2033919 7961030 108 merged 26 393 7961054 2034026 1 merged 27 394 7961039 7961054 1 merged 28 395 2034027 7961039 104 merged 29 499 2034143 2034130 3 merged 30 502 2034159 2034145 8 merged 31 510 7961047 2034166 1 merged 32 511 7961033 7961047 1 merged 33 512 2034167 7961033 494 merged 34 1006 2034666 2034660 1 merged 35 1007 2034670 2034666 29 merged 36 1036 2034701 2034698 478 merged 37 1514 2035182 2035178 510 merged 38 2024 2035697 2035691 24 merged 39 2048 2038674 2035720 1 merged 40 2049 2035721 2038674 11 merged 41 2060 2035733 2035731 385 merged 42 2445 2036120 2036117 2 merged 43 2447 2036128 2036121 1 merged 44 2448 2036136 2036128 1 merged 45 2449 2036518 2036136 1 merged 46 2450 2037030 2036518 634 merged 47 3084 2037665 2037663 117 merged 48 3201 2037784 2037781 886 merged 49 4087 7961058 2038669 1 merged 50 4088 7961049 7961058 1 merged 51 4089 2038670 7961049 4 merged 52 4093 2040616 2038673 1 merged 53 4094 2038675 2040616 14 merged 54 4108 2038690 2038688 291 merged 55 4399 7961036 2038980 1 merged 56 4400 7961050 7961036 1 merged 57 4401 2038981 7961050 10 merged 58 4411 2038993 2038990 9 merged 59 4431 2038991 2039001 2 merged 60 4433 7961064 2038992 9 merged 61 4453 2039002 7961072 10 merged 62 4463 2053899 2039011 1 merged 63 4464 7932921 2053899 1 merged 64 4465 7936120 7932921 1 merged 65 4466 2039012 7936120 18 merged 66 4484 7943055 2039029 1 merged 67 4485 7961056 7943055 1 merged 68 4486 7961041 7961056 1 merged 69 4487 7961045 7961041 2 merged 70 4489 7961053 7961046 1 merged 71 4490 7961031 7961053 1 merged 72 4491 7961034 7961031 1 merged 73 4493 7961044 7961034 1 merged 74 4494 2039030 7961044 285 merged 75 4779 2054871 2039314 1 merged 76 4780 2053844 2054871 1 merged .... Copied corrupted File: # filefrag /mnt/DEST/JuliusBad.nsf -v Filesystem type is: ef53 Filesystem cylinder groups is approximately 881 File size of /mnt/DEST/gschouten.nsf is 175935488 (42953 blocks, blocksize = 4096) ext logical physical expected length flags 0 0 3146242 6 merged 1 6 3155036 3146247 6 merged 2 12 3155043 3155041 106 merged 3 119 3155149 917 merged 4 1036 3156068 3156065 1024 merged 5 2060 3157093 3157091 1024 merged 6 3084 3158118 3158116 1024 merged 7 4108 3159143 3159141 312 merged 8 4431 3159455 11 merged 9 4453 3159466 38 merged 10 4493 3159504 639 merged 11 5132 3160144 3160142 417 merged 12 5550 3160561 441 merged ...... ###This is the fragmented,good SourceFile: debugfs 1.41.9 (22-Aug-2009) debugfs: stat JuliusGood.nsf Inode: 102 Type: regular Mode: 0644 Flags: 0x0 Generation: 1499014015 Version: 0x00000000 User: 1001 Group: 1001 Size: 175935488 File ACL: 0 Directory ACL: 0 Links: 1 Blockcount: 343576 Fragment: Address: 0 Number: 0 Size: 0 ctime: 0x505e346a -- Sat Sep 22 23:58:02 2012 atime: 0x506041bf -- Mon Sep 24 13:19:27 2012 mtime: 0x505e346a -- Sat Sep 22 23:58:02 2012 Size of extra inode fields: 4 BLOCKS: (0-1):2008262-2008263, (2-8):2008281-2008287, (9):2008303,=20 (10-11):2008307-2008308, (IND):2008309, (12-13):2008310-2008311,=20 (14):2008319, (15-18):2008321-2008324, (19-20):2031582 -2031583, (21-61):2033663-2033703, (62):2033706, (63-64):2033704-2033705,=20 (65-86):2033707-2033728, (87-109):2033736-2033758, (110):7961027,=20 (111):7961587, (112-113):7943051-79430 52, (114):7932925, (115):7939414, (116-117):2053842-2053843,=20 (119):7961063, (120-121):7961059-7961060, (122-281):2033759-2033918,=20 (282):7943053, (283):7961035, (284):7961030, (28 5-392):2033919-2034026, (393):7961054, (394):7961039,=20 (395-498):2034027-2034130, (499-501):2034143-2034145,=20 (502-509):2034159-2034166, (510):7961047, (511):7961033, (512-1005):20 34167-2034660, (1006):2034666, (1007-1035):2034670-2034698,=20 (DIND):2034699, (IND):2034700, (1036-1513):2034701-2035178,=20 (1514-2023):2035182-2035691, (2024-2047):2035697-2035720, (2048):2038674, (2049-2059):2035721-2035731, (IND):2035732,=20 (2060-2444):2035733-2036117, (2445-2446):2036120-2036121, (2447):2036128,=20 (2448):2036136, (2449):2036518, (2450-3083): 2037030-2037663, (IND):2037664, (3084-3200):2037665-2037781,=20 (3201-4086):2037784-2038669, (4087):7961058, (4088):7961049,=20 (4089-4092):2038670-2038673, (4093):2040616, (4094-4107) :2038675-2038688, (IND):2038689, (4108-4398):2038690-2038980,=20 (4399):7961036, (4400):7961050, (4401-4410):2038981-2038990,=20 (4411-4419):2038993-2039001, (4431-4432):2038991-203899 2, (4433-4441):7961064-7961072, (4453-4462):2039002-2039011,=20 (4463):2053899, (4464):7932921, (4465):7936120,=20 (4466-4483):2039012-2039029, (4484):7943055, (4485):7961056, (4486):7 961041, (4487-4488):7961045-7961046, (4489):7961053, (4490):7961031,=20 (4491):7961034, (4493):7961044, (4494-4778):2039030-2039314,=20 (4779):2054871, (4780):2053844, (4781-4800):2039 ###Here comes the corrupted File: debugfs 1.41.9 (22-Aug-2009) debugfs: stat JuliusBad.nsf Inode: 114 Type: regular Mode: 0644 Flags: 0x0 Generation: 3620008692 Version: 0x00000000 User: 0 Group: 0 Size: 175935488 File ACL: 0 Directory ACL: 0 Links: 1 Blockcount: 343568 Fragment: Address: 0 Number: 0 Size: 0 ctime: 0x507831f2 -- Fri Oct 12 17:06:26 2012 atime: 0x507831f0 -- Fri Oct 12 17:06:24 2012 mtime: 0x507831f2 -- Fri Oct 12 17:06:26 2012 Size of extra inode fields: 4 BLOCKS: (0-5):3146242-3146247, (6-11):3155036-3155041, (IND):3155042,=20 (12-117):3155043-3155148, (119-1035):3155149-3156065, (DIND):3156066,=20 (IND):3156067, (1036-2059):3156068-3157091, (IND):315709 2, (2060-3083):3157093-3158116, (IND):3158117,=20 (3084-4107):3158118-3159141, (IND):3159142, (4108-4419):3159143-3159454,=20 (4431-4441):3159455-3159465, (4453-4490):3159466-3159503, (4493-5131 ):3159504-3160142, I am 95% sure that in previous Tests if have also seen a corrupted file=20 with several 100k filled with ZERO. Surely it would be most simple to reproduce the error if I could provide=20 the whole partition as is. But since the Files are Database files I can not provide it. Are there any = tests that I can do? Best regards and thanks in advance for your help, Mike Mit freundlichen Gr=FC=DFen Mike Gerth Dipl. Inf. Mike Gerth +49 30 399 76 136 IT-Systemadministrator AVM Audiovisuelles Marketing und Computersysteme GmbH=20 Alt-Moabit 95, 10559 Berlin HRB 23075 AG Charlottenburg Gesch=E4ftsf=FChrer: Johannes Nill =20 --=_alternative 0052F103C1257A98_= Content-Type: text/html; charset="ISO-8859-1" Content-Transfer-Encoding: quoted-printable Hello,

I noticed an error in cp (8.11 upwa= rds till 8.19) when copying many files from an fragmented ext3fs (to an empty partition).

ERROR:
        The copied file has exact length.
        The SourceFile has in the middle a 4K-block filled with ZERO, the DestFile this 4k-block and the previous 4k-block also filled with ZERO.
       

I can reproduce this:
        Conditi= ons:
                *I have a strong fragmented 110GB ext3-partition with >300 Files
                *I have to copy about 100 files (ca. 15GB) to another HDD-Partition or ramdisk
                *cp must be 8.11 or higher (compiled under SLES11SP2 kernel 3.0) (everything is ok with 6.11. 8.05..8.10)
                *Command:
                        cp819    $FILES $DEST                                         #here the corruption comes
                        *$FILES is a list of about 100 DatabaseFiles. The last one is the file that becomes corrupted
       
I can =5FNOT=5F reproduce this:<= /b>
                *with cp <8.11
                *Command:
                        for F in $FILES; do cp -dp $SRC$F $DEST$F ;done                #no corruption


Reproduce:
        *tested with SLES11SP1, SLES11SP2, Ubuntu 12.04
                (cp less 8.11 is good, cp 8.11 upwards corrupts the file)
        *when I bulk copy the about 100 files, the corruption always happen with the same file and same position
        *if I copy less files or the single file there is no corruption
        *if I copy all files there are more corruptions


Additional info:
# ./fragments /mnt/Source/
Summary statistics for /mnt/Source/ including subdirectories:

 blocks    files &nb= sp;fragmented  percent  fragm./file
-----------------------------------= ----------------
      1        1           0     0.00         1.00
  <=3D 12     &nb= sp;  0           0     0.00         0.00
<=3D  524     &nb= sp;  0           0     0.00         0.00
<=3D 1036       &= nbsp;0           0     0.00         0.00
<=3D 4108       11          11   100.00        54.00
 > 4108      = ;307         307   100.00       159.71
-----------------------------------= ----------------
    all     &nb= sp;319         318    99.69       155.57
    > 1      318         318   100.00       156.05
Fragmentation index:  0.428 pe= rcent.
frag: 49625  n: 318  n=5F= blocks: 11513587  (n=5Ffrag: 318)



#cmp Julius.nsf /mnt/ramdisk/Julius= .nsf
Julius.nsf /mnt/ramdisk/Julius.nsf differ: char 18395137, line 345000
18395137=3D4491*4K + 1

=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D

#dd if=3DJuliusGOOD.nsf bs=3D409= 6 skip=3D4491 |hexdump -C |more
00000000  16 00 00 ff 00 10 00 00  00 00 00 00 00 00 02 00  |................|
00000010  00 00 00 00 00 00 00 00  10 0f 00 00 00 00 00 00  |................|
00000020  af 2f 06 00 1d 00 16 0a  00 00 00 00 40 09 88 00  |./..........@...|
....
00000a30  00 00 00 6e 64 65 00 00  00 00 00 00 00 00 00 00  |...nde..........|
00000a40  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000c00  01 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000c10  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000e00  01 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000e10  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00002000  18 00 00 ff 00 10 00 00  00 00 00 00 00 00 02 00  |................|

---------------

#dd if=3D/mnt/ramdisk/JuliusBAD.= nsf bs=3D4096 skip=3D4491 |hexdump -C |more
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00002000  18 00 00 ff 00 10 00 00  00 00 00 00 00 00 02 00  |................|




=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D
# filefrag JuliusGood.nsf -v
Filesystem type is: ef53
Filesystem cylinder groups is appro= ximately 881
File size of JuliusGood.nsf is 1759= 35488 (42953 blocks, blocksize 4096)
 ext logical physical expected length flags
   0       0  2008262               2 merged
   1       2  2008281  2008263      7 merged
   2       9  2008303  2008287      1 merged
   3      = 10  2008307  2008303      2 merged
   4      = 12  2008310  2008308      2 merged
   5      = 14  2008319  2008311      1 merged
   6      = 15  2008321  2008319      4 merged
   7      = 19  2031582  2008324      2 merged
   8      = 21  2033663  2031583     41 merged
   9      = 62  2033706  2033703      1 merged
  10      63 &n= bsp;2033704  2033706      2 merged
  11      65 &n= bsp;2033707  2033705     22 merged
  12      87 &n= bsp;2033736  2033728     23 merged
  13     110  7= 961027  2033758      1 merged
  14     111  7= 961587  7961027      1 merged
  15     112  7= 943051  7961587      2 merged
  16     114  7= 932925  7943052      1 merged
  17     115  7= 939414  7932925      1 merged
  18     116  2= 053842  7939414      2 merged
  19     119  7= 961063  2053843      1 merged
  20     120  7= 961059  7961063      2 merged
  21     122  2= 033759  7961060    160 merged
  22     282  7= 943053  2033918      1 merged
  23     283  7= 961035  7943053      1 merged
  24     284  7= 961030  7961035      1 merged
  25     285  2= 033919  7961030    108 merged
  26     393  7= 961054  2034026      1 merged
  27     394  7= 961039  7961054      1 merged
  28     395  2= 034027  7961039    104 merged
  29     499  2= 034143  2034130      3 merged
  30     502  2= 034159  2034145      8 merged
  31     510  7= 961047  2034166      1 merged
  32     511  7= 961033  7961047      1 merged
  33     512  2= 034167  7961033    494 merged
  34    1006  2= 034666  2034660      1 merged
  35    1007  2= 034670  2034666     29 merged
  36    1036  2= 034701  2034698    478 merged
  37    1514  2= 035182  2035178    510 merged
  38    2024  2= 035697  2035691     24 merged
  39    2048  2= 038674  2035720      1 merged
  40    2049  2= 035721  2038674     11 merged
  41    2060  2= 035733  2035731    385 merged
  42    2445  2= 036120  2036117      2 merged
  43    2447  2= 036128  2036121      1 merged
  44    2448  2= 036136  2036128      1 merged
  45    2449  2= 036518  2036136      1 merged
  46    2450  2= 037030  2036518    634 merged
  47    3084  2= 037665  2037663    117 merged
  48    3201  2= 037784  2037781    886 merged
  49    4087  7= 961058  2038669      1 merged
  50    4088  7= 961049  7961058      1 merged
  51    4089  2= 038670  7961049      4 merged
  52    4093  2= 040616  2038673      1 merged
  53    4094  2= 038675  2040616     14 merged
  54    4108  2= 038690  2038688    291 merged
  55    4399  7= 961036  2038980      1 merged
  56    4400  7= 961050  7961036      1 merged
  57    4401  2= 038981  7961050     10 merged
  58    4411  2= 038993  2038990      9 merged
  59    4431  2= 038991  2039001      2 merged
  60    4433  7= 961064  2038992      9 merged
  61    4453  2= 039002  7961072     10 merged
  62    4463  2= 053899  2039011      1 merged
  63    4464  7= 932921  2053899      1 merged
  64    4465  7= 936120  7932921      1 merged
  65    4466  2= 039012  7936120     18 merged
  66    4484  7= 943055  2039029      1 merged
  67    4485  7= 961056  7943055      1 merged
  68    4486  7= 961041  7961056      1 merged
  69    4487  7= 961045  7961041      2 merged
  70    4489  7= 961053  7961046      1 merged
  71    4490  7= 961031  7961053      1 merged
  72    4491  7961034  7961031      1 merged<= /b>
  73   &nb= sp;4493  7961044  7961034      1 merged
  74    4494  2= 039030  7961044    285 merged
  75    4779  2= 054871  2039314      1 merged
  76    4780  2= 053844  2054871      1 merged
....

Copied corrupted File:
# filefrag /mnt/DEST/JuliusBad.nsf -v
Filesystem type is: ef53
Filesystem cylinder groups is appro= ximately 881
File size of /mnt/DEST/gschouten.nsf is 175935488 (42953 blocks, blocksize 4096)
 ext logical physical expected length flags
   0       0  3146242               6 merged
   1       6  3155036  3146247      6 merged
   2      = 12  3155043  3155041    106 merged
   3     119 &n= bsp;3155149             917 merged
   4    1036 &n= bsp;3156068  3156065   1024 merged
   5    2060 &n= bsp;3157093  3157091   1024 merged
   6    3084 &n= bsp;3158118  3158116   1024 merged
   7    4108 &n= bsp;3159143  3159141    312 merged
   8    4431 &n= bsp;3159455              11 merged
   9    4453 &n= bsp;3159466              38 merged
  10    4493 &nbs= p;3159504             639 merged
  11    5132  3= 160144  3160142    417 merged
  12    5550  3= 160561             441 merged
......


###This is the fragmented,good S= ourceFile:
debugfs 1.41.9 (22-Aug-2009)
debugfs:  stat JuliusGood.nsf<= /font>
Inode: 102   Type: regular &nb= sp;  Mode:  0644   Flags: 0x0
Generation: 1499014015    = ;Version: 0x00000000
User:  1001   Group: &nbs= p;1001   Size: 175935488
File ACL: 0    Directory ACL: 0
Links: 1   Blockcount: 343576<= /font>
Fragment:  Address: 0   &= nbsp;Number: 0    Size: 0
ctime: 0x505e346a -- Sat Sep 22 23:= 58:02 2012
atime: 0x506041bf -- Mon Sep 24 13:= 19:27 2012
mtime: 0x505e346a -- Sat Sep 22 23:= 58:02 2012
Size of extra inode fields: 4
BLOCKS:
(0-1):2008262-2008263, (2-8):200828= 1-2008287, (9):2008303, (10-11):2008307-2008308, (IND):2008309, (12-13):2008310-200831= 1, (14):2008319, (15-18):2008321-2008324, (19-20):2031582
-2031583, (21-61):2033663-2033703, (62):2033706, (63-64):2033704-2033705, (65-86):2033707-2033728, (87-109):20= 33736-2033758, (110):7961027, (111):7961587, (112-113):7943051-79430
52, (114):7932925, (115):7939414, (= 116-117):2053842-2053843, (119):7961063, (120-121):7961059-7961060, (122-281):2033759-2033918, (282):= 7943053, (283):7961035, (284):7961030, (28
5-392):2033919-2034026, (393):79610= 54, (394):7961039, (395-498):2034027-2034130, (499-501):2034143-2034145, (502-5= 09):2034159-2034166, (510):7961047, (511):7961033, (512-1005):20
34167-2034660, (1006):2034666, (100= 7-1035):2034670-2034698, (DIND):2034699, (IND):2034700, (1036-1513):2034701-2035178, (1514-2023):203= 5182-2035691, (2024-2047):2035697-2035720,
(2048):2038674, (2049-2059):2035721= -2035731, (IND):2035732, (2060-2444):2035733-2036117, (2445-2446):2036120-2036121, (2447):2036128, (2448):2036136, (2449):2036518, (2450-3083):
2037030-2037663, (IND):2037664, (30= 84-3200):2037665-2037781, (3201-4086):2037784-2038669, (4087):7961058, (4088):7961049, (4089-4092):20= 38670-2038673, (4093):2040616, (4094-4107)
:2038675-2038688, (IND):2038689, (4= 108-4398):2038690-2038980, (4399):7961036, (4400):7961050, (4401-4410):2038981-2038990, (4411-4419):20= 38993-2039001, (4431-4432):2038991-203899
2, (4433-4441):7961064-7961072, (44= 53-4462):2039002-2039011, (4463):2053899, (4464):7932921, (4465):7936120, (4466-4483):2039012-2039029, (4484):7943055, (4485):7961056, (4486):7
961041, (4487-4488):7961045-7961046, (4489):7961053, (4490):7961031, (4491):7961034, (4493):7961044, (4494-4778)= :2039030-2039314, (4779):2054871, (4780):2053844, (4781-4800):2039


###Here comes the corrupted File= :
debugfs 1.41.9 (22-Aug-2009)
debugfs:  stat JuliusBad.nsf
Inode: 114   Type: regular &nb= sp;  Mode:  0644   Flags: 0x0
Generation: 3620008692    = ;Version: 0x00000000
User:     0   Group:     0   Size: 175935488
File ACL: 0    Directory ACL: 0
Links: 1   Blockcount: 343568<= /font>
Fragment:  Address: 0   &= nbsp;Number: 0    Size: 0
ctime: 0x507831f2 -- Fri Oct 12 17:= 06:26 2012
atime: 0x507831f0 -- Fri Oct 12 17:= 06:24 2012
mtime: 0x507831f2 -- Fri Oct 12 17:= 06:26 2012
Size of extra inode fields: 4
BLOCKS:
(0-5):3146242-3146247, (6-11):31550= 36-3155041, (IND):3155042, (12-117):3155043-3155148, (119-1035):3155149-3156065, (DIND)= :3156066, (IND):3156067, (1036-2059):3156068-3157091, (IND):315709
2, (2060-3083):3157093-3158116, (IN= D):3158117, (3084-4107):3158118-3159141, (IND):3159142, (4108-4419):3159143-3159454, (4431-4441):3159455-3159465, (4453-4490):3159466-3159503, (4493-5131=
):3159504-3160142,


I am 95% sure that in previous T= ests if have also seen a corrupted file with several 100k filled with ZERO.<= /font>


Surely it would be most simple to r= eproduce the error if I could provide the whole partition as is.
But since the Files are Database fi= les I can not provide it. Are there any tests that I can do?

Best regards and thanks in advance for your help,
Mike


Mit freundlichen Gr=FC=DFen
Mike Gerth

Dipl. Inf. Mike Gerth
+49 30 399 76 136
IT-Systemadministrator
AVM Audiovisuelles Marketing und Computersysteme GmbH
Alt-Moabit 95, 10559 Berlin
HRB 23075 AG Charlottenburg
Gesch=E4ftsf=FChrer: Johannes Nill


--=_alternative 0052F103C1257A98_=-- From debbugs-submit-bounces@debbugs.gnu.org Mon Oct 15 13:52:47 2012 Received: (at 12656) by debbugs.gnu.org; 15 Oct 2012 17:52:47 +0000 Received: from localhost ([127.0.0.1]:45561 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TNoqN-00051e-0q for submit@debbugs.gnu.org; Mon, 15 Oct 2012 13:52:47 -0400 Received: from mx.meyering.net ([88.168.87.75]:39795) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TNoqL-00051X-5f for 12656@debbugs.gnu.org; Mon, 15 Oct 2012 13:52:46 -0400 Received: from rho.meyering.net (rho.meyering.net [127.0.0.1]) by rho.meyering.net (Acme Bit-Twister) with ESMTP id D8318600FE; Mon, 15 Oct 2012 19:51:35 +0200 (CEST) From: Jim Meyering To: "Mike Gerth" Subject: Re: bug#12656: cp since 8.11 corrupts files In-Reply-To: (Mike Gerth's message of "Mon, 15 Oct 2012 17:05:56 +0200") References: Date: Mon, 15 Oct 2012 19:51:35 +0200 Message-ID: <87fw5f1v4o.fsf@rho.meyering.net> Lines: 43 MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: 0.4 (/) X-Debbugs-Envelope-To: 12656 Cc: 12656@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: 0.4 (/) Mike Gerth wrote: > I noticed an error in cp (8.11 upwards till 8.19) when copying many files > from an fragmented ext3fs (to an empty partition). > > ERROR: > The copied file has exact length. > The SourceFile has in the middle a 4K-block filled with ZERO, the > DestFile this 4k-block and the previous 4k-block also filled with ZERO. > > > I can reproduce this: > Conditions: > *I have a strong fragmented 110GB ext3-partition with >300 > Files > *I have to copy about 100 files (ca. 15GB) to another > HDD-Partition or ramdisk > *cp must be 8.11 or higher (compiled under SLES11SP2 > kernel 3.0) (everything is ok with 6.11. 8.05..8.10) > *Command: > cp819 $FILES $DEST #here the corruption comes > *$FILES is a list of about 100 DatabaseFiles. The > last one is the file that becomes corrupted Thanks a lot for the detailed report. ... > But since the Files are Database files I can not provide it. Are there any > tests that I can do? Can you run this command, and then send us the part of the LOG file that reads and writes the file that is corrupted, i.e., only the presumably small fraction at the end: strace -s8 -oLOG cp819 $FILES $DEST The interesting-to-us part will start with "open" syscalls that operate on the src and dest corrupted files. However, note that the read syscalls will expose a few bytes (8 per block read -- per the -s8 option above) of the contents of your final file. If you're not comfortable with that, let us know and we'll try to come up with something else. If LOG is larger than say 40KB, please compress and attach e.g., LOG.xz. From debbugs-submit-bounces@debbugs.gnu.org Mon Oct 15 18:02:19 2012 Received: (at 12656) by debbugs.gnu.org; 15 Oct 2012 22:02:19 +0000 Received: from localhost ([127.0.0.1]:45812 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TNsjp-00042s-Tc for submit@debbugs.gnu.org; Mon, 15 Oct 2012 18:02:18 -0400 Received: from mail.avm.de ([212.42.244.120]:48526) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TNsjm-00042e-E8 for 12656@debbugs.gnu.org; Mon, 15 Oct 2012 18:02:16 -0400 Received: from mail-notes.avm.de (mail-notes.avm.de [172.16.0.1]) by mail.avm.de (8.13.8/8.13.8/SuSE Linux 0.8) with ESMTP id q9FM0tcE007935; Tue, 16 Oct 2012 00:00:58 +0200 In-Reply-To: <87fw5f1v4o.fsf@rho.meyering.net> References: <87fw5f1v4o.fsf@rho.meyering.net> To: Jim Meyering MIME-Version: 1.0 Subject: Re[2]: bug#12656: cp since 8.11 corrupts files X-KeepSent: 7B508E62:348F16B6-C1257A98:00780B4D; type=4; name=$KeepSent X-Mailer: Lotus Notes Release 8.5 December 05, 2008 Message-ID: From: m.gerth@avm.de Date: Tue, 16 Oct 2012 00:00:54 +0200 X-MIMETrack: Serialize by Router on ANIS1/AVM(Release 8.5.3FP1|March 07, 2012) at 16.10.2012 00:00:57 Content-Type: multipart/mixed; boundary="=_mixed 0078F3F7C1257A98_=" X-AntiVirus: checked by AntiVir MailGate (version: 2.1.2-11; AVE: 7.9.10.68; VDF: 7.11.46.60; host: mail.avm.de) X-Spam-Score: 1.8 (+) X-Spam-Report: Spam detection software, running on the system "debbugs.gnu.org", has identified this incoming email as possible spam. The original message has been attached to this so you can view it (if it isn't spam) or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: Hi Jim, please find attached the output (compressed) of strace -s8 -oLOG cp819 $FILES $DEST about 2700 writes a 64kB. [...] Content analysis details: (1.8 points, 10.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- -0.4 RP_MATCHES_RCVD Envelope sender domain matches handover relay domain 1.4 OBFU_TEXT_ATTACH BODY: Text attachment with non-text MIME type 0.0 HTML_MESSAGE BODY: HTML included in message 0.8 BAYES_50 BODY: Bayes spam probability is 40 to 60% [score: 0.5000] X-Debbugs-Envelope-To: 12656 Cc: 12656@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: 1.8 (+) X-Spam-Report: Spam detection software, running on the system "debbugs.gnu.org", has identified this incoming email as possible spam. The original message has been attached to this so you can view it (if it isn't spam) or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: Hi Jim, please find attached the output (compressed) of strace -s8 -oLOG cp819 $FILES $DEST about 2700 writes a 64kB. [...] Content analysis details: (1.8 points, 10.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- -0.4 RP_MATCHES_RCVD Envelope sender domain matches handover relay domain 1.4 OBFU_TEXT_ATTACH BODY: Text attachment with non-text MIME type 0.0 HTML_MESSAGE BODY: HTML included in message 0.8 BAYES_50 BODY: Bayes spam probability is 40 to 60% [score: 0.5000] --=_mixed 0078F3F7C1257A98_= Content-Type: multipart/alternative; boundary="=_alternative 0078F3F7C1257A98_=" --=_alternative 0078F3F7C1257A98_= Content-Type: text/plain; charset="ISO-8859-1" Content-Transfer-Encoding: quoted-printable Hi Jim, please find attached the output (compressed) of strace -s8 -oLOG cp819 $FILES $DEST about 2700 writes a 64kB. Thanks, Mike Mit freundlichen Gr=FC=DFen Mike Gerth Dipl. Inf. Mike Gerth +49 30 399 76 136 IT-Systemadministrator AVM Audiovisuelles Marketing und Computersysteme GmbH=20 Alt-Moabit 95, 10559 Berlin HRB 23075 AG Charlottenburg Gesch=E4ftsf=FChrer: Johannes Nill =20 Von: Jim Meyering An: "Mike Gerth" Kopie: 12656@debbugs.gnu.org Datum: 15.10.2012 19:51 Betreff: Re: bug#12656: cp since 8.11 corrupts files Mike Gerth wrote: > I noticed an error in cp (8.11 upwards till 8.19) when copying many=20 files > from an fragmented ext3fs (to an empty partition). > > ERROR: > The copied file has exact length. > The SourceFile has in the middle a 4K-block filled with ZERO,=20 the > DestFile this 4k-block and the previous 4k-block also filled with ZERO. > > > I can reproduce this: > Conditions: > *I have a strong fragmented 110GB ext3-partition with=20 >300 > Files > *I have to copy about 100 files (ca. 15GB) to another > HDD-Partition or ramdisk > *cp must be 8.11 or higher (compiled under SLES11SP2 > kernel 3.0) (everything is ok with 6.11. 8.05..8.10) > *Command: > cp819 $FILES $DEST #here the corruption comes > *$FILES is a list of about 100 DatabaseFiles.=20 The > last one is the file that becomes corrupted Thanks a lot for the detailed report. ... > But since the Files are Database files I can not provide it. Are there=20 any > tests that I can do? Can you run this command, and then send us the part of the LOG file that reads and writes the file that is corrupted, i.e., only the presumably small fraction at the end: strace -s8 -oLOG cp819 $FILES $DEST The interesting-to-us part will start with "open" syscalls that operate on the src and dest corrupted files. However, note that the read syscalls will expose a few bytes (8 per block read -- per the -s8 option above) of the contents of your final file. If you're not comfortable with that, let us know and we'll try to come up with something else. If LOG is larger than say 40KB, please compress and attach e.g., LOG.xz. --=_alternative 0078F3F7C1257A98_= Content-Type: text/html; charset="ISO-8859-1" Content-Transfer-Encoding: quoted-printable Hi Jim,

please find attached the output (co= mpressed) of
        = strace -s8 -oLOG cp819 $FILES $DEST

about 2700 writes a 64kB.

Thanks,
Mike




Mit freundlichen Gr=FC=DFen
Mike Gerth

Dipl. Inf. Mike Gerth
+49 30 399 76 136
IT-Systemadministrator
AVM Audiovisuelles Marketing und Computersysteme GmbH
Alt-Moabit 95, 10559 Berlin
HRB 23075 AG Charlottenburg
Gesch=E4ftsf=FChrer: Johannes Nill






Von:     &= nbsp;  Jim Meyering <jim@meyeri= ng.net>
An:     &n= bsp;  "Mike Gerth" <m.gerth@avm.de>
Kopie:    =    12656@debbugs.gnu.org
Datum:    =    15.10.2012 19:51
Betreff:   &nbs= p;    Re: bug#12656: cp since 8.11 corrupts files




Mike Gerth wrote:
> I noticed an error in cp (8.11 upwards till 8.19) when copying many files
> from an fragmented ext3fs (to an empty partition).
>
> ERROR:
>         The copied file has exact length.
>         The SourceFile has in the middle a 4K-block filled with ZERO, the
> DestFile this 4k-block and the previous 4k-block also filled with ZERO.
>
>
> I can reproduce this:
>         Conditions:
>                 *I have a strong fragmented 110GB ext3-partition with >300
> Files
>                 *I have to copy about 100 files (ca. 15GB) to another
> HDD-Partition or ramdisk
>                 *cp must be 8.11 or higher (compiled under SLES11SP2
> kernel 3.0) (everything is ok with 6.11. 8.05..8.10)
>                 *Command:
>                         cp819    $FILES $DEST #here the corruption comes
>                         *$FILES is a list of about 100 DatabaseFiles. The
> last one is the file that becomes corrupted

Thanks a lot for the detailed report.
...
> But since the Files are Database files I can not provide it. Are there any
> tests that I can do?

Can you run this command, and then send us the part of the LOG file
that reads and writes the file that is corrupted, i.e., only the
presumably small fraction at the end:

   strace -s8 -oLOG cp819 $FILES $DEST

The interesting-to-us part will start with "open" syscalls that operate on the src and dest corrupted files.

However, note that the read syscalls will expose a few bytes (8 per
block read -- per the -s8 option above) of the contents of your
final file.  If you're not comfortable with that, let us know
and we'll try to come up with something else.

If LOG is larger than say 40KB, please compress and attach e.g., LOG.xz.

--=_alternative 0078F3F7C1257A98_=-- --=_mixed 0078F3F7C1257A98_= Content-Type: application/octet-stream; name="LOG.txt.bz2" Content-Disposition: attachment; filename="LOG.txt.bz2" Content-Transfer-Encoding: base64 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 ZqEifrFEkKTm/b7fd+w93wefNshBbbCJHh+5+WmcKL4SYMMAww/1RdjX008qJUpNDnucu1Jv6SXQ q5yaz/WT/H4PQxZNLrsnUQo6arzNrSyPaaVHYjdLg/b3eDmpSc7VvhytKza87+Gx63Aqm+9wKDB6 WlJZJyJMm53FX+MOBtb7FJub2lFEmttQ57F03sOXKOhstKkp6jwtbusP5a1lG1MkbW0YJk1Ggh03 aUWeZ+r+mlm2oaG15mTWoow+5N01G5rQYHdfmomZLoiIiIiCAAAAACQAJAAkI00BCBJACQACQCQA AgEkAJCSQCQhJAEgAAAD8m66WloCEG02gAAAANqbUEyAASABKysIBJIAEgAEgBCAAMxIEgkAAAAE gAAEgASEkgQgAAAABIBIAykJAAAJASJAAAACQkhJJAkJCQAAAAAJCQAAgQCQkJJAJACQAzAACQW0 tohAkAkAAAkkAISEkAJAACSQJAAJJAASAJCQAJCQJJAJAAAAkACQAAlMAAAEgAAEgEkgAEgQkFVK qJmSmKUEgiYABCEJIAEkgBIAAABIEgAAABIASSFabUSJEkAJABIMwIJkAkhEwkAAAACQAAAAAAAA AAAAZgAkJJJAJJAIUwAAAJBIAAAASAAAAADbNsACQAkASBIAAAJEgUoAAAAAAAAACQAAAAAAASAA CQApQArStASAAQgBIAJBIASAAEkgBIAAAAAAASSAASAAAEgssAAAAEgAAAAAAAAAAEgkNqbUAAEg AQgAmQAAACQJAAAAAAkACQAAAACQAkAAAAAIAEgAAQAAAilBIQkAACQASJAAAAABWlaAAAAkAkEg JAAAABSgCRmVSqCQAAJEgAkkIQBIAAkCQJAAAAAAJAAABrNYAAACEAAAAAGYAACEAAAAAAJBpZBt qbagSBIkAABIFpaCSSSEkhAAAAEgkAJAAACQAEgAAAAAJAAACQkAEgAAAACQCQAAAAAAABalqAAA AAAAAAACQAAJACEACQAACQFlgACQhBpokkAJJAhJJCQhJkBIAEkyACASQIQAAJCAQAIQCEAAAAAI SQAIQCQhCQACEhAAAAAAAkAAEgAAACQAAAAkkAACQAAACEAAAAhCQACQCQAkAJAAJAAAAJACQAJE gAACQAEiQAAAgQAAAAkASAAAAAAAAAJCECSQABVKoAAAAAAACQEkyBIAAAAABIAQhCABIAkAkABI ASSAQgABIAAAAB83xvfnH1flR73SPNtq2238Ta3E2yJJIRzlF2KqGRNqUep97npsMWiN/6+GXd+B Sk7O4/Nkm3PlSbzS3IM00nhQUVe831FF39PSq6SjS6j7TQohsYXw1xhgwj5lFVGp7azpoe0w4XU5 vl6URKfs9zj1ZxKk6a3qbW1rMO+kXWTwzUWdRoanA6rO0Rmhi30O+h+yTU8q7SyXQ57+VGpVV7bM qo+dtfGhgm6b3V2tzk3I+ddhZ/GUq3Eez+T931mtZrT6fh+TJ+Ny9avR1QopT+dUEIj2ECI/Ion0 RX1Oo/PfBsanRcz5WprUQ5WHZNRRmaV03VMXvtbFvumuyZJvlbW0xVf47znPafYkfihyMGtm1NDF 0EnSP5hVNR2W9g+3ZEZ97ze/x8+tZ1pX9n3qug5z+HC95yYKNjsHG+s7RxpdJzOFvqsMGabzpv7V fs6D31S74UmSqT1tiiyh3U3hdJRwkYPwctmfxMyn6zPik+3Ifi2ls38kI5bUT5VD4qkkOKR9573R nB9hZPo5nXjzlV+vKV+vq5NRzncpuc7dSPz/x9/taavWtUNyjVJ7rJB61NbUcqRrNZEcsRrMlVJQ em93VffKFyj7SqXCS/1MxJEZH3suXcj0z77z2s1FySfO3hL3hk5y67H07aQ/yZe+5nzixqRHpfy6 MjJrt5HJVxkrt2mLVyTXc1KyNcuuyu6uuStd3mXLalZHYNNXkLnyEmpqSXMtdNQzd9jcblszm9te uuTnbSPR2Sems3lJKT6/MyElxcqvXY+RqaRWvXUi0mrLlDSyBRhAWlO0aQTpgknqmnRTKuN02TOS snLqmoJBaJFfJVxy7qey8ci0+srUyIUjnyryVLlid9l8t81vM+W7KYlOFMs5xeRm7pc5JnMClxJI uLk0zKbmcvLlvJI4nPc+u72+Snz5cztFKqpElGS66GSya6Sq6aii6GE12KbmYPoX+zfXWYskizNm TWTPz26IUa2SxNiZJlGtJVm0IcKbDDUqxwyiP7SkjAJmIU2JLL1Lr2tvnvkq37dv3WHo9xj8avKv kV7OMqimZnsXkkpUpKWSyyUkpVZLLJZJJKSllSSyRSpKpVK/gKwqlOJWWfKtyoiVJIiSpUkjGNqs 0tpxbRq9SSUlpag2QZKWSwpVUpVPRU96nFKqklKKSSSSlerrpKlNnObu61bVW5jKUrt/Gik6cKyZ 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 1Fl0kIKOOMyp5dvDtV8+LrkkRFqAapEkQtkgNYkgWyIiHl07YcAoEUBosUIJ5gKEoAtc2sMqK0a2 dWuNl4VeZsR1WWQRU1sWNJh2IOllLU42TYKqUliF1Or1Swz81uZq6kV6E2FQuPRymrSS0NHI8Ixp XWZFJVmzlY0Xsd5pBbe4ssYUabvLsx9ddK8kGYmDBS0HMoYqShrpQZOrq6rW40uR9Uqrj4lvFz3P e66jXZOmm1tOrItCji6CoLZCC2ESPJUSBJ2x08u2NuJjG0NLacYj6lvNOp5K7Opbhdde0t5LZL2u rpJSSSSpKUskkkspKlZSzpQY7RhnFk1sq82urFFJaUkpZLJLSSS0r2uT9RwypKqqcUypVeqpiqqU pJGYwBCEpSkupdZZLLakllZdL2lvJEpVFVIUVVFOlSYVKiSVJK2iEkyUlSkKeimKVSpVUFU/TVML ZklJLSklakpSUqslZLSW+2uukjGNC37nl5Xlvmt10skpKQLSWkpJJS0pSlpKSVktLJJSUuldVSyS ZGDGiKqrYtkpUh7jPvEiSQiuKtlJLJJayyypZKSyWS3q66vlrrpKkqkkmSCMjJXlZdJZZWSSSSlS lpJKVJJJSySpJZSSSSWUpSlKliKg2V8tdbqWUkpKS95brbJZaVfQuulJJJZZZFUlVPcyZKkKzM4i pnh27Wa0P0TZGJRNDEuhRVNVNiqksWaaYjiqMbeNMbaQ5klbadY044uQsk7C6qai6a6iiFFF1k01 SaST20iy7CjJDQxYYJMkl2SEyiS66EzLi5XnMk242x0tVFsRxj8rTyEYbXVZJxGI4/xtenJJVRFL tVtrVFRbb46448jEdaOFuOLcNNLJIWVWLJJKKrISTJJLqpFUlnlwx5eGZ2nlnSvLKklZ4ezy6ZJR VQmVWUVQSXUVGCxRNishNptjTTzzzjrbjbEW1aRjC3ni2NosxhaNo60txFv0LfGOvPJpF1UkliFZ osmmmJPSuuzWJsWLFZViquTSfGSXaFy90QxKpmTUUONLNvIjH0W0xVrbVS1Y8e6mnxHVrdbcbaY2 2v0SdeadaW2q3XOSYaRbZppWNLWx11iNPNtk00LPKoyTXYsWLJmkmoqkkqsTZkJJMmSxditaIoom qgwwmkyVBddJZCqSbFkoohiVTZCFmS7CrEqxWxFvLR1xrydVpb46X1KtxG0SWIQkoxUE1CjFQmgo suuos/dCpiWWXQhdDFZZdNaURdZJJZkumhyMlmKjJZkyTMMKKqJu2o/JddNIxYrmKGpNJVpVTWQX Kk0kyiaFDGMVa2F/WTq22LYtjqU5JDT4uhckuxXYqpMT9kllGTJjOIxYrE107u7uurccaddfB40s jaMLaWkUUJqKoVSTXSSUSdRVVRoXXJsVeyszOK8uM9TwnhTsdPDjjO3Hn0Wt5F8TzqNLfcjGPLbd LVt8ferrWpUj4xVtlWfxVnx5tGJv66ZPhhqBE9EcPgSZhpd+PSIdHu+6AuBbElgudUFjR4aWNhKj AqU3Lu43tSaVTIZ1s67ig3btZkiKb3adGqynW47p29joQqbsuomzd1tU91PMObN11WAkaVjIuxQg OAW8FHJQjvXxSbzRnOYBhvdlEIiqu9e5TTuqDwYR1EmKmp66qUmqWoBgRNVZZNRRNCqjWuwyWWXY sU1VWRIyuOPDOnq9HhKd0otLYqVRUkkpSlJUsqyyllK0qUpZSySUpZaUlkpKlJM2SN5dXV9O66kt JJhklKWSpJKSklklSSUlLKS1epdfF1upZZLIREZSyWrLSyXS6SSSUkkpKUlK9pXWWSypbUpSlYiY UkQwKZZLKSlkt72MSlSlKKqilVSqkKqVJVVVRV9NrqxXhmV5OjXkqUklBpZSSslZKVUpUpVUpSko r62bu1tqg3I3LltOplXql1JfaXVlRUoqlFVVVRSqeysUsstLSSyUt8sl29m8bG1ThU4pXqVkfWzK pSlVS3xK6SUlpepdJJSykpJSypt7jFckrmwgc0y3bWWwt2qsYrhnuK6Ok9VkCaxaqlUiVQUp0oYr pkxVZlUorFFKZSpmZGZmVUyiRVGVWeysxFREfRxpGLW0j6NLdbY0200sksshpQ1OoowxVXZMUmKi ijQomssmsmkvnESLoKJrqpLqrpqlVlFXmiOK4rHmmjHXjatLabYtbTakkjp6aW26lqazKr0HD9N2 Z0rXyS2V6XuTPq8aVEbWpSEFtsPmkhtGkU2iq6xjzyK1NyXERjFNiokuuhZJdmossqshJimxTSVY EpEUXVLMV2LFZ+zEumxWQumXPa1kvM2i3x11htDiraNuMcRttJNNhguqgsqXQhBVJRdJZhUmo7Cy 7FJJCSiy6ia6xNNUqqxXTQyUVJqvUumooqUXUUTQkmmqqmmtba3nFvOPjHomOuHFrR5biOM9HTPD jj0V2rOMdqzMQ8K+6xVPiWSYXZroWUMSyElFVU1VkiFmSSzNiqxXVIXTVWXWTYqrKMV2OsbY5Ukp xWnWOttuH3rY6t1deiLIQuyWVWTXQohZCabJVdixXFFUlVGJiksmkhVdiSMSrC5BddkySZLJsUlF GKF0MVmSaCGKy6FVlntKsVmSyaya5VCiGKTJZVRC6Sq7FiouuxYJrsU1VWKpixKJpSi5w8sp5Z5d sZxl6XyVxx2kZVZcuqwhZVdImmhOiLLIIXYTTXUUSWQomFEDAkomxWQowuxYprLlklWKiy7FRVNC TFYqmJLsLwYRAVQmqmxVIXWVUKrpJKrsVEKPQYXYtCzFmkqmhczSZzRgokh86FibnKpKJINK6SyD QkqWZKk1E1U01iSiSS6yya6ayaqSyFVUkIYpqauX1XUcI666tjFt6k/T3JmJH4/tOxL/iXrmSrz6 re9ckfGU42+OKw64XQSbHMmcBhD7ljJkYf28TJ/DFqal0lVnQew8S6zSk33AybyyTQu2NShJdVws 3yMEndczW0s0nmTTdhqaX7S/mPwicSn7/v24NilKUzcDu0YuNVkaHCfQuZJsNhd6HyppofNjEd5o Ud9Z8TNI9C6bjfE2JNijgYuid9QohvnI3KPtfIyZoUdxJJk0HWaE0KtTSoQcQ6RxgxcE44Ag4wQi PNxl7B5N4iUlwmZ2it2etTVV3n3qN9uSYtbU4X4ptBk+Fd0nVZMNR1lWG1zKNaDieB9ibY2LLqE0 Id9JJhD4VibJR+LhaWt7rDQ9xim+V5GaS67Jl9sVmifOa12tdNyui8TN5ULui4n2vMoyaXM7iG8f wooso4Gbco9lJVz0PvPA/h8zrt93WpudJJxP+z6lXVYug2OB3H96YR07zlL2nJy7oiW5C6z6lHlZ KvSoTMkGpCHxpnPVVbkmxvuq6TmaWT52LUhh+bjOkoohk2MW4qhtbCRz1STtOnbjW2W2x4cf0/1H /5eP60Ll1f/T+lMUr6jV9W+p1/q+qI2+q10N9V48YkvR3b4blGtfM5UkY1cuGsky7qS5SXVL7dwq ErI5lkla3mUSXi5QRo28a7ztc2uelrxiktub03pr0vHDbljcKLRXx7Wdiq1B271diZarirk5mVWp VxcVcclXEjkWg7FyjsXd3KJEknbuNjYrGosV3rteedXwvGsa925o1V42vfzi+G1428G3v3bXj4eN ijaNowPXVzm117duZ6ca3ir0vZW+FXs2TenKiwO6NpKdjJXIqrlSSGo5FZ21LhuVe8xkVJcyaiq1 FLjsrcaiuS5XbuqkLly0WxvdXpt8LbepvF7LxsbCVFQFeOa5zbFt6bXp567R7qrc3DcorJVXAuKr sUY5dLk1a5JW4Ekhrl3Brdt5ZuVWRVZFVJl2Xu1zN3uYkmSlylxerS7ZDIbg029d0WijQSYSNPXX K3iti5nv1c2+Gte7Xj2Yqi3KulK5HZmrpIpIqmSq1GXY5lypUib7WLu7e7xEmNGowkmNu66t8K9l 6Vb02IrFgxvdbmqSpKtFytRfbLlVl3VTLvd2hJJW7vW5vhXjVGt7K3Q7263kjWNerGpto7Wco1OU qy2TbC2IqvT167b0ovFc2xrG9NyTu7a8ctezZ3b2enijTuu9dcSjbxcjVjcqsiQkqt3clb1dJl1V SVWpe7Y3nx24Yt7tXN8NXp5DRjSVclypElSVy7p2DIyVyL7dVkZCnJVygsW5W5kr3ct7tV829c68 e0Zu1N1q1ort5FO5dMjkNxXpRcqi3srpXK8eTZfB3ay2nO7rxeVR2K5729TsWqvIS7nI1MItdKtu rFpWRWSkx7Dmta3m9ym6u6pcqMskWqNSuLi63bemqrN3VbtJLSUlr3d0TUPZVTXdamd7qq1KqSS4 q5q2M5N6vcq4pURy7rJW4cyyStR6WhKkRqLS4aiuRqCJEoqE3Gvaxy7VqUtEQzvvRqRXrumQ37Mr 0KJKaqUo1K7Nybt2K5Kqm9WUuFyqq5VYlFpFqSLS66LWpDbBNYSc5ojlJHNpLYk1STqoiagnROsW y0t4ckxGqSDiokS2VRNtG3NrY1c1W5qq5W5U1d1xy6GpyrUlsnOaJPKpdndjquzuG5VVJTsVcK9G 71lnrpzGQ3KNc9eVuby5cq9zUyVFQaWtcuVUqSUu6yV7S1RJ6XUio1KzKWiVJyy6blyOW5KvLrjW YklEuahzXspZBuHpkZORiRu17haSBKSdurpxPTDtq9N93XdK7HZWiJErU7lX27kv1nEscqZbZ3dX pQ/q+p8/6/1fw3nOftfm/g23iH3EkhyIXSYQh0EOZzPE77uumywfwkksxVO67izuqNbtNTF6XwO2 o77eaEH+uJoZqpORN5/JESaXRcSb7X2ORpYaEHPdFH4RqlhH/T9XttLD4V0v6iMIe26yWHZiI0Sl KVWlRm67Wqo33Izc5RuQ3nVWQ6LS6izpOV/3bH8KNDNdJM1LFU0KuNDchNBqazsJnyuj63zPnalm pZ+j/44VFVELNz5FWtuaDa3MnRfG/txNjQ0EPkdZVkzcCSaEyST/0hiohnLA7EJSkNaDTHblEnAx SfgySc5+zpJv5Q7iGGhDW2nOfY0PCs9pBsIbUMSbkSTfUmq//mpyveZMX/ZVi//yqpR0WZpTVTSS VZvGgm2ml4GS5DYvqjk7utKVPs7cR/4xRmqzeRk2O0g9lvpOi4X/5DqSVPudhyPwhtdxwP+lGph1 lngTJv1cLpqNb+Fn8smaazYySfsyTf+Enqc93nsrKszJvoNDFJkg7Sz/20KOF73X+WUS/z3o6fEn KTW3HqQkh/buOFZ7JUWaGTeUHE3PeTXVeBVdZY8CHtKsUJIaUIUQ7zamUQaHMksgoQmhJDaqkfug eddJ/9f/yz8mRVZD/u4EnmdxIsmkxYa30eKPafNnKUpUreOLlyoShOcvW2MyHE1tDQk/9pv/ul5m Kz/y/+Jvxbip7yjU7LgfWyaH/p6GbyDBsaE3IhyKJKu0+JzlC74X/18TJ2VnRaWhvuk76xR8i3/f m6uU6RSKUo2v/uv6Zyic+FpWIddZ3jsu81LqPlwew8LNCp9jkSHRXf+ruF1/wfM0sizJJsSeYhQ4 DyuBNqbybJd1kJHQfEhzNi7NvLv/1m1rP/LUszUQ6zxIedtdR9zIqhzm1z10mY2x3DUFwd3EMXXc BH3C/L5VmENExjEMIpHEJwgL0EVQxUZnM4GzebsBiopg57Q97AQ57tPRvNjRm2PUx+PBUNXv6XQY ZNrjaU34JPwcyjD0MUm1RDkcTFJZ7zee+4WRmozXfs2pMnC+r7YjQ4PejVoiUr0pNE6dR2nods3N DlYvzZKuu5/nb6j1IcmD4m8mQ3lmlRzNLmTeJBi9D22b3mTJsc5Vk5lWtqdJVqVZuNQu3938cSJT y16ZZwnKU4w+FpTaHPfq99rcTwONpYqELvzcTmfu1Jtq58aTU8b810l1HTa3tuJwml2z5kjUh0W5 4000Ia8HK+FofPvNmmm6EpyorXU0M35OFpZrtyD33Pbx3GhN+izkfS3NBzIb6SCzJqd4+pzl3pWT Ys003/x+arNuWddBhg7Gno9OcTnz9LVLelNLFR3mt/8ZLOJ1mLFB8v0voVwbypyv26Hnd58TuYc4 xYuFDoP+nQTVcD913Oe242L5XRZmTFV4HFzkZPwVWepwN9iLui+R30GtwPz64k3Ktba+ls+R2/fn ZOfyus3nwum1od1vKvcSbm8oScbWZE2h23QcrF7znvnZOBoB5FVGxk6brLvM7CSbfb75W1Jk0Ous mosrCPWasOpEQqs0JvcQ5EMVmpqQ8iFlWSa7JQohViosQhypLLPCuo5sBJ8LoPE1tJD62hwFJRHt bHd+U/Z7Leb7NDWm/l0mhD5GLvvIycrJ4HQSdZxHccJwqtrnPtVVTVdpJyqqMPgek/g5X/T1vKu/ JDkZtHT58vticpT5V3acLyO0q6qH8u+fc0OszcrW5HRbGhJ8KTJ2T82wwwd9R2n+Lsm5xN5vtzQ6 L4XwPbcrnv6eVMb7U7XqjjcXTRTPh9uUpYvweZRwHvGb90Okcqz6ncUbkP0dN0nK7T60YeRvtLch D2knI0pKuZVQ5k1SxpUYtijffw767cu1NLrNjQ0Oq76zxuwq7refysYuwwu6TY3LHjdbOIw2cfFw TylSVPvYYYcChkq3mhxOX6fR9+x7bQ6T32bzO+4W+4Src8rvqONRwOB62KqHKh4HPSXcr0P6el9D oruQwNEeV6waZpA896kaMBgw8ZOwe8YRfG4QufIaI6KhIUD3ikdRRtdF/LzpvxdBvrtz63Auk6yq 6Gphgq6jtpG4qswkq6jsvfe231zF9zfc9o6cIizfcib0N8kqq5+hVsIb6a67gTYqJtia731lVjhV KOFDF9brIZpOco8r+F3iw65Hj2NyEvBrXdNhDU0pOJ+GTS+D48HJCj97uR973m+0kkKPlPecqj9k OBDnuQqmmxQofImoq33Cm5nkaW5Q8PgiOp2dKWeyez2JYUnO1elmkhZJ5ntvtb2A6eA6j09JtdRo aGlwfojBqTfsqSYuc9hNRhg/pV9LjSQf9Om6qbmaELJ/0jNLB+zkby67Whkus6z5XsKviaVtUcaW lxh7mD72xCrTsfG+dYo5mh1FEmk2sn3KqpqORRN8jedNkowkhN8KxwGh7jF43K+J2XG3M3x9x8He iPv8aIav74bcOUcMSilbWtoVfxJ9r7nwePaZvifw8jpM3C1Oy2MkFT21lFHwoYrMX8pPO33uM3Gq +A9CHxs3ZeFvLsWxsdjoxGFOnEWSanfSd1k/J47sjQ5GTb8kRk+9tZPEskTSOJJk5H4qrIVbnpmU caHurNjvuZ8CybkelpYWeH4P7j+oSnPt/p/fUk/Ldx/FlXNfpWmLpW73x+2+j488x+o/Q+z9j1Vf yh6HUaE2xscbiby6aSba4ShVNJuUJrM3xrqIKrLvlcqjE42podA6rhSCIFY7gQUXgYiNsaQykPLm 6jI1zVeYzy2YcJKFRrJrCxmdybQ+RucSjgdd8zNybYjcmudB1Ek3PfMMHxKO8hRwMUNDQTUPK41F ij077JwtjH2WPr6FNEqUnvOPwNj2G+1vEfSw/JdwPlWaU0MMDiNjnO44E1F2HsMXuJrNrfcDFuQ4 Om5HzcMRhxW1+aJzlONzS2JPmbFH6MnTfK5njdJymlk2vvciTzqLvwcCR0X9JKpu4k7qzS1ON1HP ZJtLxLu0+BrajnKoSSUScTJZV7jYS+BJLidFscxJVofQ4nYHss3rXaE2bNI6bY+p/S7eWVfu7DS6 CrxsU03Vfqzw70Ru40fk4WsZN96nC+JoON4X9pOVkxQ+d+L9T7GlUm33tsmtz2x5nrczytB5F0mT lQ7DgSTVe40uR0n4qs1GKTag7BvuedJoVZNgM0IgwiGCR2oyhD5lKqJifu9vXnv+x1zn3N+SdJq+ 13HvXmrS/6fZNaj5M9acfMl1kV9JTUqlPtOSlOfluvmXR/blymffLpRkqSiSqyZCuSvRXoNT5dqP kp8inJW4v5e/7mqz9qfOWkppJ9btD12k9fpm/ZxKZ9Lr2uZyOZZI/GXUn7cX27n+eX9r+Ykfs5z5 bSfqff+TW5ufmtfbquwypE/Wn9Sd+17f4buVPzX/bzmX+xLkSS4/VyrT8t03GEn+aP5GW/dn0xb8 n43+5NNXV/SS/pJmZcOWWz7Yfm1dSVPy3cSPzyr/JLRJ90p5AOjBrCpWUXG8NJgIU344W1udMHKb znSa9WbSDiVk3l3P0o/NKfafj++v6zvrn6d16fpb3+b8dvKkVVGqWDljC8Lyry8tWFNzF8Dcq+Ji h+DtvOxbV2EMEOwhwskmGb5m1dRdsXZOkkczYb7eYsiH1mlNrfGyehsbyzDAyVSYnsMhhNg3KkZ2 lMjy97PR72JnoyeqvL1YqhVCbN5X2ElCzNRM0ocyTpPpUGGE1J769fjufcbrrOSFB8LCdFJxFERR hplotzcrnNc2K5BpILzuJLfSXs82abzteediH8CU1MlVPWreXJUlVqWiVfbyaimqxjm6pylsjvrc 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 w0rvwf/8XckU4UJA+hheOA== --=_mixed 0078F3F7C1257A98_=-- From debbugs-submit-bounces@debbugs.gnu.org Tue Oct 16 04:25:47 2012 Received: (at 12656) by debbugs.gnu.org; 16 Oct 2012 08:25:47 +0000 Received: from localhost ([127.0.0.1]:46105 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TO2TD-0001ZT-4K for submit@debbugs.gnu.org; Tue, 16 Oct 2012 04:25:47 -0400 Received: from mail.avm.de ([212.42.244.120]:41871) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TO2TA-0001ZF-A4 for 12656@debbugs.gnu.org; Tue, 16 Oct 2012 04:25:45 -0400 Received: from mail-notes.avm.de (mail-notes.avm.de [172.16.0.1]) by mail.avm.de (8.13.8/8.13.8/SuSE Linux 0.8) with ESMTP id q9G8OMZl021404; Tue, 16 Oct 2012 10:24:25 +0200 In-Reply-To: <20121016011437.26922.qmail@kosh.dhis.org> References: <20121016011437.26922.qmail@kosh.dhis.org> To: "Alan Curry" MIME-Version: 1.0 Subject: Re[3]: bug#12656: cp since 8.11 corrupts files X-KeepSent: 110D006F:7B435460-C1257A99:002CA31E; type=4; name=$KeepSent X-Mailer: Lotus Notes Release 8.5.3 September 15, 2011 Message-ID: From: "Mike Gerth" Date: Tue, 16 Oct 2012 10:24:22 +0200 X-MIMETrack: Serialize by Router on ANIS1/AVM(Release 8.5.3FP1|March 07, 2012) at 16.10.2012 10:24:25 Content-Type: multipart/mixed; boundary="=_mixed 002E2CE8C1257A99_=" X-AntiVirus: checked by AntiVir MailGate (version: 2.1.2-11; AVE: 7.9.10.68; VDF: 7.11.46.82; host: mail.avm.de) X-Spam-Score: 1.8 (+) X-Spam-Report: Spam detection software, running on the system "debbugs.gnu.org", has identified this incoming email as possible spam. The original message has been attached to this so you can view it (if it isn't spam) or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: Hi Alan, the difference between bulk copy (then the corruption comes) and single file copy (everything ok) is: diff /PatchLogBulk.txt /PatchLogSingle.txt 635c635 < Julius.nsf merged extent#3 off=18239488 len=155648 flags=0x1000 --- > Julius.nsf merged extent#3 off=18239488 len=159744 flags=0x1000 [...] Content analysis details: (1.8 points, 10.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- -0.4 RP_MATCHES_RCVD Envelope sender domain matches handover relay domain 1.4 OBFU_TEXT_ATTACH BODY: Text attachment with non-text MIME type 0.0 HTML_MESSAGE BODY: HTML included in message 0.8 BAYES_50 BODY: Bayes spam probability is 40 to 60% [score: 0.5000] X-Debbugs-Envelope-To: 12656 Cc: Jim Meyering , 12656@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: 1.8 (+) X-Spam-Report: Spam detection software, running on the system "debbugs.gnu.org", has identified this incoming email as possible spam. The original message has been attached to this so you can view it (if it isn't spam) or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: Hi Alan, the difference between bulk copy (then the corruption comes) and single file copy (everything ok) is: diff /PatchLogBulk.txt /PatchLogSingle.txt 635c635 < Julius.nsf merged extent#3 off=18239488 len=155648 flags=0x1000 --- > Julius.nsf merged extent#3 off=18239488 len=159744 flags=0x1000 [...] Content analysis details: (1.8 points, 10.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- -0.4 RP_MATCHES_RCVD Envelope sender domain matches handover relay domain 1.4 OBFU_TEXT_ATTACH BODY: Text attachment with non-text MIME type 0.0 HTML_MESSAGE BODY: HTML included in message 0.8 BAYES_50 BODY: Bayes spam probability is 40 to 60% [score: 0.5000] --=_mixed 002E2CE8C1257A99_= Content-Type: multipart/alternative; boundary="=_alternative 002E2CEAC1257A99_=" --=_alternative 002E2CEAC1257A99_= Content-Type: text/plain; charset="US-ASCII" Hi Alan, the difference between bulk copy (then the corruption comes) and single file copy (everything ok) is: diff /PatchLogBulk.txt /PatchLogSingle.txt 635c635 < Julius.nsf merged extent#3 off=18239488 len=155648 flags=0x1000 --- > Julius.nsf merged extent#3 off=18239488 len=159744 flags=0x1000 Thanks, Mike Von: "Alan Curry" An: m.gerth@avm.de Kopie: jim@meyering.net (Jim Meyering), 12656@debbugs.gnu.org Datum: 16.10.2012 03:14 Betreff: Re: bug#12656: Re[2]: bug#12656: cp since 8.11 corrupts files The critical piece of the trace is here: lseek(3, 18239488, SEEK_SET) = 18239488 lseek(4, 18239488, SEEK_SET) = 18239488 read(3, "\0\0\0\0\0\0\0\0"..., 65536) = 65536 write(4, "\0\0\0\0\0\0\0\0"..., 65536) = 65536 read(3, "?\0\r\0\20\0\0\37"..., 65536) = 65536 write(4, "?\0\r\0\20\0\0\37"..., 65536) = 65536 read(3, "\20\0\0\377\0\20\0\0"..., 24576) = 24576 write(4, "\20\0\0\377\0\20\0\0"..., 24576) = 24576 lseek(3, 18403328, SEEK_SET) = 18403328 lseek(4, 18403328, SEEK_SET) = 18403328 The 24576-byte read and write should be 4096 bytes longer. cp has got the extents mixed up somehow. Here are some quick and dirty patches to make cp dump what it thinks the extents are at a couple of different stages. It would be interesting to see what they say about the troublesome file. --- src/extent-scan.c 2012-10-15 19:24:55.112096929 -0500 +++ src/extent-scan.c 2012-10-15 19:56:22.533209742 -0500 @@ -131,6 +131,12 @@ sizeof (struct extent_info)); unsigned int i = 0; + for(i=0; ifm_mapped_extents; ++i) + fprintf(stderr, "fd %d extent#%d log=%llu len=%llu flags=0x%llx\n", + scan->fd, i, + (unsigned long long)fm_extents[i].fe_logical, + (unsigned long long)fm_extents[i].fe_length, + (unsigned long long)fm_extents[i].fe_flags); for (i = 0; i < fiemap->fm_mapped_extents; i++) { assert (fm_extents[i].fe_logical --- src/copy.c 2012-10-15 18:55:39.397899266 -0500 +++ src/copy.c 2012-10-15 19:56:23.417209716 -0500 @@ -317,6 +317,12 @@ unsigned int i; bool empty_extent = false; + for(i=0; iHi Alan,


the difference between bulk copy (then the corruption comes) and single file copy (everything ok) is:

diff /PatchLogBulk.txt /PatchLogSingle.txt
635c635
< Julius.nsf merged extent#3 off=18239488 len=155648 flags=0x1000
---
> Julius.nsf merged extent#3 off=18239488 len=159744 flags=0x1000



Thanks,
Mike





Von:        "Alan Curry" <pacman-cu@kosh.dhis.org>
An:        m.gerth@avm.de
Kopie:        jim@meyering.net (Jim Meyering), 12656@debbugs.gnu.org
Datum:        16.10.2012 03:14
Betreff:        Re: bug#12656: Re[2]: bug#12656: cp since 8.11 corrupts files




The critical piece of the trace is here:

lseek(3, 18239488, SEEK_SET)            = 18239488
lseek(4, 18239488, SEEK_SET)            = 18239488
read(3, "\0\0\0\0\0\0\0\0"..., 65536)   = 65536
write(4, "\0\0\0\0\0\0\0\0"..., 65536)  = 65536
read(3, "?\0\r\0\20\0\0\37"..., 65536)  = 65536
write(4, "?\0\r\0\20\0\0\37"..., 65536) = 65536
read(3, "\20\0\0\377\0\20\0\0"..., 24576) = 24576
write(4, "\20\0\0\377\0\20\0\0"..., 24576) = 24576
lseek(3, 18403328, SEEK_SET)            = 18403328
lseek(4, 18403328, SEEK_SET)            = 18403328

The 24576-byte read and write should be 4096 bytes longer. cp has got the
extents mixed up somehow.

Here are some quick and dirty patches to make cp dump what it thinks the
extents are at a couple of different stages. It would be interesting to see
what they say about the troublesome file.

--- src/extent-scan.c                 2012-10-15 19:24:55.112096929 -0500
+++ src/extent-scan.c                 2012-10-15 19:56:22.533209742 -0500
@@ -131,6 +131,12 @@
                                  sizeof (struct extent_info));

      unsigned int i = 0;
+      for(i=0; i<fiemap->fm_mapped_extents; ++i)
+        fprintf(stderr, "fd %d extent#%d log=%llu len=%llu flags=0x%llx\n",
+                scan->fd, i,
+                (unsigned long long)fm_extents[i].fe_logical,
+                (unsigned long long)fm_extents[i].fe_length,
+                (unsigned long long)fm_extents[i].fe_flags);
      for (i = 0; i < fiemap->fm_mapped_extents; i++)
        {
          assert (fm_extents[i].fe_logical
--- src/copy.c                 2012-10-15 18:55:39.397899266 -0500
+++ src/copy.c                 2012-10-15 19:56:23.417209716 -0500
@@ -317,6 +317,12 @@

      unsigned int i;
      bool empty_extent = false;
+      for(i=0; i<scan.ei_count; ++i)
+        fprintf(stderr, "%s merged extent#%d off=%llu len=%llu flags=0x%llx\n",
+                src_name, i,
+                (unsigned long long)scan.ext_info[i].ext_logical,
+                (unsigned long long)scan.ext_info[i].ext_length,
+                (unsigned long long)scan.ext_info[i].ext_flags);
      for (i = 0; i < scan.ei_count || empty_extent; i++)
        {
          off_t ext_start;

--
Alan Curry

--=_alternative 002E2CEAC1257A99_=-- --=_mixed 002E2CE8C1257A99_= Content-Type: application/octet-stream; name="PatchlogSingle.txt.bz2" Content-Disposition: attachment; filename="PatchlogSingle.txt.bz2" Content-Transfer-Encoding: base64 QlpoOTFBWSZTWUyCIKUALYtdgGAQSAF/4gAQJ6eeQGAZ/ngAAAYAD7HlFFaZppmxawlChQUKEKiR QSUq9DKKSCjs0JRRQoo4BwhFU/0yD/VVUxMAAANMhoSSqhgmRiGhjCYmTATAACVP0KghSpoAyAAV NUpJkMIDRppk0wVEkJ6JUAGIH6odjfPv58mdc2bY/G2bY7sVithq2GrYathqbbKxsrGrHh/eJ6kn 9Le6UmJwpFZzCV5ayrIubSGukuHkRQZJpVGsHlRUeDLSOkmZUSKQkm2OLqy02482kc28lxGkmspT XTcjky6TjdrCsNZKIjMspYgzkINmvNYSQ0JasJGO1ypnOamGa3llsIOuWkJZXmcUja3lqiwWJJBJ CyCJXg5llrYTXaFa0UkrQbKqEsmmckkMZuxyqVjG5rMJZtIXjBSEahrlzuW047XiriyLdJnkwyPE vJmlm02WCzmJqFjK8RZBJJSlW7bBhjpKaymXG1GamsrRHMmrmQ2NIyLdKViuzWMzCLNLjFlo6TOM UxJSaMY2cpScskWlY3LNGlssnMaSZ0mLayyTmcWx04wcxssuzbNds3aJSzhU1SrsipLuaSm2rlNs N1Y6c0uxdXEJaYtdmUts5lyrhxTNZrq11iQu5oXXSkNpdl3JLM5u1pdskhqtKUszc6skZmRxniyW 5u2XZkkuuWWwMFhixdySMshcaZmu2kZBhBgXaLa7Om1tLBmrWQ0ujtSqkTS8jKMGySbatMScdCrL tzEF1xVzE1FXGImLzfZqqqv9vt50gAAEyAAAAAHOc5zgUAAAAmQAAAAABzjGCQaCwAAmQAAAAUZD eQAAAABMgAAAAAAAAAABMgAAAAAAAAAABMgAADWtDOcoCqpcgAAAAAJkAACEDGMAAAABjGHQgmUV VLkyXdUNyBMm9lUAAAAaXvY3rUaunl0RFddceeeed/AEfIeQCN9r1d6vHDWcXNOYqjxjM8JswuYa 2801Ukla8rZiMruPNRJYSy8boyuBugkqXYFmpKaVu2caa/6SroInXV63VylBBXCkGpH8/P9P2fuz MzMzMzMzMzMzMzMzMzMzMzMzLzFmZjw5OVmZdZgrgAABA6Y6eQUpZ7GVxEZUrfAADh0V3X9PmeEV SnFNeFUHB9TEoOZeqoFneZ47U7Fk3O5Z7aGLsGd1Z2AmZOiU62QGJgEm261CwdlC8oF7Nt85w8R1 iSIoyYMoElnUc6ms5K6GbZsqPKWzq+e+k7N89PbiFBaSLWoQA7Ha5GGmTplzUiyogVSE8aUpJ5Yq bEyla6ZL65vAoublOxz4PQTbnI0bMvpALiVgu+Y7csHkANMFHx6T0Y8XFcbXkspRMVhjqI+EPlM8 7yQqO0qLu57tE4RxEMVyRlEUbai8pI7pHVkRO964044sjpzvprNd717AAQLiPZX1bvZmZmZmZmZm ZmZmZmZmZmZmZmZl5izMzMGTlZmXWTgIgf6AAAEDgB2ePqpuD8bOvm70kcXvuZ4ff06Tj3D+J8B5 8OoqCr8keP8eEQWyAgfzgQhZOqxahaiyWZdWRl7jXnPlu8dSSLa8OfXgvInMnSHaGnVlfOpgzwPO RX37L+ult0udWn7gTv8+JzinD1OHO/O7AsiX71Rf3SMMU4eYJKq/ialaPoAu+QDeic54+PHEOPOE m9+e9d9oKcZA9eFR4svFheKiim8n18TpUHjfPvAsfnzHRbMyb27W+YcTq1NTjG6k3zGWWzMNbwN1 1u41U4ruFgZY94stPe/SLiL1MxEWaIjxCIA80NMQCZpeBwwInfh+jW+EJTXOiST9wN1zffOfEz8+ 6X5OQVTgGId2G872PH1KAoX90iW9rPvAeu2HspfECeQ+WVA+eFS5e++vk286ANAkj3IRvIDGog2X yKoCarBMcbbPWslb17y98+Q2w9ySeqJbIeszPGsTBnODwfeAB1uAaQFWVGkAXsubDj4gdNeEc8gq vONYKLJBDQmmoyjXmkDJFcyW2E4USqx5aStc7alXRs5yy0XNMWTWjC6Oy6aTjdxk5S62Taku5duW 1MOkmaGGVISKAmgkjQVCSpEqZuc+zcbbbZbbdttttttttttum022w3Vspt1uilCSh6lDyzaTrgOd jr5z5198N+XqHA6fXxax9rHwFcSPOUilcDWs1X9ABXh4x4yKK8hd/FDnis99KViPpSNC6kZ9ACXw Q+Ixoad9m38aFMJg4jwixiFGGdURAZ+y376APssbow1MqpV19wVASMm/vrnhaavIwHXPN6YJtbpo mZZSRxm0+8Cx6ISxBnGTl391egADKrLeGmPiSrHe099AE6PobI2qHKWODWeRE+HCn9Mkj6AKRs/K 1Pa1VfYaMUfhi9vV09g0d3w3Y+gBT959zFFnoJOGTGKpHqWfRuzPQGQPjg3vevLR54nxCRNriss2 LZbrbsfuButDdVneTHee5Rti0wBGREB/HF9NBdV1730AVvBoS/VZKz7wUyntbqsH+kRAiIA/Ds+e ebbbZbbdttttttttttum022w3dtJuRAkXwwggEEkEl5M/pEz98Paqs/vPH9AGWB4iw0GfjWq68bm vPB8B4jUgCbkH6t0dxs37gaFdHo9h93ZX9Z1Sfuj7/nv4IF8YxRsb+gBCvn+H6R5MWfCb9NafMwd HPkx+Is99ADrwsd6pECT4/dEBDStR9JOaFcpQuUYYHoAmdYViPYx98EcbPxiOI6x9e2/PQd81i8J CIJ3jhCBBBImgUJSMuNN+4F1OqVs6X7b93X3fcde7zs6L1NbdRQz5D6Tw4CGhr+gChnbMyu3iAPv X7ARXztmhUXYvs7uqmvoAoP7erLGSYjSAIlDJli4XIZ5bmfGRcG/oAfCneb8V1Qwz9lUKY59T+3n TCccZmZAmVA2QlSNSobzblktaNs4w0Lc5qYmvLYki3TFSx1pbdsRyu5okalzObkLzF2pLOXYYVZq S3NEzBaRm21pKaGHUc6kkSxcmiulT5f3nfzvvtttptum2222222223TabbbLq2U+r317PV7ZEhY7 bScZTYzodcB4V6bJuPdzsfeFfZCs1QN5+yJtQIgQOMQP0AKv1A+TMKfxZ/KxA8egDQP11+W9c7c4 voRRI04R7QsFlEkx3egDwAVLVsOT9uB9s469n3xZnw96s868/enbxfjw7zITbVbbyy6TJv3AgTrH Vjvf3yWfu/PedfZ5+wDFNDvfv0AX1fCIn96NEr8SvShVt/huHAIg2R3oAdvT+IGmiOP1T1CiMwfK N75pDZWL1pkWQSSSPoAPGWH7oq/qsy5ucvvpSL3ubv3fr69e2sU0dJGbNZF37gTnKnCakyvD2xLX euKVTk2K+F6lPLu+5x9ABAH2I/CARZYNQCc9cSbrOMwvKcyGQjDpDsH2/Xnzbbbabbpttttttttt tttttsurZTuRA9Trx9UcHK9GZGR2hMRCGmX8ZkEDvQAbnOUUY4V1Gq0oBjOmyDsIH1Ojp9/Hh1z6 k7+U5EGeFzIWDWWRa39wJb8J5+XVEQ9+SfWfjzXtfj1+nl7+LQPdu/QBNtMe2fdLHGoirLlSJl+P bkj0AHtF7IQNafpMO176Q2tIJiTC4AP6uPzTtCUD70dXenZ9vXoB0Pvl+yDazPNCRXgAQo8T5dJH D6LF2Ryosx5kXwArTYSQNIWtXwAFkCzH3e+uDAiiIjly4nnz2QIx57xyfgNPTu8rD53fCww9D78+ 8kcXlV9ofwA7q48ZFTsjbiSAyPL1UJ9Mie7bvy68kgvKhXiihxHjxBsjylTpxuk5dJuWkbljlTkV qIlReEQttIi8iV5UI8MkeLXkcgZknOZCOSPM81mVF4lmks2smFk5pcrNbG1tJa21pqJR1prxdOMN W2Naxa3aFYau22sdUhAyhU0FYPee622222222222222222G22221TYTqcCJ1QCQgRikmUSw7dLh2 yyY3QHXWff3Pf3b0R9hPOp8t+7slIGlrI8APZsV+PVX4AivvlHuq6+QbqfgBv74UPuWK1shi2F8q c3nwoISrmf6d+qx9+AGD7BAY8Dnief1AobTMsNjXkWAALP4VA7Ee7HzWckSt1Kv0Br1vvvv3TOtV iPwT35ORueofADHnR/sV+AHe4fgSG5SArwA9P3y0d2zXvwwd0rs0pU1U7bofQPh15N85zg3xS/fn zqen7qRy3278xeevB0vvQesa8Eay0aI1wqOjrIX4AEVNHazz92mfW1bIjjEdtM4skWpoHcHZngBI ptZOmxkj10j4l/CB84e+G5tfXnzbbbbbbtlttttttttthttttunTlqTACfkKfGfh33iBNBc5C28Q 3rNddp5YtX4AX7gTl4llyOn3ztLaDdb972REIj3KRjxVPZJzayYsZZeW1uunW7888l7nMbuIIwEl BJXtM5RPG5frmHEQ2gTerXhNEVf5RVrwAxeufLhc+r6z1jXiqGH87MBmyOMe28oH3RpZCS89jARp jwxjdc1Vpap676dG7JlTLIzy240WSx8ltzqUy6Ob9+3o7nhvvz3j3fTg9ZU700h9revn0cen3vdF zItPGwTvnDRjTqXs7VES8IvwWzlSrG0Rnlb7uvdHfI71j853y9wj7p9+16Zffnn3nUns62ttpGQt l5OTYtFa2muJDlstJWU1sm0wRNDZZNaMQ1oxY7VZSsg1tsNyNsxtFdL+63T1OrLdNF4lJEkURKME 0KCSEyEZmQKQn6/3z/Ntttttu2W222222222G2223LbluSWMIHqHiDDthY2atjVbYSUrcPr/LlcA wcu+Ni2aVfCROUM6akbfOlM5w4wTkc+/CIgBLCvJjc0UIlYFlJE9ObtHBb1ETa430AJe7M9QS9GF akJGgyddz0FjL8Oc9+zIEeBbChRJLyfILM815Xlu3TvkssJO+JzPFiukUvTntYQ2TpBtb0XFXmj0 xRAFg4Jc1etgCLRqsRCU4gJ8vIvzFiatma1kWTILXRHiGUQTEDuk+sZU1ZFrm4GMFer99nW+/PT7 Xvi6FEJBMMeF3ktrGztPI0YVYmX2WQ7q5ExK+rObbbbbbbbbbbbbbbbbtltthy6bqWw2R9AI4+XC RmaC/oyu55vwQ9u3e4RdYDJEA15kJRgsgASYHiIgk4doEec4LRtnIr2NddIXk/kuZOp7TI34VmTX tF/KvorAiy/MdZFk2cxD2ORqm82ZrulIHuB690Da7ESLrwG+8AFljIxF94z7qCzcyjrs80tmws4V oFAI9bjgdIc5wJx7NqmxbJk2F2zYGakTEipovMqQRAufHDHeQyY2ZruqA2qJIMGSGx2DfaaqpVTL QQycmreV4AWn7QjMz26w8RB8HYsXBk5e74ZT3ffy/7/kAAAIEPXKWCmzamSJUzQ1mtVE2Ka0WhWB Rq2EmUzS1CBDpOaUbljipVzis1c2pKbRWxUVtaHJxaRy5s1qq1bbU2lRWalAa0SFUxFUnOcE01S2 WykWmWtlrZGrZNLZitbWqmtFY/WPQBHEkSQ/qHMNAI+oCP8h9QEdw9Q3JEkPkOAEWSJIf7D4AjuH QCOQEf9CgI+4BHyFARkOZIkhkOIfeAzwxhnqAz2x/8eQDOwBnuLuSKcKEgmQRBSg --=_mixed 002E2CE8C1257A99_= Content-Type: application/octet-stream; name="PatchlogBulk.txt.bz2" Content-Disposition: attachment; filename="PatchlogBulk.txt.bz2" Content-Transfer-Encoding: base64 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 --=_mixed 002E2CE8C1257A99_=-- From debbugs-submit-bounces@debbugs.gnu.org Tue Oct 16 11:47:55 2012 Received: (at 12656) by debbugs.gnu.org; 16 Oct 2012 15:47:55 +0000 Received: from localhost ([127.0.0.1]:47017 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TO9N4-0004OH-Mw for submit@debbugs.gnu.org; Tue, 16 Oct 2012 11:47:55 -0400 Received: from mx.meyering.net ([88.168.87.75]:42663) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TO9N1-0004O7-9T for 12656@debbugs.gnu.org; Tue, 16 Oct 2012 11:47:53 -0400 Received: from rho.meyering.net (rho.meyering.net [127.0.0.1]) by rho.meyering.net (Acme Bit-Twister) with ESMTP id 1BC20600A1; Tue, 16 Oct 2012 17:46:35 +0200 (CEST) From: Jim Meyering To: "Mike Gerth" Subject: Re: bug#12656: Re[3]: bug#12656: cp since 8.11 corrupts files In-Reply-To: (Mike Gerth's message of "Tue, 16 Oct 2012 10:24:22 +0200") References: <20121016011437.26922.qmail@kosh.dhis.org> Date: Tue, 16 Oct 2012 17:46:35 +0200 Message-ID: <878vb6whb8.fsf@rho.meyering.net> Lines: 132 MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: 0.4 (/) X-Debbugs-Envelope-To: 12656 Cc: Alan Curry , 12656@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: 0.4 (/) Mike Gerth wrote: > Hi Alan, > the difference between bulk copy (then the corruption comes) and single > file copy (everything ok) is: > > diff /PatchLogBulk.txt /PatchLogSingle.txt > 635c635 > < Julius.nsf merged extent#3 off=18239488 len=155648 flags=0x1000 > --- >> Julius.nsf merged extent#3 off=18239488 len=159744 flags=0x1000 ... > Von: "Alan Curry" > An: m.gerth@avm.de > Kopie: jim@meyering.net (Jim Meyering), 12656@debbugs.gnu.org > Datum: 16.10.2012 03:14 > Betreff: Re: bug#12656: Re[2]: bug#12656: cp since 8.11 corrupts > files > > The critical piece of the trace is here: > > lseek(3, 18239488, SEEK_SET) = 18239488 > lseek(4, 18239488, SEEK_SET) = 18239488 > read(3, "\0\0\0\0\0\0\0\0"..., 65536) = 65536 > write(4, "\0\0\0\0\0\0\0\0"..., 65536) = 65536 > read(3, "?\0\r\0\20\0\0\37"..., 65536) = 65536 > write(4, "?\0\r\0\20\0\0\37"..., 65536) = 65536 > read(3, "\20\0\0\377\0\20\0\0"..., 24576) = 24576 > write(4, "\20\0\0\377\0\20\0\0"..., 24576) = 24576 > lseek(3, 18403328, SEEK_SET) = 18403328 > lseek(4, 18403328, SEEK_SET) = 18403328 > > The 24576-byte read and write should be 4096 bytes longer. cp has got the > extents mixed up somehow. > > Here are some quick and dirty patches to make cp dump what it thinks the > extents are at a couple of different stages. It would be interesting to > see > what they say about the troublesome file. > > --- src/extent-scan.c 2012-10-15 19:24:55.112096929 -0500 > +++ src/extent-scan.c 2012-10-15 19:56:22.533209742 -0500 > @@ -131,6 +131,12 @@ > sizeof (struct extent_info)); > > unsigned int i = 0; > + for(i=0; ifm_mapped_extents; ++i) > + fprintf(stderr, "fd %d extent#%d log=%llu len=%llu > flags=0x%llx\n", > + scan->fd, i, > + (unsigned long long)fm_extents[i].fe_logical, > + (unsigned long long)fm_extents[i].fe_length, > + (unsigned long long)fm_extents[i].fe_flags); > for (i = 0; i < fiemap->fm_mapped_extents; i++) > { > assert (fm_extents[i].fe_logical > --- src/copy.c 2012-10-15 18:55:39.397899266 -0500 > +++ src/copy.c 2012-10-15 19:56:23.417209716 -0500 > @@ -317,6 +317,12 @@ > > unsigned int i; > bool empty_extent = false; > + for(i=0; i + fprintf(stderr, "%s merged extent#%d off=%llu len=%llu > flags=0x%llx\n", > + src_name, i, > + (unsigned long long)scan.ext_info[i].ext_logical, > + (unsigned long long)scan.ext_info[i].ext_length, > + (unsigned long long)scan.ext_info[i].ext_flags); > for (i = 0; i < scan.ei_count || empty_extent; i++) > { > off_t ext_start; Thanks for the additional info, Alan. With that, I have deduced that cp was using freed memory in this unusual case. How? When a file was so fragmented that it took two or more FIEMAP ioctls to obtain the list of extents, our "last_ei" pointer would be pointing into a malloc'd buffer from the first ioctl, when that buffer has to be enlarged (realloc'd) to accommodate the results of the second call. If that realloc actually freed the first buffer, our last_ei pointer (which we're about to use) was left pointing to that freed memory. Mike, can you test this preliminary patch? If it does the job, I'll add something like the above to the log, write a NEWS entry and work on adding a test. This can happen only with a FIEMAP-enabled copy. >From 25046bda75bba889e800a2df10c8c4393b106990 Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Tue, 16 Oct 2012 17:43:49 +0200 Subject: [PATCH] cp: avoid data-corrupting free-memory-read * src/extent-scan.c (extent_scan_read): Reset our last_ei pointer whenever the parent buffer might have just been freed. Reported by Mike Gerth in http://bugs.gnu.org/12656, and with help from Alan Curry. --- src/extent-scan.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/extent-scan.c b/src/extent-scan.c index 0c25c57..5b47295 100644 --- a/src/extent-scan.c +++ b/src/extent-scan.c @@ -89,7 +89,7 @@ extern bool extent_scan_read (struct extent_scan *scan) { unsigned int si = 0; - struct extent_info *last_ei IF_LINT ( = scan->ext_info); + struct extent_info *last_ei = scan->ext_info; while (true) { @@ -127,8 +127,12 @@ extent_scan_read (struct extent_scan *scan) assert (scan->ei_count <= SIZE_MAX - fiemap->fm_mapped_extents); scan->ei_count += fiemap->fm_mapped_extents; - scan->ext_info = xnrealloc (scan->ext_info, scan->ei_count, - sizeof (struct extent_info)); + { + size_t prev_idx = last_ei - scan->ext_info; + scan->ext_info = xnrealloc (scan->ext_info, scan->ei_count, + sizeof (struct extent_info)); + last_ei = scan->ext_info + prev_idx; + } unsigned int i = 0; for (i = 0; i < fiemap->fm_mapped_extents; i++) -- 1.8.0.rc2 From debbugs-submit-bounces@debbugs.gnu.org Tue Oct 16 13:39:24 2012 Received: (at 12656) by debbugs.gnu.org; 16 Oct 2012 17:39:24 +0000 Received: from localhost ([127.0.0.1]:47111 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TOB6x-0006xY-1V for submit@debbugs.gnu.org; Tue, 16 Oct 2012 13:39:23 -0400 Received: from mail.avm.de ([212.42.244.120]:56625) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TOB6s-0006xI-4x for 12656@debbugs.gnu.org; Tue, 16 Oct 2012 13:39:21 -0400 Received: from mail-notes.avm.de (mail-notes.avm.de [172.16.0.1]) by mail.avm.de (8.13.8/8.13.8/SuSE Linux 0.8) with ESMTP id q9GHbtZw003078; Tue, 16 Oct 2012 19:37:57 +0200 In-Reply-To: <878vb6whb8.fsf@rho.meyering.net> References: <20121016011437.26922.qmail@kosh.dhis.org> <878vb6whb8.fsf@rho.meyering.net> To: Jim Meyering MIME-Version: 1.0 Subject: Re[4]: bug#12656: cp since 8.11 corrupts files X-KeepSent: 1EEED156:AA6D5565-C1257A99:00608219; type=4; name=$KeepSent X-Mailer: Lotus Notes Release 8.5 December 05, 2008 Message-ID: From: m.gerth@avm.de Date: Tue, 16 Oct 2012 19:37:54 +0200 X-MIMETrack: Serialize by Router on ANIS1/AVM(Release 8.5.3FP1|March 07, 2012) at 16.10.2012 19:37:57, Serialize complete at 16.10.2012 19:37:57 Content-Type: multipart/alternative; boundary="=_alternative 0060E040C1257A99_=" X-AntiVirus: checked by AntiVir MailGate (version: 2.1.2-11; AVE: 7.9.10.68; VDF: 7.11.46.104; host: mail.avm.de) X-Spam-Score: 0.4 (/) X-Debbugs-Envelope-To: 12656 Cc: Alan Curry , 12656@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: 0.4 (/) Dies ist eine mehrteilige Nachricht im MIME-Format. --=_alternative 0060E040C1257A99_= Content-Type: text/plain; charset="US-ASCII" Hi Jim, Congratulation - the patch works for me. Result looks good - no errors. Tomorror I will test more extensive (copy all files and compare all files). The debug output from the first patch is now identical when using the bulk copy and the single copy. Best regards, Mike Von: Jim Meyering An: "Mike Gerth" Kopie: "Alan Curry" , 12656@debbugs.gnu.org Datum: 16.10.2012 17:46 Betreff: Re: bug#12656: Re[3]: bug#12656: cp since 8.11 corrupts files Mike Gerth wrote: > Hi Alan, > the difference between bulk copy (then the corruption comes) and single > file copy (everything ok) is: > > diff /PatchLogBulk.txt /PatchLogSingle.txt > 635c635 > < Julius.nsf merged extent#3 off=18239488 len=155648 flags=0x1000 > --- >> Julius.nsf merged extent#3 off=18239488 len=159744 flags=0x1000 ... > Von: "Alan Curry" > An: m.gerth@avm.de > Kopie: jim@meyering.net (Jim Meyering), 12656@debbugs.gnu.org > Datum: 16.10.2012 03:14 > Betreff: Re: bug#12656: Re[2]: bug#12656: cp since 8.11 corrupts > files > > The critical piece of the trace is here: > > lseek(3, 18239488, SEEK_SET) = 18239488 > lseek(4, 18239488, SEEK_SET) = 18239488 > read(3, "\0\0\0\0\0\0\0\0"..., 65536) = 65536 > write(4, "\0\0\0\0\0\0\0\0"..., 65536) = 65536 > read(3, "?\0\r\0\20\0\0\37"..., 65536) = 65536 > write(4, "?\0\r\0\20\0\0\37"..., 65536) = 65536 > read(3, "\20\0\0\377\0\20\0\0"..., 24576) = 24576 > write(4, "\20\0\0\377\0\20\0\0"..., 24576) = 24576 > lseek(3, 18403328, SEEK_SET) = 18403328 > lseek(4, 18403328, SEEK_SET) = 18403328 > > The 24576-byte read and write should be 4096 bytes longer. cp has got the > extents mixed up somehow. > > Here are some quick and dirty patches to make cp dump what it thinks the > extents are at a couple of different stages. It would be interesting to > see > what they say about the troublesome file. > > --- src/extent-scan.c 2012-10-15 19:24:55.112096929 -0500 > +++ src/extent-scan.c 2012-10-15 19:56:22.533209742 -0500 > @@ -131,6 +131,12 @@ > sizeof (struct extent_info)); > > unsigned int i = 0; > + for(i=0; ifm_mapped_extents; ++i) > + fprintf(stderr, "fd %d extent#%d log=%llu len=%llu > flags=0x%llx\n", > + scan->fd, i, > + (unsigned long long)fm_extents[i].fe_logical, > + (unsigned long long)fm_extents[i].fe_length, > + (unsigned long long)fm_extents[i].fe_flags); > for (i = 0; i < fiemap->fm_mapped_extents; i++) > { > assert (fm_extents[i].fe_logical > --- src/copy.c 2012-10-15 18:55:39.397899266 -0500 > +++ src/copy.c 2012-10-15 19:56:23.417209716 -0500 > @@ -317,6 +317,12 @@ > > unsigned int i; > bool empty_extent = false; > + for(i=0; i + fprintf(stderr, "%s merged extent#%d off=%llu len=%llu > flags=0x%llx\n", > + src_name, i, > + (unsigned long long)scan.ext_info[i].ext_logical, > + (unsigned long long)scan.ext_info[i].ext_length, > + (unsigned long long)scan.ext_info[i].ext_flags); > for (i = 0; i < scan.ei_count || empty_extent; i++) > { > off_t ext_start; Thanks for the additional info, Alan. With that, I have deduced that cp was using freed memory in this unusual case. How? When a file was so fragmented that it took two or more FIEMAP ioctls to obtain the list of extents, our "last_ei" pointer would be pointing into a malloc'd buffer from the first ioctl, when that buffer has to be enlarged (realloc'd) to accommodate the results of the second call. If that realloc actually freed the first buffer, our last_ei pointer (which we're about to use) was left pointing to that freed memory. Mike, can you test this preliminary patch? If it does the job, I'll add something like the above to the log, write a NEWS entry and work on adding a test. This can happen only with a FIEMAP-enabled copy. >From 25046bda75bba889e800a2df10c8c4393b106990 Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Tue, 16 Oct 2012 17:43:49 +0200 Subject: [PATCH] cp: avoid data-corrupting free-memory-read * src/extent-scan.c (extent_scan_read): Reset our last_ei pointer whenever the parent buffer might have just been freed. Reported by Mike Gerth in http://bugs.gnu.org/12656, and with help from Alan Curry. --- src/extent-scan.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/extent-scan.c b/src/extent-scan.c index 0c25c57..5b47295 100644 --- a/src/extent-scan.c +++ b/src/extent-scan.c @@ -89,7 +89,7 @@ extern bool extent_scan_read (struct extent_scan *scan) { unsigned int si = 0; - struct extent_info *last_ei IF_LINT ( = scan->ext_info); + struct extent_info *last_ei = scan->ext_info; while (true) { @@ -127,8 +127,12 @@ extent_scan_read (struct extent_scan *scan) assert (scan->ei_count <= SIZE_MAX - fiemap->fm_mapped_extents); scan->ei_count += fiemap->fm_mapped_extents; - scan->ext_info = xnrealloc (scan->ext_info, scan->ei_count, - sizeof (struct extent_info)); + { + size_t prev_idx = last_ei - scan->ext_info; + scan->ext_info = xnrealloc (scan->ext_info, scan->ei_count, + sizeof (struct extent_info)); + last_ei = scan->ext_info + prev_idx; + } unsigned int i = 0; for (i = 0; i < fiemap->fm_mapped_extents; i++) -- 1.8.0.rc2 --=_alternative 0060E040C1257A99_= Content-Type: text/html; charset="US-ASCII" Hi Jim,

Congratulation - the patch works for me. Result looks good - no errors.
Tomorror I will test more extensive (copy all files and compare all files).
The debug output from the first patch is now identical when using the bulk copy and the single copy.

Best regards,
Mike




Von:        Jim Meyering <jim@meyering.net>
An:        "Mike Gerth" <m.gerth@avm.de>
Kopie:        "Alan Curry" <pacman-cu@kosh.dhis.org>, 12656@debbugs.gnu.org
Datum:        16.10.2012 17:46
Betreff:        Re: bug#12656: Re[3]: bug#12656: cp since 8.11 corrupts files




Mike Gerth wrote:
> Hi Alan,
> the difference between bulk copy (then the corruption comes) and single
> file copy (everything ok) is:
>
> diff /PatchLogBulk.txt /PatchLogSingle.txt
> 635c635
> < Julius.nsf merged extent#3 off=18239488 len=155648 flags=0x1000
> ---
>> Julius.nsf merged extent#3 off=18239488 len=159744 flags=0x1000
...
> Von:    "Alan Curry" <pacman-cu@kosh.dhis.org>
> An:     m.gerth@avm.de
> Kopie:  jim@meyering.net (Jim Meyering), 12656@debbugs.gnu.org
> Datum:  16.10.2012 03:14
> Betreff:        Re: bug#12656: Re[2]: bug#12656: cp since 8.11 corrupts
> files
>
> The critical piece of the trace is here:
>
> lseek(3, 18239488, SEEK_SET)            = 18239488
> lseek(4, 18239488, SEEK_SET)            = 18239488
> read(3, "\0\0\0\0\0\0\0\0"..., 65536)   = 65536
> write(4, "\0\0\0\0\0\0\0\0"..., 65536)  = 65536
> read(3, "?\0\r\0\20\0\0\37"..., 65536)  = 65536
> write(4, "?\0\r\0\20\0\0\37"..., 65536) = 65536
> read(3, "\20\0\0\377\0\20\0\0"..., 24576) = 24576
> write(4, "\20\0\0\377\0\20\0\0"..., 24576) = 24576
> lseek(3, 18403328, SEEK_SET)            = 18403328
> lseek(4, 18403328, SEEK_SET)            = 18403328
>
> The 24576-byte read and write should be 4096 bytes longer. cp has got the
> extents mixed up somehow.
>
> Here are some quick and dirty patches to make cp dump what it thinks the
> extents are at a couple of different stages. It would be interesting to
> see
> what they say about the troublesome file.
>
> --- src/extent-scan.c            2012-10-15 19:24:55.112096929 -0500
> +++ src/extent-scan.c            2012-10-15 19:56:22.533209742 -0500
> @@ -131,6 +131,12 @@
>                                    sizeof (struct extent_info));
>
>        unsigned int i = 0;
> +      for(i=0; i<fiemap->fm_mapped_extents; ++i)
> +        fprintf(stderr, "fd %d extent#%d log=%llu len=%llu
> flags=0x%llx\n",
> +                scan->fd, i,
> +                (unsigned long long)fm_extents[i].fe_logical,
> +                (unsigned long long)fm_extents[i].fe_length,
> +                (unsigned long long)fm_extents[i].fe_flags);
>        for (i = 0; i < fiemap->fm_mapped_extents; i++)
>          {
>            assert (fm_extents[i].fe_logical
> --- src/copy.c           2012-10-15 18:55:39.397899266 -0500
> +++ src/copy.c           2012-10-15 19:56:23.417209716 -0500
> @@ -317,6 +317,12 @@
>
>        unsigned int i;
>        bool empty_extent = false;
> +      for(i=0; i<scan.ei_count; ++i)
> +        fprintf(stderr, "%s merged extent#%d off=%llu len=%llu
> flags=0x%llx\n",
> +                src_name, i,
> +                (unsigned long long)scan.ext_info[i].ext_logical,
> +                (unsigned long long)scan.ext_info[i].ext_length,
> +                (unsigned long long)scan.ext_info[i].ext_flags);
>        for (i = 0; i < scan.ei_count || empty_extent; i++)
>          {
>            off_t ext_start;

Thanks for the additional info, Alan.
With that, I have deduced that cp was using freed memory
in this unusual case.  How?

When a file was so fragmented that it took two or more FIEMAP ioctls
to obtain the list of extents, our "last_ei" pointer would be pointing
into a malloc'd buffer from the first ioctl, when that buffer has to
be enlarged (realloc'd) to accommodate the results of the second call.
If that realloc actually freed the first buffer, our last_ei pointer
(which we're about to use) was left pointing to that freed memory.

Mike, can you test this preliminary patch?
If it does the job, I'll add something like the above to
the log, write a NEWS entry and work on adding a test.
This can happen only with a FIEMAP-enabled copy.


>From 25046bda75bba889e800a2df10c8c4393b106990 Mon Sep 17 00:00:00 2001
From: Jim Meyering <meyering@redhat.com>
Date: Tue, 16 Oct 2012 17:43:49 +0200
Subject: [PATCH] cp: avoid data-corrupting free-memory-read

* src/extent-scan.c (extent_scan_read): Reset our last_ei
pointer whenever the parent buffer might have just been freed.
Reported by Mike Gerth in
http://bugs.gnu.org/12656, and with
help from Alan Curry.
---
src/extent-scan.c | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/src/extent-scan.c b/src/extent-scan.c
index 0c25c57..5b47295 100644
--- a/src/extent-scan.c
+++ b/src/extent-scan.c
@@ -89,7 +89,7 @@ extern bool
extent_scan_read (struct extent_scan *scan)
{
  unsigned int si = 0;
-  struct extent_info *last_ei IF_LINT ( = scan->ext_info);
+  struct extent_info *last_ei = scan->ext_info;

  while (true)
    {
@@ -127,8 +127,12 @@ extent_scan_read (struct extent_scan *scan)

      assert (scan->ei_count <= SIZE_MAX - fiemap->fm_mapped_extents);
      scan->ei_count += fiemap->fm_mapped_extents;
-      scan->ext_info = xnrealloc (scan->ext_info, scan->ei_count,
-                                  sizeof (struct extent_info));
+      {
+        size_t prev_idx = last_ei - scan->ext_info;
+        scan->ext_info = xnrealloc (scan->ext_info, scan->ei_count,
+                                    sizeof (struct extent_info));
+        last_ei = scan->ext_info + prev_idx;
+      }

      unsigned int i = 0;
      for (i = 0; i < fiemap->fm_mapped_extents; i++)
--
1.8.0.rc2

--=_alternative 0060E040C1257A99_=-- From debbugs-submit-bounces@debbugs.gnu.org Tue Oct 16 14:43:08 2012 Received: (at 12656) by debbugs.gnu.org; 16 Oct 2012 18:43:08 +0000 Received: from localhost ([127.0.0.1]:47142 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TOC6d-0008Pv-Pe for submit@debbugs.gnu.org; Tue, 16 Oct 2012 14:43:08 -0400 Received: from mx.meyering.net ([88.168.87.75]:43066) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TOC6a-0008Pl-3L for 12656@debbugs.gnu.org; Tue, 16 Oct 2012 14:43:05 -0400 Received: from rho.meyering.net (rho.meyering.net [127.0.0.1]) by rho.meyering.net (Acme Bit-Twister) with ESMTP id 6A4C2600AE; Tue, 16 Oct 2012 20:41:47 +0200 (CEST) From: Jim Meyering To: m.gerth@avm.de Subject: Re: bug#12656: cp since 8.11 corrupts files In-Reply-To: (m. gerth's message of "Tue, 16 Oct 2012 19:37:54 +0200") References: <20121016011437.26922.qmail@kosh.dhis.org> <878vb6whb8.fsf@rho.meyering.net> Date: Tue, 16 Oct 2012 20:41:47 +0200 Message-ID: <87lif6uums.fsf@rho.meyering.net> Lines: 69 MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: 0.4 (/) X-Debbugs-Envelope-To: 12656 Cc: Alan Curry , 12656@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: 0.4 (/) m.gerth@avm.de wrote: > Hi Jim, > > Congratulation - the patch works for me. Result looks good - no errors. > Tomorror I will test more extensive (copy all files and compare all files). > The debug output from the first patch is now identical when using the bulk copy > and the single copy. Great. Thanks for the confirmation. I've reproduced the problem on an ext4 file system. This shows the free-memory read, though the two files compare equal. $ perl -e 'for (1..3333) { sysseek (*STDOUT, 4096, 1)' \ -e '&& syswrite (*STDOUT, "a" x 1024) or die "$!"}' > j $ valgrind cp j j2 Memcheck, a memory error detector Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al. Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info Command: cp j j2 Invalid read of size 4 at 0x4093D7: extent_scan_read (extent-scan.c:139) by 0x407D46: copy_internal (copy.c:301) by 0x40904B: copy (copy.c:2691) by 0x404B93: do_copy (cp.c:762) by 0x4037F7: main (cp.c:1170) Address 0x4c4c170 is 1,696 bytes inside a block of size 1,728 free'd at 0x4A0892E: realloc (vg_replace_malloc.c:632) by 0x410700: xrealloc (xmalloc.c:63) by 0x409392: extent_scan_read (xalloc.h:126) by 0x407D46: copy_internal (copy.c:301) by 0x40904B: copy (copy.c:2691) by 0x404B93: do_copy (cp.c:762) by 0x4037F7: main (cp.c:1170) Invalid read of size 8 at 0x4094E8: extent_scan_read (extent-scan.c:141) by 0x407D46: copy_internal (copy.c:301) by 0x40904B: copy (copy.c:2691) by 0x404B93: do_copy (cp.c:762) by 0x4037F7: main (cp.c:1170) Address 0x4c4c168 is 1,688 bytes inside a block of size 1,728 free'd at 0x4A0892E: realloc (vg_replace_malloc.c:632) by 0x410700: xrealloc (xmalloc.c:63) by 0x409392: extent_scan_read (xalloc.h:126) by 0x407D46: copy_internal (copy.c:301) by 0x40904B: copy (copy.c:2691) by 0x404B93: do_copy (cp.c:762) by 0x4037F7: main (cp.c:1170) Invalid read of size 8 at 0x4094EF: extent_scan_read (extent-scan.c:141) by 0x407D46: copy_internal (copy.c:301) by 0x40904B: copy (copy.c:2691) by 0x404B93: do_copy (cp.c:762) by 0x4037F7: main (cp.c:1170) Address 0x4c4c160 is 1,680 bytes inside a block of size 1,728 free'd at 0x4A0892E: realloc (vg_replace_malloc.c:632) by 0x410700: xrealloc (xmalloc.c:63) by 0x409392: extent_scan_read (xalloc.h:126) by 0x407D46: copy_internal (copy.c:301) by 0x40904B: copy (copy.c:2691) by 0x404B93: do_copy (cp.c:762) by 0x4037F7: main (cp.c:1170) Now, let's see if I can reproduce the actual data corruption part. This obviously reinforces my desire to switch from FIEMAP to using SEEK_HOLE/SEEK_DATA as soon as possible. From debbugs-submit-bounces@debbugs.gnu.org Tue Oct 16 18:22:13 2012 Received: (at 12656) by debbugs.gnu.org; 16 Oct 2012 22:22:13 +0000 Received: from localhost ([127.0.0.1]:47375 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TOFWe-0005nw-Hw for submit@debbugs.gnu.org; Tue, 16 Oct 2012 18:22:13 -0400 Received: from mail.avm.de ([212.42.244.120]:53529) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TOFWc-0005nk-Qi for 12656@debbugs.gnu.org; Tue, 16 Oct 2012 18:22:11 -0400 Received: from mail-notes.avm.de (mail-notes.avm.de [172.16.0.1]) by mail.avm.de (8.13.8/8.13.8/SuSE Linux 0.8) with ESMTP id q9GMKkBu005402; Wed, 17 Oct 2012 00:20:48 +0200 To: Jim Meyering MIME-Version: 1.0 Subject: WG: Re[4]: bug#12656: cp since 8.11 corrupts files X-KeepSent: B686D77A:FEC9CAF7-C1257A99:0065331D; type=4; name=$KeepSent X-Mailer: Lotus Notes Release 8.5 December 05, 2008 Message-ID: From: m.gerth@avm.de Date: Wed, 17 Oct 2012 00:20:47 +0200 X-MIMETrack: Serialize by Router on ANIS1/AVM(Release 8.5.3FP1|March 07, 2012) at 17.10.2012 00:20:49, Serialize complete at 17.10.2012 00:20:49 Content-Type: multipart/alternative; boundary="=_alternative 007AC61EC1257A99_=" X-AntiVirus: checked by AntiVir MailGate (version: 2.1.2-11; AVE: 7.9.10.68; VDF: 7.11.46.114; host: mail.avm.de) X-Spam-Score: 0.4 (/) X-Debbugs-Envelope-To: 12656 Cc: Alan Curry , 12656@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: 0.4 (/) Dies ist eine mehrteilige Nachricht im MIME-Format. --=_alternative 007AC61EC1257A99_= Content-Type: text/plain; charset="US-ASCII" Hi Jim, different cp version produce different corruptions: 8.11: unpatched: 14 corrupted files; patched == OK 8.19: unpatched: 3 corrupted files; patched == OK Regards, Mike --=_alternative 007AC61EC1257A99_= Content-Type: text/html; charset="US-ASCII" Hi Jim,

different cp version produce different corruptions:

        8.11: unpatched: 14 corrupted files;  patched == OK
        8.19: unpatched:  3 corrupted files;  patched == OK

Regards,
Mike
--=_alternative 007AC61EC1257A99_=-- From debbugs-submit-bounces@debbugs.gnu.org Wed Oct 17 04:45:58 2012 Received: (at 12656) by debbugs.gnu.org; 17 Oct 2012 08:45:58 +0000 Received: from localhost ([127.0.0.1]:47636 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TOPGH-0004iQ-Np for submit@debbugs.gnu.org; Wed, 17 Oct 2012 04:45:58 -0400 Received: from mx.meyering.net ([88.168.87.75]:44927) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TOPGC-0004iE-7K for 12656@debbugs.gnu.org; Wed, 17 Oct 2012 04:45:54 -0400 Received: from rho.meyering.net (rho.meyering.net [127.0.0.1]) by rho.meyering.net (Acme Bit-Twister) with ESMTP id 5C7AF600BE; Wed, 17 Oct 2012 10:44:33 +0200 (CEST) From: Jim Meyering To: m.gerth@avm.de Subject: Re: WG: Re[4]: bug#12656: cp since 8.11 corrupts files In-Reply-To: (m. gerth's message of "Wed, 17 Oct 2012 00:20:47 +0200") References: Date: Wed, 17 Oct 2012 10:44:33 +0200 Message-ID: <876269trm6.fsf@rho.meyering.net> Lines: 140 MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: 0.4 (/) X-Debbugs-Envelope-To: 12656 Cc: Alan Curry , 12656@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: 0.4 (/) m.gerth@avm.de wrote: > different cp version produce different corruptions: > > 8.11: unpatched: 14 corrupted files; patched == OK > 8.19: unpatched: 3 corrupted files; patched == OK Thanks for the thorough testing. Here's a complete patch: Changes: - added a comment to the code - added NEWS - added a test case [testing note: I would have preferred to create a test case that made the pre-patch cp produce a corrupted result rather than just a valgrind-detected FMR, but that would have required being able to create an input file with multiple adjacent extents, and at least with ext4, I don't know off hand how to do that (without resorting to creating/using a nearly full partition?), and prefer to keep this a user-runnable (not root-only) test. Suggestions welcome. ] >From a5365003c88f4fce6293827c13f90acd0b5bd0cc Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Tue, 16 Oct 2012 17:43:49 +0200 Subject: [PATCH] cp: avoid data-corrupting free-memory-read * src/extent-scan.c (extent_scan_read): Reset our last_ei pointer whenever the parent buffer might have just been freed. * tests/cp/fiemap-extent-FMR.sh: New test. * tests/local.mk (all_tests): Add it. * NEWS (Bug fixes): Mention it. Reported by Mike Gerth in http://bugs.gnu.org/12656, and with help from Alan Curry. Bug introduced in commit v8.10-60-g18f5a85. --- NEWS | 4 ++++ src/extent-scan.c | 12 +++++++++--- tests/cp/fiemap-FMR.sh | 31 +++++++++++++++++++++++++++++++ tests/local.mk | 1 + 4 files changed, 45 insertions(+), 3 deletions(-) create mode 100755 tests/cp/fiemap-FMR.sh diff --git a/NEWS b/NEWS index aff5bf1..46ce698 100644 --- a/NEWS +++ b/NEWS @@ -12,6 +12,10 @@ GNU coreutils NEWS -*- outline -*- ** Bug fixes + cp could read from freed memory and could even make corrupt copies. + This could happen only with a very fragmented input file and when using + its FIEMAP/extent-based copying code. [bug introduced in coreutils-8.11] + cp --no-preserve=mode now no longer preserves the original file's permissions but correctly sets mode specified by 0666 & ~umask diff --git a/src/extent-scan.c b/src/extent-scan.c index 0c25c57..f962298 100644 --- a/src/extent-scan.c +++ b/src/extent-scan.c @@ -89,7 +89,7 @@ extern bool extent_scan_read (struct extent_scan *scan) { unsigned int si = 0; - struct extent_info *last_ei IF_LINT ( = scan->ext_info); + struct extent_info *last_ei = scan->ext_info; while (true) { @@ -127,8 +127,14 @@ extent_scan_read (struct extent_scan *scan) assert (scan->ei_count <= SIZE_MAX - fiemap->fm_mapped_extents); scan->ei_count += fiemap->fm_mapped_extents; - scan->ext_info = xnrealloc (scan->ext_info, scan->ei_count, - sizeof (struct extent_info)); + { + /* last_ei points into a buffer that may be freed via xnrealloc. + Record its offset and adjust after allocation. */ + size_t prev_idx = last_ei - scan->ext_info; + scan->ext_info = xnrealloc (scan->ext_info, scan->ei_count, + sizeof (struct extent_info)); + last_ei = scan->ext_info + prev_idx; + } unsigned int i = 0; for (i = 0; i < fiemap->fm_mapped_extents; i++) diff --git a/tests/cp/fiemap-FMR.sh b/tests/cp/fiemap-FMR.sh new file mode 100755 index 0000000..10c9e05 --- /dev/null +++ b/tests/cp/fiemap-FMR.sh @@ -0,0 +1,31 @@ +#!/bin/sh +# Trigger a free-memory read bug in cp from coreutils-[8.11..8.19] + +# Copyright (C) 2012 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src +print_ver_ cp + +require_valgrind_ +require_perl_ +: ${PERL=perl} + +$PERL -e 'for (1..600) { sysseek (*STDOUT, 4096, 1)' \ + -e '&& syswrite (*STDOUT, "a" x 1024) or die "$!"}' > j || fail=1 +valgrind --quiet --error-exitcode=3 cp j j2 || fail=1 +cmp j j2 || fail=1 + +Exit $fail diff --git a/tests/local.mk b/tests/local.mk index 486bf31..5a237fa 100644 --- a/tests/local.mk +++ b/tests/local.mk @@ -418,6 +418,7 @@ all_tests = \ tests/cp/existing-perm-race.sh \ tests/cp/fail-perm.sh \ tests/cp/fiemap-empty.sh \ + tests/cp/fiemap-FMR.sh \ tests/cp/fiemap-perf.sh \ tests/cp/fiemap-2.sh \ tests/cp/file-perm-race.sh \ -- 1.8.0.rc2.11.gd25c58c From debbugs-submit-bounces@debbugs.gnu.org Sun Oct 21 05:43:48 2012 Received: (at 12656) by debbugs.gnu.org; 21 Oct 2012 09:43:48 +0000 Received: from localhost ([127.0.0.1]:53887 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TPs4R-0005Y3-MP for submit@debbugs.gnu.org; Sun, 21 Oct 2012 05:43:48 -0400 Received: from moutng.kundenserver.de ([212.227.17.10]:58943) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TPs4O-0005Xp-If for 12656@debbugs.gnu.org; Sun, 21 Oct 2012 05:43:45 -0400 Received: from [192.168.2.108] (p4FF768F1.dip.t-dialin.net [79.247.104.241]) by mrelayeu.kundenserver.de (node=mrbap2) with ESMTP (Nemesis) id 0Lfp8c-1T5RX920eQ-00oir1; Sun, 21 Oct 2012 11:41:22 +0200 Message-ID: <5083C340.3090000@bernhard-voelker.de> Date: Sun, 21 Oct 2012 11:41:20 +0200 From: Bernhard Voelker User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:15.0) Gecko/20120825 Thunderbird/15.0 MIME-Version: 1.0 To: Jim Meyering Subject: Re: bug#12656: WG: Re[4]: bug#12656: cp since 8.11 corrupts files References: <876269trm6.fsf@rho.meyering.net> In-Reply-To: <876269trm6.fsf@rho.meyering.net> Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit X-Provags-ID: V02:K0:JZhL63njRdanNoJEtykYqhDOG0ilBQg2XbL9kI5hh9U mfHI43zexgp8IU9BeH86m8e4SN5eQXwxX7heYGqOTI4/WziF4q 3bowqopLGes8bZFmDJpQegPf/lxyc07Rjqf8L8az5GORslO3Yl uWWXkVT3rfblwmfBQlhx9bhMOsNsUvwaV9617g4HNRb/i0q3qZ beZ62Kib25TM7VYAX8I1vNm8YXFVs8wsCkcgSRJI0TQA8I+TNM oPSJ1kA00ukeA7jltQmBg7bsyktXuIVlDAill8kX9cYiSWHrUh PftETKU2L7OW3mZdvrTbg9YEKCdZ5Vf4o21dj1HRWWA5TiPRlL YZOFEJXHMKPdwKPZP3c60uSmrZyqEYXQzLndkehfj X-Spam-Score: 0.8 (/) X-Debbugs-Envelope-To: 12656 Cc: m.gerth@avm.de, Alan Curry , 12656@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: 0.8 (/) On 10/17/2012 10:44 AM, Jim Meyering wrote: > From a5365003c88f4fce6293827c13f90acd0b5bd0cc Mon Sep 17 00:00:00 2001 > From: Jim Meyering > Date: Tue, 16 Oct 2012 17:43:49 +0200 > Subject: [PATCH] cp: avoid data-corrupting free-memory-read > > * src/extent-scan.c (extent_scan_read): Reset our last_ei > pointer whenever the parent buffer might have just been freed. > * tests/cp/fiemap-extent-FMR.sh: New test. > * tests/local.mk (all_tests): Add it. > * NEWS (Bug fixes): Mention it. > Reported by Mike Gerth in http://bugs.gnu.org/12656, and with > help from Alan Curry. Bug introduced in commit v8.10-60-g18f5a85. > --- > NEWS | 4 ++++ > src/extent-scan.c | 12 +++++++++--- > tests/cp/fiemap-FMR.sh | 31 +++++++++++++++++++++++++++++++ > tests/local.mk | 1 + > 4 files changed, 45 insertions(+), 3 deletions(-) > create mode 100755 tests/cp/fiemap-FMR.sh > > diff --git a/NEWS b/NEWS > index aff5bf1..46ce698 100644 > --- a/NEWS > +++ b/NEWS > @@ -12,6 +12,10 @@ GNU coreutils NEWS -*- outline -*- > > ** Bug fixes > > + cp could read from freed memory and could even make corrupt copies. > + This could happen only with a very fragmented input file and when using > + its FIEMAP/extent-based copying code. [bug introduced in coreutils-8.11] As the bug is in extent-scan.c, doesn't it also affect mv (and ginstall)? In src/local.mk: copy_sources = \ src/copy.c \ src/cp-hash.c \ src/extent-scan.c \ src/extent-scan.h ... src_ginstall_SOURCES = src/install.c src/prog-fprintf.c $(copy_sources) ... src_cp_SOURCES = src/cp.c $(copy_sources) ... src_mv_SOURCES = src/mv.c src/remove.c $(copy_sources) Have a nice day, Berny From debbugs-submit-bounces@debbugs.gnu.org Sun Oct 21 06:00:02 2012 Received: (at 12656) by debbugs.gnu.org; 21 Oct 2012 10:00:02 +0000 Received: from localhost ([127.0.0.1]:53915 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TPsK9-0005uk-I3 for submit@debbugs.gnu.org; Sun, 21 Oct 2012 06:00:02 -0400 Received: from mx.meyering.net ([88.168.87.75]:57629) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TPsK6-0005uV-Tq for 12656@debbugs.gnu.org; Sun, 21 Oct 2012 05:59:59 -0400 Received: from rho.meyering.net (rho.meyering.net [127.0.0.1]) by rho.meyering.net (Acme Bit-Twister) with ESMTP id CF8FF60081; Sun, 21 Oct 2012 11:58:15 +0200 (CEST) From: Jim Meyering To: Bernhard Voelker Subject: Re: bug#12656: WG: Re[4]: bug#12656: cp since 8.11 corrupts files In-Reply-To: <5083C340.3090000@bernhard-voelker.de> (Bernhard Voelker's message of "Sun, 21 Oct 2012 11:41:20 +0200") References: <876269trm6.fsf@rho.meyering.net> <5083C340.3090000@bernhard-voelker.de> Date: Sun, 21 Oct 2012 11:58:15 +0200 Message-ID: <87pq4c2ll4.fsf@rho.meyering.net> Lines: 60 MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: 0.4 (/) X-Debbugs-Envelope-To: 12656 Cc: m.gerth@avm.de, Alan Curry , 12656@debbugs.gnu.org X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: 0.4 (/) Bernhard Voelker wrote: > On 10/17/2012 10:44 AM, Jim Meyering wrote: ... >> ** Bug fixes >> >> + cp could read from freed memory and could even make corrupt copies. >> + This could happen only with a very fragmented input file and when using >> + its FIEMAP/extent-based copying code. [bug introduced in coreutils-8.11] > > As the bug is in extent-scan.c, doesn't it also affect mv (and ginstall)? > > In src/local.mk: > > copy_sources = \ > src/copy.c \ > src/cp-hash.c \ > src/extent-scan.c \ > src/extent-scan.h > > ... > src_ginstall_SOURCES = src/install.c src/prog-fprintf.c $(copy_sources) > ... > src_cp_SOURCES = src/cp.c $(copy_sources) > ... > src_mv_SOURCES = src/mv.c src/remove.c $(copy_sources) Good point. It does, not just by virtue of linking to copy.c, but because each also enables sparse_mode: $ grep sparse_mode.= src/{mv,install}.c src/mv.c: x->sparse_mode = SPARSE_AUTO; /* FIXME: maybe make this an option */ src/install.c: x->sparse_mode = SPARSE_AUTO; Thanks! >From d001e65bb1f218b7208d65b38e5f854e58a11e62 Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Sun, 21 Oct 2012 11:56:44 +0200 Subject: [PATCH] doc: NEWS: the cp bug affects mv and install, too * NEWS (Bug fixes): Note that the copy-induced corruption affects mv (sometimes) and install, too. Pointed out by Bernhard Voelker. --- NEWS | 1 + 1 file changed, 1 insertion(+) diff --git a/NEWS b/NEWS index 0fc2a94..bbd8f59 100644 --- a/NEWS +++ b/NEWS @@ -15,6 +15,7 @@ GNU coreutils NEWS -*- outline -*- cp could read from freed memory and could even make corrupt copies. This could happen with a very fragmented and sparse input file, on GNU/Linux file systems supporting fiemap extent scanning. + This bug also affects mv when it resorts to copying, and install. [bug introduced in coreutils-8.11] cp --no-preserve=mode now no longer preserves the original file's -- 1.8.0.rc2.11.gd25c58c From debbugs-submit-bounces@debbugs.gnu.org Thu Oct 25 16:00:46 2012 Received: (at control) by debbugs.gnu.org; 25 Oct 2012 20:00:46 +0000 Received: from localhost ([127.0.0.1]:33710 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TRTbi-0006nc-7O for submit@debbugs.gnu.org; Thu, 25 Oct 2012 16:00:46 -0400 Received: from mx.meyering.net ([88.168.87.75]:36296) by debbugs.gnu.org with esmtp (Exim 4.72) (envelope-from ) id 1TRTbf-0006nT-MK for control@debbugs.gnu.org; Thu, 25 Oct 2012 16:00:44 -0400 Received: from hx.meyering.net (hx.meyering.net [192.168.0.33]) by rho.meyering.net (Acme Bit-Twister) with ESMTP id 426A4600EE for ; Thu, 25 Oct 2012 21:58:38 +0200 (CEST) Date: Thu, 25 Oct 2012 21:58:38 +0200 Message-Id: <87pq46gw7l.fsf@hx.meyering.net> To: control@debbugs.gnu.org From: Jim Meyering Subject: control message for bug #12656 X-Spam-Score: 0.1 (/) X-Debbugs-Envelope-To: control X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: debbugs-submit-bounces@debbugs.gnu.org Errors-To: debbugs-submit-bounces@debbugs.gnu.org X-Spam-Score: 0.1 (/) tags 12656 fixed From debbugs-submit-bounces@debbugs.gnu.org Thu Oct 11 18:34:30 2018 Received: (at control) by debbugs.gnu.org; 11 Oct 2018 22:34:30 +0000 Received: from localhost ([127.0.0.1]:45702 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gAjXK-0004zX-B8 for submit@debbugs.gnu.org; Thu, 11 Oct 2018 18:34:30 -0400 Received: from mail-pg1-f182.google.com ([209.85.215.182]:45621) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1gAjXI-0004zL-9d for control@debbugs.gnu.org; Thu, 11 Oct 2018 18:34:28 -0400 Received: by mail-pg1-f182.google.com with SMTP id t70-v6so4828541pgd.12 for ; Thu, 11 Oct 2018 15:34:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=to:from:message-id:date:user-agent:mime-version:content-language :content-transfer-encoding; bh=7apBCEYAVn0WRPO0lUXyhbI1fmL5j8ewFFZTMWbq3yI=; b=toL8k7fQ5KxcbpSCAnSstHi4BG3qCcxWJcN/bt/seLilla0Ue8MSoU9J1v5V6iO3fg Amtg9kpyXCz6IczP+2B5sJYJK3YfFfjxTAGmOxtTrod4ghSW0k15rGSpYxYDiFSlcAsB b+vq/HbVS9N7uvE1FMp1P3qbiMEIDsfLl6k4ET6Al2IcPeFzjjrZ9zwHGa2VJe/ExfXe 3jQYK+A79YMNLDdZUC61eJzXCsccw+t/vFb+7hJkDSgoB+YVi3OxSUwg8JCeiJ7OQyWV 5ZoV8ucVi7kf21B9kSPfhOsY9gPJXdQIdN2I3zwzq+DrwthawKhrBWKjm3NgJcH/itND ft5g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:to:from:message-id:date:user-agent:mime-version :content-language:content-transfer-encoding; bh=7apBCEYAVn0WRPO0lUXyhbI1fmL5j8ewFFZTMWbq3yI=; b=nuSXC9XJQrXagjzp9W7BnUZ1ommpMMtThBjiA0K4nSj9o4WjsFR3A+T1I38yKP0Fzo a80GuqT/kmd2gJ88NlNpMrUnhTux+WSOZT6sFbPjHet1qbxR/kyeBG+9D3hrvi5hSWA0 tPvm9ZgUek97jmNo/HTOyGsYT7L9WvOcTvbZmJCQO76Uela8KzNPYaRgVOQJVzz465na sR7y8GEOE2qoVSBsmVUSe1wlUlBo3OI4XiIlKUgqew8ofHkd3Hl+Mbbx5l67NR2KDA57 ZddvDznKsR+vGLbgzftMTy7UXhlrFIOgqUwKS/fIz34hApKzdH3ed7ALT7sbC92Nk5DQ euZw== X-Gm-Message-State: ABuFfoizOr8B6DzumAK7s/Z8zthjLcrY02/3IwhW8rDQY8Q2vWkcMPwY fJKVbts5ENDLCy3pJZy+ho5ZQXpS X-Google-Smtp-Source: ACcGV60Jjf/wOacofqXbjwl8/obHA6hjNflkUrX7x5s0ygRZTEYhAlGGdhz8FbeEIziWm+tOq6xQvQ== X-Received: by 2002:a62:8910:: with SMTP id v16-v6mr3401359pfd.106.1539297261732; Thu, 11 Oct 2018 15:34:21 -0700 (PDT) Received: from tomato.housegordon.com (moose.housegordon.com. [184.68.105.38]) by smtp.googlemail.com with ESMTPSA id o12-v6sm12147564pgv.7.2018.10.11.15.34.19 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 11 Oct 2018 15:34:20 -0700 (PDT) To: control@debbugs.gnu.org From: Assaf Gordon Message-ID: <9feaab7a-6767-723b-785a-b9e39fa507c7@gmail.com> Date: Thu, 11 Oct 2018 16:34:19 -0600 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit X-Spam-Score: 2.0 (++) X-Spam-Report: Spam detection software, running on the system "debbugs.gnu.org", has NOT identified this incoming email as spam. The original message has been attached to this so you can view it or label similar future email. If you have any questions, see the administrator of that system for details. Content preview: close 12656 tags 8824 moreinfo close 8824 tags 8767 + moreinfo close 8767 [...] Content analysis details: (2.0 points, 10.0 required) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [209.85.215.182 listed in list.dnswl.org] -0.0 SPF_PASS SPF: sender matches SPF record 0.0 FREEMAIL_FROM Sender email is commonly abused enduser mail provider (assafgordon[at]gmail.com) 0.0 RCVD_IN_MSPIKE_H3 RBL: Good reputation (+3) [209.85.215.182 listed in wl.mailspike.net] 1.8 MISSING_SUBJECT Missing Subject: header 0.2 NO_SUBJECT Extra score for no subject 0.0 RCVD_IN_MSPIKE_WL Mailspike good senders X-Debbugs-Envelope-To: control X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: 1.0 (+) close 12656 tags 8824 moreinfo close 8824 tags 8767 + moreinfo close 8767 tags 8736 wontfix close 8736 tags 8700 wontfix close 8700 close 8616 tags 9101 fixed close 9101 retitle 9129 printf: RFE: reject field width larger than INT_MAX tags 9129 notabug close 9129 tags 9140 fixed close 9140 tags 9207 wontfix close 9207 From unknown Tue Jun 17 20:13:44 2025 Received: (at fakecontrol) by fakecontrolmessage; To: internal_control@debbugs.gnu.org From: Debbugs Internal Request Subject: Internal Control Message-Id: bug archived. Date: Fri, 09 Nov 2018 12:24:08 +0000 User-Agent: Fakemail v42.6.9 # This is a fake control message. # # The action: # bug archived. thanks # This fakemail brought to you by your local debbugs # administrator