]>
Commit | Line | Data |
---|---|---|
5d6ede24 MB |
1 | commit 31658355f3937b67f265e45f70eccfe7af668a70 |
2 | Author: Marcin Banasiak <marcin.banasiak@gmail.com> | |
3 | Date: Sun Mar 9 22:16:00 2014 +0100 | |
4 | ||
5 | Ignore paths longer than 255 characters (lp#1288989) | |
6 | ||
7 | Index format used by poldek prevents us from storing paths longer than | |
8 | 255 characters. Changing this behaviour would break backward | |
9 | compatibility, so simply ignore them. | |
10 | ||
11 | diff --git a/pkgdir/pkgdir_dirindex.c b/pkgdir/pkgdir_dirindex.c | |
12 | index abfd05c..3437ee7 100644 | |
13 | --- a/pkgdir/pkgdir_dirindex.c | |
14 | +++ b/pkgdir/pkgdir_dirindex.c | |
15 | @@ -136,6 +136,9 @@ void add_to_path_index(tn_hash *path_index, const char *path, uint32_t package_n | |
16 | unsigned khash = 0; | |
17 | tn_array *keys; | |
18 | ||
19 | + if (strlen(path) > 255) | |
20 | + return; | |
21 | + | |
22 | if ((keys = n_hash_get_ex(path_index, path, &klen, &khash)) == NULL) { | |
23 | keys = n_array_new(16, free, (tn_fn_cmp)strcmp); | |
24 | n_hash_insert_ex(path_index, path, klen, khash, keys); | |
25 | diff --git a/pm/rpm/rpm_pkg_ld.c b/pm/rpm/rpm_pkg_ld.c | |
26 | index 5ae167a..3983693 100644 | |
27 | --- a/pm/rpm/rpm_pkg_ld.c | |
28 | +++ b/pm/rpm/rpm_pkg_ld.c | |
29 | @@ -259,8 +259,9 @@ static int valid_fname(const char *fname, mode_t mode, const char *pkgname) | |
30 | #endif | |
31 | ||
32 | if (strlen(fname) > 255) { | |
33 | - logn(LOGERR, _("%s: %s \"%s\" longer than 255 bytes"), | |
34 | - pkgname, S_ISDIR(mode) ? _("dirname") : _("filename"), fname); | |
35 | + if (poldek_VERBOSE > 1) | |
36 | + logn(LOGWARN, _("%s: skipped %s \"%s\" longer than 255 bytes"), | |
37 | + pkgname, S_ISDIR(mode) ? _("dirname") : _("filename"), fname); | |
38 | return 0; | |
39 | } | |
40 | ||
41 | @@ -335,8 +336,11 @@ int pm_rpm_ldhdr_fl(tn_alloc *na, tn_tuple **fl, | |
42 | struct pkgfl_ent *flent; | |
43 | ||
44 | fentdirs_items[i] = 0; | |
45 | - if (!valid_fname(dirs[i], 0, pkgname)) | |
46 | - nerr++; | |
47 | + if (!valid_fname(dirs[i], 0, pkgname)) { | |
48 | + skipdirs[i] = NULL; | |
49 | + fentdirs[i] = NULL; | |
50 | + continue; | |
51 | + } | |
52 | ||
53 | if (which != PKGFL_ALL) { | |
54 | int is_depdir; | |
55 | @@ -374,7 +378,7 @@ int pm_rpm_ldhdr_fl(tn_alloc *na, tn_tuple **fl, | |
56 | int len; | |
57 | ||
58 | if (!valid_fname(names[i], modes ? modes[i] : 0, pkgname)) | |
59 | - nerr++; | |
60 | + continue; | |
61 | ||
62 | msg(5, " %d: %s %s/%s \n", i, skipdirs[j] ? "add " : "skip", | |
63 | dirs[j], names[i]); | |
026e65b4 MB |
64 | |
65 | diff --git a/pm/rpm/rpm_pkg_ld.c b/pm/rpm/rpm_pkg_ld.c | |
66 | index 3983693..51e339f 100644 | |
67 | --- a/pm/rpm/rpm_pkg_ld.c | |
68 | +++ b/pm/rpm/rpm_pkg_ld.c | |
69 | @@ -277,6 +277,7 @@ int pm_rpm_ldhdr_fl(tn_alloc *na, tn_tuple **fl, | |
70 | int32_t *diridxs; | |
71 | uint32_t *sizes; | |
72 | uint16_t *modes; | |
73 | + size_t *dirslen = NULL; | |
74 | struct flfile *flfile; | |
75 | struct pkgfl_ent **fentdirs = NULL; | |
76 | int *fentdirs_items; | |
77 | @@ -329,11 +330,14 @@ int pm_rpm_ldhdr_fl(tn_alloc *na, tn_tuple **fl, | |
78 | ||
79 | skipdirs = alloca(sizeof(*skipdirs) * c2); | |
80 | fentdirs = alloca(sizeof(*fentdirs) * c2); | |
81 | + dirslen = alloca(sizeof(size_t) * c2); | |
82 | fentdirs_items = alloca(sizeof(*fentdirs_items) * c2); | |
83 | ||
84 | /* skip unneded dirnames */ | |
85 | for (i=0; i<c2; i++) { | |
86 | struct pkgfl_ent *flent; | |
87 | + | |
88 | + dirslen[i] = strlen(dirs[i]); | |
89 | ||
90 | fentdirs_items[i] = 0; | |
91 | if (!valid_fname(dirs[i], 0, pkgname)) { | |
92 | @@ -366,7 +370,7 @@ int pm_rpm_ldhdr_fl(tn_alloc *na, tn_tuple **fl, | |
93 | if (diridxs[j] == i) | |
94 | fentdirs_items[i]++; | |
95 | ||
96 | - flent = pkgfl_ent_new(na, dirs[i], strlen(dirs[i]), fentdirs_items[i]); | |
97 | + flent = pkgfl_ent_new(na, dirs[i], dirslen[i], fentdirs_items[i]); | |
98 | fentdirs[i] = flent; | |
99 | ndirs++; | |
100 | } | |
101 | @@ -388,6 +392,15 @@ int pm_rpm_ldhdr_fl(tn_alloc *na, tn_tuple **fl, | |
102 | ||
103 | flent = fentdirs[j]; | |
104 | len = strlen(names[i]); | |
105 | + | |
106 | + /* FIXME: ignore dirpaths longer then 255 characters lp#1288989 */ | |
107 | + if (S_ISDIR(modes ? modes[i] : 0) && dirslen[j] + len > 254) { | |
108 | + if (poldek_VERBOSE > 1) | |
109 | + logn(LOGWARN, _("%s: skipped dirname \"%s/%s\": longer than 255 bytes"), | |
110 | + pkgname, flent->dirname, names[i]); | |
111 | + continue; | |
112 | + } | |
113 | + | |
114 | if (symlinks) { | |
115 | flfile = flfile_new(na, sizes ? sizes[i] : 0, | |
116 | modes ? modes[i] : 0, |