1 commit 31658355f3937b67f265e45f70eccfe7af668a70
2 Author: Marcin Banasiak <marcin.banasiak@gmail.com>
3 Date: Sun Mar 9 22:16:00 2014 +0100
5 Ignore paths longer than 255 characters (lp#1288989)
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.
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
19 + if (strlen(path) > 255)
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)
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);
41 @@ -335,8 +336,11 @@ int pm_rpm_ldhdr_fl(tn_alloc *na, tn_tuple **fl,
42 struct pkgfl_ent *flent;
44 fentdirs_items[i] = 0;
45 - if (!valid_fname(dirs[i], 0, pkgname))
47 + if (!valid_fname(dirs[i], 0, pkgname)) {
53 if (which != PKGFL_ALL) {
55 @@ -374,7 +378,7 @@ int pm_rpm_ldhdr_fl(tn_alloc *na, tn_tuple **fl,
58 if (!valid_fname(names[i], modes ? modes[i] : 0, pkgname))
62 msg(5, " %d: %s %s/%s \n", i, skipdirs[j] ? "add " : "skip",
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,
73 + size_t *dirslen = NULL;
74 struct flfile *flfile;
75 struct pkgfl_ent **fentdirs = NULL;
77 @@ -329,11 +330,14 @@ int pm_rpm_ldhdr_fl(tn_alloc *na, tn_tuple **fl,
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);
84 /* skip unneded dirnames */
85 for (i=0; i<c2; i++) {
86 struct pkgfl_ent *flent;
88 + dirslen[i] = strlen(dirs[i]);
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,
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]);
101 @@ -388,6 +392,15 @@ int pm_rpm_ldhdr_fl(tn_alloc *na, tn_tuple **fl,
104 len = strlen(names[i]);
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]);
115 flfile = flfile_new(na, sizes ? sizes[i] : 0,
116 modes ? modes[i] : 0,