]>
Commit | Line | Data |
---|---|---|
60a7d3ea JR |
1 | diff -ur rpm-5.4.10/build/files.c rpm-5.4.10-collision/build/files.c |
2 | --- rpm-5.4.10/build/files.c 2013-03-17 13:17:38.233358389 +0100 | |
3 | +++ rpm-5.4.10-collision/build/files.c 2013-03-17 13:07:37.468483625 +0100 | |
4 | @@ -1323,6 +1323,26 @@ | |
5 | return dalgo; | |
6 | } | |
7 | ||
8 | +static int isHardLink(FileListRec flp, FileListRec tlp) | |
9 | +{ | |
10 | + return ((S_ISREG(flp->fl_mode) && S_ISREG(tlp->fl_mode)) && | |
11 | + ((flp->fl_nlink > 1) && (flp->fl_nlink == tlp->fl_nlink)) && | |
12 | + (flp->fl_ino == tlp->fl_ino) && | |
13 | + (flp->fl_dev == tlp->fl_dev)); | |
14 | +} | |
15 | + | |
16 | +static int seenHardLink(FileList fl, FileListRec flp, ino_t *fileid) | |
17 | +{ | |
18 | + FileListRec ilp; | |
19 | + for (ilp = fl->fileList; ilp < flp; ilp++) { | |
20 | + if (isHardLink(flp, ilp)) { | |
21 | + *fileid = ilp - fl->fileList; | |
22 | + return 1; | |
23 | + } | |
24 | + } | |
25 | + return 0; | |
26 | +} | |
27 | + | |
28 | /** | |
29 | * Add file entries to header. | |
30 | * @todo Should directories have %doc/%config attributes? (#14531) | |
31 | @@ -1370,6 +1390,7 @@ | |
32 | ||
33 | for (i = 0, flp = fl->fileList; i < fl->fileListRecsUsed; i++, flp++) { | |
34 | const char *s; | |
35 | + ino_t fileid = flp - fl->fileList; | |
36 | ||
37 | /* Merge duplicate entries. */ | |
38 | while (i < (fl->fileListRecsUsed - 1) && | |
39 | @@ -1437,6 +1458,13 @@ | |
40 | /* Leave room for both dirname and basename NUL's */ | |
41 | dpathlen += (strlen(flp->diskURL) + 2); | |
42 | ||
43 | + /* Excludes and dupes have been filtered out by now. */ | |
44 | + if (S_ISREG(flp->fl_mode)) { | |
45 | + if (flp->fl_nlink == 1 || !seenHardLink(fl, flp, &fileid)) { | |
46 | + fl->totalFileSize += flp->fl_size; | |
47 | + } | |
48 | + } | |
49 | + | |
50 | /* | |
51 | * Make the header, the OLDFILENAMES will get converted to a | |
52 | * compressed file list write before we write the actual package to | |
53 | @@ -1519,7 +1547,11 @@ | |
54 | ||
55 | /* XXX Hash instead of 64b->32b truncate to prevent aliasing. */ | |
56 | { ino_t _ino = flp->fl_ino; | |
57 | - ui32 = hashFunctionString(0, &_ino, sizeof(_ino)); | |
58 | + /* don't use hash here, as hash collisions which happen on large packages | |
59 | + cause bus errors in rpmbuild | |
60 | + ui32 = hashFunctionString(0, &_ino, sizeof(_ino)); | |
61 | + */ | |
62 | + ui32 = fileid + 1; | |
63 | } | |
64 | he->tag = RPMTAG_FILEINODES; | |
65 | he->t = RPM_UINT32_TYPE; | |
66 | @@ -1752,39 +1780,6 @@ | |
67 | IOSM_MAP_TYPE | IOSM_MAP_MODE | IOSM_MAP_UID | IOSM_MAP_GID; | |
68 | if (isSrc) | |
69 | fi->fmapflags[i] |= IOSM_FOLLOW_SYMLINKS; | |
70 | - | |
71 | - if (S_ISREG(flp->fl_mode)) { | |
72 | - int bingo = 1; | |
73 | - /* Hard links need be tallied only once. */ | |
74 | - if (flp->fl_nlink > 1) { | |
75 | - FileListRec jlp = flp + 1; | |
76 | - int j = i + 1; | |
77 | - for (; (unsigned)j < fi->fc; j++, jlp++) { | |
78 | - /* follow outer loop logic */ | |
79 | - while (((jlp - fl->fileList) < (fl->fileListRecsUsed - 1)) && | |
80 | - !strcmp(jlp->fileURL, jlp[1].fileURL)) | |
81 | - jlp++; | |
82 | - if (jlp->flags & RPMFILE_EXCLUDE) { | |
83 | - j--; | |
84 | - /*@innercontinue@*/ continue; | |
85 | - } | |
86 | - if (jlp->flags & RPMFILE_GHOST) | |
87 | - /*@innercontinue@*/ continue; | |
88 | - if (!S_ISREG(jlp->fl_mode)) | |
89 | - /*@innercontinue@*/ continue; | |
90 | - if (flp->fl_nlink != jlp->fl_nlink) | |
91 | - /*@innercontinue@*/ continue; | |
92 | - if (flp->fl_ino != jlp->fl_ino) | |
93 | - /*@innercontinue@*/ continue; | |
94 | - if (flp->fl_dev != jlp->fl_dev) | |
95 | - /*@innercontinue@*/ continue; | |
96 | - bingo = 0; /* don't tally hardlink yet. */ | |
97 | - /*@innerbreak@*/ break; | |
98 | - } | |
99 | - } | |
100 | - if (bingo) | |
101 | - fl->totalFileSize += flp->fl_size; | |
102 | - } | |
103 | } | |
104 | ||
105 | ui32 = fl->totalFileSize; |