blob: c5449efd96d5e67e4024b50b569925f7e7acfa49 [file] [log] [blame]
Miklos Szeredibbb1e542016-12-16 11:02:56 +01001/*
2 * Copyright (C) 2011 Novell Inc.
3 * Copyright (C) 2016 Red Hat, Inc.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 as published by
7 * the Free Software Foundation.
8 */
9
10#include <linux/fs.h>
Ingo Molnar5b825c32017-02-02 17:54:15 +010011#include <linux/cred.h>
Amir Goldstein9ee60ce2017-11-01 10:13:51 +020012#include <linux/ctype.h>
Miklos Szeredibbb1e542016-12-16 11:02:56 +010013#include <linux/namei.h>
14#include <linux/xattr.h>
Miklos Szeredi02b69b22016-12-16 11:02:56 +010015#include <linux/ratelimit.h>
Amir Goldsteina9d01952017-04-30 14:46:31 +030016#include <linux/mount.h>
17#include <linux/exportfs.h>
Miklos Szeredibbb1e542016-12-16 11:02:56 +010018#include "overlayfs.h"
Miklos Szeredibbb1e542016-12-16 11:02:56 +010019
Miklos Szeredie28edc42016-12-16 11:02:56 +010020struct ovl_lookup_data {
21 struct qstr name;
22 bool is_dir;
23 bool opaque;
24 bool stop;
25 bool last;
Miklos Szeredi02b69b22016-12-16 11:02:56 +010026 char *redirect;
Miklos Szeredie28edc42016-12-16 11:02:56 +010027};
Miklos Szeredibbb1e542016-12-16 11:02:56 +010028
Miklos Szeredi02b69b22016-12-16 11:02:56 +010029static int ovl_check_redirect(struct dentry *dentry, struct ovl_lookup_data *d,
30 size_t prelen, const char *post)
31{
32 int res;
33 char *s, *next, *buf = NULL;
34
35 res = vfs_getxattr(dentry, OVL_XATTR_REDIRECT, NULL, 0);
36 if (res < 0) {
37 if (res == -ENODATA || res == -EOPNOTSUPP)
38 return 0;
39 goto fail;
40 }
Michal Hocko0ee931c2017-09-13 16:28:29 -070041 buf = kzalloc(prelen + res + strlen(post) + 1, GFP_KERNEL);
Miklos Szeredi02b69b22016-12-16 11:02:56 +010042 if (!buf)
43 return -ENOMEM;
44
45 if (res == 0)
46 goto invalid;
47
48 res = vfs_getxattr(dentry, OVL_XATTR_REDIRECT, buf, res);
49 if (res < 0)
50 goto fail;
51 if (res == 0)
52 goto invalid;
53 if (buf[0] == '/') {
54 for (s = buf; *s++ == '/'; s = next) {
55 next = strchrnul(s, '/');
56 if (s == next)
57 goto invalid;
58 }
59 } else {
60 if (strchr(buf, '/') != NULL)
61 goto invalid;
62
63 memmove(buf + prelen, buf, res);
64 memcpy(buf, d->name.name, prelen);
65 }
66
67 strcat(buf, post);
68 kfree(d->redirect);
69 d->redirect = buf;
70 d->name.name = d->redirect;
71 d->name.len = strlen(d->redirect);
72
73 return 0;
74
75err_free:
76 kfree(buf);
77 return 0;
78fail:
79 pr_warn_ratelimited("overlayfs: failed to get redirect (%i)\n", res);
80 goto err_free;
81invalid:
82 pr_warn_ratelimited("overlayfs: invalid redirect (%s)\n", buf);
83 goto err_free;
84}
85
Amir Goldsteina9d01952017-04-30 14:46:31 +030086static int ovl_acceptable(void *ctx, struct dentry *dentry)
87{
Amir Goldsteine8f9e5b2018-01-11 11:33:24 +020088 /*
89 * A non-dir origin may be disconnected, which is fine, because
90 * we only need it for its unique inode number.
91 */
92 if (!d_is_dir(dentry))
93 return 1;
94
95 /* Don't decode a deleted empty directory */
96 if (d_unhashed(dentry))
97 return 0;
98
99 /* Check if directory belongs to the layer we are decoding from */
100 return is_subdir(dentry, ((struct vfsmount *)ctx)->mnt_root);
Amir Goldsteina9d01952017-04-30 14:46:31 +0300101}
102
Amir Goldstein2e1a53282017-10-24 15:12:15 +0300103/*
104 * Check validity of an overlay file handle buffer.
105 *
106 * Return 0 for a valid file handle.
107 * Return -ENODATA for "origin unknown".
108 * Return <0 for an invalid file handle.
109 */
Amir Goldstein8556a422018-01-19 01:03:23 +0200110int ovl_check_fh_len(struct ovl_fh *fh, int fh_len)
Amir Goldstein2e1a53282017-10-24 15:12:15 +0300111{
112 if (fh_len < sizeof(struct ovl_fh) || fh_len < fh->len)
113 return -EINVAL;
114
115 if (fh->magic != OVL_FH_MAGIC)
116 return -EINVAL;
117
118 /* Treat larger version and unknown flags as "origin unknown" */
119 if (fh->version > OVL_FH_VERSION || fh->flags & ~OVL_FH_FLAG_ALL)
120 return -ENODATA;
121
122 /* Treat endianness mismatch as "origin unknown" */
123 if (!(fh->flags & OVL_FH_FLAG_ANY_ENDIAN) &&
124 (fh->flags & OVL_FH_FLAG_BIG_ENDIAN) != OVL_FH_FLAG_CPU_ENDIAN)
125 return -ENODATA;
126
127 return 0;
128}
129
Amir Goldstein05122442018-01-11 08:25:32 +0200130static struct ovl_fh *ovl_get_fh(struct dentry *dentry, const char *name)
Amir Goldsteina9d01952017-04-30 14:46:31 +0300131{
Amir Goldstein2e1a53282017-10-24 15:12:15 +0300132 int res, err;
Amir Goldsteina9d01952017-04-30 14:46:31 +0300133 struct ovl_fh *fh = NULL;
Amir Goldsteina9d01952017-04-30 14:46:31 +0300134
Amir Goldstein05122442018-01-11 08:25:32 +0200135 res = vfs_getxattr(dentry, name, NULL, 0);
Amir Goldsteina9d01952017-04-30 14:46:31 +0300136 if (res < 0) {
137 if (res == -ENODATA || res == -EOPNOTSUPP)
138 return NULL;
139 goto fail;
140 }
141 /* Zero size value means "copied up but origin unknown" */
142 if (res == 0)
143 return NULL;
144
Amir Goldstein2e1a53282017-10-24 15:12:15 +0300145 fh = kzalloc(res, GFP_KERNEL);
Amir Goldsteina9d01952017-04-30 14:46:31 +0300146 if (!fh)
147 return ERR_PTR(-ENOMEM);
148
Amir Goldstein05122442018-01-11 08:25:32 +0200149 res = vfs_getxattr(dentry, name, fh, res);
Amir Goldsteina9d01952017-04-30 14:46:31 +0300150 if (res < 0)
151 goto fail;
152
Amir Goldstein2e1a53282017-10-24 15:12:15 +0300153 err = ovl_check_fh_len(fh, res);
154 if (err < 0) {
155 if (err == -ENODATA)
156 goto out;
Amir Goldsteina9d01952017-04-30 14:46:31 +0300157 goto invalid;
Amir Goldstein2e1a53282017-10-24 15:12:15 +0300158 }
Amir Goldsteina9d01952017-04-30 14:46:31 +0300159
Amir Goldstein8b88a2e2017-06-21 15:28:37 +0300160 return fh;
161
162out:
163 kfree(fh);
164 return NULL;
165
166fail:
167 pr_warn_ratelimited("overlayfs: failed to get origin (%i)\n", res);
168 goto out;
169invalid:
170 pr_warn_ratelimited("overlayfs: invalid origin (%*phN)\n", res, fh);
171 goto out;
172}
173
Amir Goldstein8556a422018-01-19 01:03:23 +0200174struct dentry *ovl_decode_fh(struct ovl_fh *fh, struct vfsmount *mnt)
Amir Goldstein8b88a2e2017-06-21 15:28:37 +0300175{
Amir Goldsteine8f9e5b2018-01-11 11:33:24 +0200176 struct dentry *real;
Amir Goldstein8b88a2e2017-06-21 15:28:37 +0300177 int bytes;
178
Amir Goldsteina9d01952017-04-30 14:46:31 +0300179 /*
180 * Make sure that the stored uuid matches the uuid of the lower
181 * layer where file handle will be decoded.
182 */
Christoph Hellwig85787092017-05-10 15:06:33 +0200183 if (!uuid_equal(&fh->uuid, &mnt->mnt_sb->s_uuid))
Amir Goldstein2e1a53282017-10-24 15:12:15 +0300184 return NULL;
Amir Goldsteina9d01952017-04-30 14:46:31 +0300185
Amir Goldstein8b88a2e2017-06-21 15:28:37 +0300186 bytes = (fh->len - offsetof(struct ovl_fh, fid));
Amir Goldsteine8f9e5b2018-01-11 11:33:24 +0200187 real = exportfs_decode_fh(mnt, (struct fid *)fh->fid,
188 bytes >> 2, (int)fh->type,
189 ovl_acceptable, mnt);
190 if (IS_ERR(real)) {
191 /*
192 * Treat stale file handle to lower file as "origin unknown".
193 * upper file handle could become stale when upper file is
194 * unlinked and this information is needed to handle stale
195 * index entries correctly.
196 */
197 if (real == ERR_PTR(-ESTALE) &&
198 !(fh->flags & OVL_FH_FLAG_PATH_UPPER))
199 real = NULL;
200 return real;
Amir Goldsteina9d01952017-04-30 14:46:31 +0300201 }
202
Amir Goldsteine8f9e5b2018-01-11 11:33:24 +0200203 if (ovl_dentry_weird(real)) {
204 dput(real);
Amir Goldstein2e1a53282017-10-24 15:12:15 +0300205 return NULL;
206 }
Amir Goldsteina9d01952017-04-30 14:46:31 +0300207
Amir Goldsteine8f9e5b2018-01-11 11:33:24 +0200208 return real;
Amir Goldsteina9d01952017-04-30 14:46:31 +0300209}
210
Amir Goldsteinee1d6d372017-05-11 16:42:26 +0300211static bool ovl_is_opaquedir(struct dentry *dentry)
212{
213 return ovl_check_dir_xattr(dentry, OVL_XATTR_OPAQUE);
214}
215
Miklos Szeredie28edc42016-12-16 11:02:56 +0100216static int ovl_lookup_single(struct dentry *base, struct ovl_lookup_data *d,
217 const char *name, unsigned int namelen,
Miklos Szeredi02b69b22016-12-16 11:02:56 +0100218 size_t prelen, const char *post,
Miklos Szeredie28edc42016-12-16 11:02:56 +0100219 struct dentry **ret)
220{
221 struct dentry *this;
222 int err;
223
224 this = lookup_one_len_unlocked(name, base, namelen);
225 if (IS_ERR(this)) {
226 err = PTR_ERR(this);
227 this = NULL;
228 if (err == -ENOENT || err == -ENAMETOOLONG)
229 goto out;
230 goto out_err;
231 }
232 if (!this->d_inode)
233 goto put_and_out;
234
235 if (ovl_dentry_weird(this)) {
236 /* Don't support traversing automounts and other weirdness */
237 err = -EREMOTE;
238 goto out_err;
239 }
240 if (ovl_is_whiteout(this)) {
241 d->stop = d->opaque = true;
242 goto put_and_out;
243 }
244 if (!d_can_lookup(this)) {
245 d->stop = true;
246 if (d->is_dir)
247 goto put_and_out;
248 goto out;
249 }
250 d->is_dir = true;
251 if (!d->last && ovl_is_opaquedir(this)) {
252 d->stop = d->opaque = true;
253 goto out;
254 }
Miklos Szeredi02b69b22016-12-16 11:02:56 +0100255 err = ovl_check_redirect(this, d, prelen, post);
256 if (err)
257 goto out_err;
Miklos Szeredie28edc42016-12-16 11:02:56 +0100258out:
259 *ret = this;
260 return 0;
261
262put_and_out:
263 dput(this);
264 this = NULL;
265 goto out;
266
267out_err:
268 dput(this);
269 return err;
270}
271
272static int ovl_lookup_layer(struct dentry *base, struct ovl_lookup_data *d,
273 struct dentry **ret)
274{
Amir Goldstein4c7d0c92017-01-18 15:19:54 +0100275 /* Counting down from the end, since the prefix can change */
276 size_t rem = d->name.len - 1;
Miklos Szeredi02b69b22016-12-16 11:02:56 +0100277 struct dentry *dentry = NULL;
278 int err;
279
Amir Goldstein4c7d0c92017-01-18 15:19:54 +0100280 if (d->name.name[0] != '/')
Miklos Szeredi02b69b22016-12-16 11:02:56 +0100281 return ovl_lookup_single(base, d, d->name.name, d->name.len,
282 0, "", ret);
283
Amir Goldstein4c7d0c92017-01-18 15:19:54 +0100284 while (!IS_ERR_OR_NULL(base) && d_can_lookup(base)) {
285 const char *s = d->name.name + d->name.len - rem;
Miklos Szeredi02b69b22016-12-16 11:02:56 +0100286 const char *next = strchrnul(s, '/');
Amir Goldstein4c7d0c92017-01-18 15:19:54 +0100287 size_t thislen = next - s;
288 bool end = !next[0];
Miklos Szeredi02b69b22016-12-16 11:02:56 +0100289
Amir Goldstein4c7d0c92017-01-18 15:19:54 +0100290 /* Verify we did not go off the rails */
291 if (WARN_ON(s[-1] != '/'))
Miklos Szeredi02b69b22016-12-16 11:02:56 +0100292 return -EIO;
293
Amir Goldstein4c7d0c92017-01-18 15:19:54 +0100294 err = ovl_lookup_single(base, d, s, thislen,
295 d->name.len - rem, next, &base);
Miklos Szeredi02b69b22016-12-16 11:02:56 +0100296 dput(dentry);
297 if (err)
298 return err;
299 dentry = base;
Amir Goldstein4c7d0c92017-01-18 15:19:54 +0100300 if (end)
301 break;
302
303 rem -= thislen + 1;
304
305 if (WARN_ON(rem >= d->name.len))
306 return -EIO;
Miklos Szeredi02b69b22016-12-16 11:02:56 +0100307 }
308 *ret = dentry;
309 return 0;
Miklos Szeredie28edc42016-12-16 11:02:56 +0100310}
311
Amir Goldsteina9d01952017-04-30 14:46:31 +0300312
Amir Goldsteinf9418662018-01-19 21:33:44 +0200313int ovl_check_origin_fh(struct ovl_fs *ofs, struct ovl_fh *fh,
314 struct dentry *upperdentry, struct ovl_path **stackp)
Amir Goldsteina9d01952017-04-30 14:46:31 +0300315{
Amir Goldsteinf7d3dac2017-06-21 15:28:34 +0300316 struct dentry *origin = NULL;
317 int i;
Amir Goldsteina9d01952017-04-30 14:46:31 +0300318
Amir Goldstein1eff1a12017-12-12 22:40:46 +0200319 for (i = 0; i < ofs->numlower; i++) {
320 origin = ovl_decode_fh(fh, ofs->lower_layers[i].mnt);
Amir Goldsteinf7d3dac2017-06-21 15:28:34 +0300321 if (origin)
322 break;
323 }
324
325 if (!origin)
Amir Goldstein2e1a53282017-10-24 15:12:15 +0300326 return -ESTALE;
327 else if (IS_ERR(origin))
328 return PTR_ERR(origin);
Amir Goldsteina9d01952017-04-30 14:46:31 +0300329
Amir Goldsteinf9418662018-01-19 21:33:44 +0200330 if (upperdentry && !ovl_is_whiteout(upperdentry) &&
Amir Goldstein2e1a53282017-10-24 15:12:15 +0300331 ((d_inode(origin)->i_mode ^ d_inode(upperdentry)->i_mode) & S_IFMT))
332 goto invalid;
333
Amir Goldstein415543d2017-06-21 15:28:42 +0300334 if (!*stackp)
Chandan Rajendrab9343632017-07-24 01:57:54 -0500335 *stackp = kmalloc(sizeof(struct ovl_path), GFP_KERNEL);
Amir Goldsteina9d01952017-04-30 14:46:31 +0300336 if (!*stackp) {
337 dput(origin);
338 return -ENOMEM;
339 }
Amir Goldstein1eff1a12017-12-12 22:40:46 +0200340 **stackp = (struct ovl_path){
341 .dentry = origin,
342 .layer = &ofs->lower_layers[i]
343 };
Amir Goldsteina9d01952017-04-30 14:46:31 +0300344
345 return 0;
Amir Goldstein2e1a53282017-10-24 15:12:15 +0300346
347invalid:
348 pr_warn_ratelimited("overlayfs: invalid origin (%pd2, ftype=%x, origin ftype=%x).\n",
349 upperdentry, d_inode(upperdentry)->i_mode & S_IFMT,
350 d_inode(origin)->i_mode & S_IFMT);
351 dput(origin);
352 return -EIO;
353}
354
Amir Goldstein1eff1a12017-12-12 22:40:46 +0200355static int ovl_check_origin(struct ovl_fs *ofs, struct dentry *upperdentry,
Amir Goldstein2e1a53282017-10-24 15:12:15 +0300356 struct ovl_path **stackp, unsigned int *ctrp)
357{
Amir Goldstein05122442018-01-11 08:25:32 +0200358 struct ovl_fh *fh = ovl_get_fh(upperdentry, OVL_XATTR_ORIGIN);
Amir Goldstein2e1a53282017-10-24 15:12:15 +0300359 int err;
360
361 if (IS_ERR_OR_NULL(fh))
362 return PTR_ERR(fh);
363
Amir Goldstein1eff1a12017-12-12 22:40:46 +0200364 err = ovl_check_origin_fh(ofs, fh, upperdentry, stackp);
Amir Goldstein2e1a53282017-10-24 15:12:15 +0300365 kfree(fh);
366
367 if (err) {
368 if (err == -ESTALE)
369 return 0;
370 return err;
371 }
372
373 if (WARN_ON(*ctrp))
374 return -EIO;
375
376 *ctrp = 1;
377 return 0;
Amir Goldsteina9d01952017-04-30 14:46:31 +0300378}
379
Miklos Szeredibbb1e542016-12-16 11:02:56 +0100380/*
Amir Goldstein05122442018-01-11 08:25:32 +0200381 * Verify that @fh matches the file handle stored in xattr @name.
Amir Goldstein8b88a2e2017-06-21 15:28:37 +0300382 * Return 0 on match, -ESTALE on mismatch, < 0 on error.
383 */
Amir Goldstein05122442018-01-11 08:25:32 +0200384static int ovl_verify_fh(struct dentry *dentry, const char *name,
385 const struct ovl_fh *fh)
Amir Goldstein8b88a2e2017-06-21 15:28:37 +0300386{
Amir Goldstein05122442018-01-11 08:25:32 +0200387 struct ovl_fh *ofh = ovl_get_fh(dentry, name);
Amir Goldstein8b88a2e2017-06-21 15:28:37 +0300388 int err = 0;
389
390 if (!ofh)
391 return -ENODATA;
392
393 if (IS_ERR(ofh))
394 return PTR_ERR(ofh);
395
396 if (fh->len != ofh->len || memcmp(fh, ofh, fh->len))
397 err = -ESTALE;
398
399 kfree(ofh);
400 return err;
401}
402
403/*
Amir Goldstein05122442018-01-11 08:25:32 +0200404 * Verify that @real dentry matches the file handle stored in xattr @name.
Amir Goldstein8b88a2e2017-06-21 15:28:37 +0300405 *
Amir Goldstein05122442018-01-11 08:25:32 +0200406 * If @set is true and there is no stored file handle, encode @real and store
407 * file handle in xattr @name.
Amir Goldstein8b88a2e2017-06-21 15:28:37 +0300408 *
Amir Goldstein05122442018-01-11 08:25:32 +0200409 * Return 0 on match, -ESTALE on mismatch, -ENODATA on no xattr, < 0 on error.
Amir Goldstein8b88a2e2017-06-21 15:28:37 +0300410 */
Amir Goldstein05122442018-01-11 08:25:32 +0200411int ovl_verify_set_fh(struct dentry *dentry, const char *name,
412 struct dentry *real, bool is_upper, bool set)
Amir Goldstein8b88a2e2017-06-21 15:28:37 +0300413{
414 struct inode *inode;
415 struct ovl_fh *fh;
416 int err;
417
Amir Goldstein05122442018-01-11 08:25:32 +0200418 fh = ovl_encode_fh(real, is_upper);
Amir Goldstein8b88a2e2017-06-21 15:28:37 +0300419 err = PTR_ERR(fh);
420 if (IS_ERR(fh))
421 goto fail;
422
Amir Goldstein05122442018-01-11 08:25:32 +0200423 err = ovl_verify_fh(dentry, name, fh);
Amir Goldstein8b88a2e2017-06-21 15:28:37 +0300424 if (set && err == -ENODATA)
Amir Goldstein05122442018-01-11 08:25:32 +0200425 err = ovl_do_setxattr(dentry, name, fh, fh->len, 0);
Amir Goldstein8b88a2e2017-06-21 15:28:37 +0300426 if (err)
427 goto fail;
428
429out:
430 kfree(fh);
431 return err;
432
433fail:
Amir Goldstein05122442018-01-11 08:25:32 +0200434 inode = d_inode(real);
435 pr_warn_ratelimited("overlayfs: failed to verify %s (%pd2, ino=%lu, err=%i)\n",
436 is_upper ? "upper" : "origin", real,
437 inode ? inode->i_ino : 0, err);
Amir Goldstein8b88a2e2017-06-21 15:28:37 +0300438 goto out;
439}
440
Amir Goldsteine8f9e5b2018-01-11 11:33:24 +0200441/* Get upper dentry from index */
Amir Goldstein3b0bfc62017-12-24 18:42:16 +0200442struct dentry *ovl_index_upper(struct ovl_fs *ofs, struct dentry *index)
Amir Goldsteine8f9e5b2018-01-11 11:33:24 +0200443{
444 struct ovl_fh *fh;
445 struct dentry *upper;
446
447 if (!d_is_dir(index))
448 return dget(index);
449
450 fh = ovl_get_fh(index, OVL_XATTR_UPPER);
451 if (IS_ERR_OR_NULL(fh))
452 return ERR_CAST(fh);
453
454 upper = ovl_decode_fh(fh, ofs->upper_mnt);
455 kfree(fh);
456
457 if (IS_ERR_OR_NULL(upper))
458 return upper ?: ERR_PTR(-ESTALE);
459
460 if (!d_is_dir(upper)) {
461 pr_warn_ratelimited("overlayfs: invalid index upper (%pd2, upper=%pd2).\n",
462 index, upper);
463 dput(upper);
464 return ERR_PTR(-EIO);
465 }
466
467 return upper;
468}
469
Amir Goldstein9ee60ce2017-11-01 10:13:51 +0200470/* Is this a leftover from create/whiteout of directory index entry? */
471static bool ovl_is_temp_index(struct dentry *index)
472{
473 return index->d_name.name[0] == '#';
474}
475
Amir Goldstein8b88a2e2017-06-21 15:28:37 +0300476/*
Amir Goldstein415543d2017-06-21 15:28:42 +0300477 * Verify that an index entry name matches the origin file handle stored in
478 * OVL_XATTR_ORIGIN and that origin file handle can be decoded to lower path.
479 * Return 0 on match, -ESTALE on mismatch or stale origin, < 0 on error.
480 */
Amir Goldstein1eff1a12017-12-12 22:40:46 +0200481int ovl_verify_index(struct ovl_fs *ofs, struct dentry *index)
Amir Goldstein415543d2017-06-21 15:28:42 +0300482{
483 struct ovl_fh *fh = NULL;
484 size_t len;
Chandan Rajendrab9343632017-07-24 01:57:54 -0500485 struct ovl_path origin = { };
486 struct ovl_path *stack = &origin;
Amir Goldsteine8f9e5b2018-01-11 11:33:24 +0200487 struct dentry *upper = NULL;
Amir Goldstein415543d2017-06-21 15:28:42 +0300488 int err;
489
490 if (!d_inode(index))
491 return 0;
492
Amir Goldstein9ee60ce2017-11-01 10:13:51 +0200493 /* Cleanup leftover from index create/cleanup attempt */
494 err = -ESTALE;
495 if (ovl_is_temp_index(index))
496 goto fail;
497
Amir Goldsteinfa0096e2017-10-24 12:24:11 +0300498 err = -EINVAL;
Amir Goldstein415543d2017-06-21 15:28:42 +0300499 if (index->d_name.len < sizeof(struct ovl_fh)*2)
500 goto fail;
501
502 err = -ENOMEM;
503 len = index->d_name.len / 2;
Michal Hocko0ee931c2017-09-13 16:28:29 -0700504 fh = kzalloc(len, GFP_KERNEL);
Amir Goldstein415543d2017-06-21 15:28:42 +0300505 if (!fh)
506 goto fail;
507
508 err = -EINVAL;
Amir Goldstein2e1a53282017-10-24 15:12:15 +0300509 if (hex2bin((u8 *)fh, index->d_name.name, len))
510 goto fail;
511
512 err = ovl_check_fh_len(fh, len);
513 if (err)
Amir Goldstein415543d2017-06-21 15:28:42 +0300514 goto fail;
515
Amir Goldstein7db25d32018-01-11 11:03:13 +0200516 /*
517 * Whiteout index entries are used as an indication that an exported
518 * overlay file handle should be treated as stale (i.e. after unlink
519 * of the overlay inode). These entries contain no origin xattr.
520 */
521 if (ovl_is_whiteout(index))
522 goto out;
523
Amir Goldsteine8f9e5b2018-01-11 11:33:24 +0200524 /*
525 * Verifying directory index entries are not stale is expensive, so
526 * only verify stale dir index if NFS export is enabled.
527 */
528 if (d_is_dir(index) && !ofs->config.nfs_export)
529 goto out;
530
531 /*
532 * Directory index entries should have 'upper' xattr pointing to the
533 * real upper dir. Non-dir index entries are hardlinks to the upper
534 * real inode. For non-dir index, we can read the copy up origin xattr
535 * directly from the index dentry, but for dir index we first need to
536 * decode the upper directory.
537 */
538 upper = ovl_index_upper(ofs, index);
539 if (IS_ERR_OR_NULL(upper)) {
540 err = PTR_ERR(upper);
Amir Goldstein24f0b172018-01-11 15:33:51 +0200541 /*
542 * Directory index entries with no 'upper' xattr need to be
543 * removed. When dir index entry has a stale 'upper' xattr,
544 * we assume that upper dir was removed and we treat the dir
545 * index as orphan entry that needs to be whited out.
546 */
547 if (err == -ESTALE)
548 goto orphan;
549 else if (!err)
Amir Goldsteine8f9e5b2018-01-11 11:33:24 +0200550 err = -ESTALE;
551 goto fail;
552 }
553
554 err = ovl_verify_fh(upper, OVL_XATTR_ORIGIN, fh);
555 dput(upper);
Amir Goldstein415543d2017-06-21 15:28:42 +0300556 if (err)
557 goto fail;
558
Amir Goldsteine8f9e5b2018-01-11 11:33:24 +0200559 /* Check if non-dir index is orphan and don't warn before cleaning it */
560 if (!d_is_dir(index) && d_inode(index)->i_nlink == 1) {
561 err = ovl_check_origin_fh(ofs, fh, index, &stack);
562 if (err)
563 goto fail;
Amir Goldstein415543d2017-06-21 15:28:42 +0300564
Amir Goldsteine8f9e5b2018-01-11 11:33:24 +0200565 if (ovl_get_nlink(origin.dentry, index, 0) == 0)
Amir Goldstein24f0b172018-01-11 15:33:51 +0200566 goto orphan;
Amir Goldsteine8f9e5b2018-01-11 11:33:24 +0200567 }
Amir Goldsteincaf70cb2017-06-21 13:46:12 +0300568
Amir Goldstein415543d2017-06-21 15:28:42 +0300569out:
Amir Goldsteine8f9e5b2018-01-11 11:33:24 +0200570 dput(origin.dentry);
Amir Goldstein415543d2017-06-21 15:28:42 +0300571 kfree(fh);
572 return err;
573
574fail:
Amir Goldstein61b67472017-07-18 21:07:42 +0300575 pr_warn_ratelimited("overlayfs: failed to verify index (%pd2, ftype=%x, err=%i)\n",
576 index, d_inode(index)->i_mode & S_IFMT, err);
Amir Goldstein415543d2017-06-21 15:28:42 +0300577 goto out;
Amir Goldstein24f0b172018-01-11 15:33:51 +0200578
579orphan:
580 pr_warn_ratelimited("overlayfs: orphan index entry (%pd2, ftype=%x, nlink=%u)\n",
581 index, d_inode(index)->i_mode & S_IFMT,
582 d_inode(index)->i_nlink);
583 err = -ENOENT;
584 goto out;
Amir Goldstein415543d2017-06-21 15:28:42 +0300585}
586
Amir Goldstein91ffe7b2017-12-28 20:23:05 +0200587static int ovl_get_index_name_fh(struct ovl_fh *fh, struct qstr *name)
588{
589 char *n, *s;
590
591 n = kzalloc(fh->len * 2, GFP_KERNEL);
592 if (!n)
593 return -ENOMEM;
594
595 s = bin2hex(n, fh, fh->len);
596 *name = (struct qstr) QSTR_INIT(n, s - n);
597
598 return 0;
599
600}
601
Amir Goldstein415543d2017-06-21 15:28:42 +0300602/*
Amir Goldstein359f3922017-06-21 15:28:41 +0300603 * Lookup in indexdir for the index entry of a lower real inode or a copy up
604 * origin inode. The index entry name is the hex representation of the lower
605 * inode file handle.
606 *
607 * If the index dentry in negative, then either no lower aliases have been
608 * copied up yet, or aliases have been copied up in older kernels and are
609 * not indexed.
610 *
611 * If the index dentry for a copy up origin inode is positive, but points
612 * to an inode different than the upper inode, then either the upper inode
613 * has been copied up and not indexed or it was indexed, but since then
614 * index dir was cleared. Either way, that index cannot be used to indentify
615 * the overlay inode.
616 */
617int ovl_get_index_name(struct dentry *origin, struct qstr *name)
618{
Amir Goldstein359f3922017-06-21 15:28:41 +0300619 struct ovl_fh *fh;
Amir Goldstein91ffe7b2017-12-28 20:23:05 +0200620 int err;
Amir Goldstein359f3922017-06-21 15:28:41 +0300621
622 fh = ovl_encode_fh(origin, false);
623 if (IS_ERR(fh))
624 return PTR_ERR(fh);
625
Amir Goldstein91ffe7b2017-12-28 20:23:05 +0200626 err = ovl_get_index_name_fh(fh, name);
627
Amir Goldstein359f3922017-06-21 15:28:41 +0300628 kfree(fh);
Amir Goldstein359f3922017-06-21 15:28:41 +0300629 return err;
Amir Goldstein91ffe7b2017-12-28 20:23:05 +0200630}
Amir Goldstein359f3922017-06-21 15:28:41 +0300631
Amir Goldstein91ffe7b2017-12-28 20:23:05 +0200632/* Lookup index by file handle for NFS export */
633struct dentry *ovl_get_index_fh(struct ovl_fs *ofs, struct ovl_fh *fh)
634{
635 struct dentry *index;
636 struct qstr name;
637 int err;
638
639 err = ovl_get_index_name_fh(fh, &name);
640 if (err)
641 return ERR_PTR(err);
642
643 index = lookup_one_len_unlocked(name.name, ofs->indexdir, name.len);
644 kfree(name.name);
645 if (IS_ERR(index)) {
646 if (PTR_ERR(index) == -ENOENT)
647 index = NULL;
648 return index;
649 }
650
651 if (d_is_negative(index))
652 err = 0;
653 else if (ovl_is_whiteout(index))
654 err = -ESTALE;
655 else if (ovl_dentry_weird(index))
656 err = -EIO;
657 else
658 return index;
659
660 dput(index);
661 return ERR_PTR(err);
Amir Goldstein359f3922017-06-21 15:28:41 +0300662}
663
Amir Goldstein06170152018-01-17 14:40:27 +0200664struct dentry *ovl_lookup_index(struct ovl_fs *ofs, struct dentry *upper,
665 struct dentry *origin, bool verify)
Amir Goldstein359f3922017-06-21 15:28:41 +0300666{
Amir Goldstein359f3922017-06-21 15:28:41 +0300667 struct dentry *index;
668 struct inode *inode;
669 struct qstr name;
Amir Goldsteinad1d6152018-01-11 10:47:03 +0200670 bool is_dir = d_is_dir(origin);
Amir Goldstein359f3922017-06-21 15:28:41 +0300671 int err;
672
673 err = ovl_get_index_name(origin, &name);
674 if (err)
675 return ERR_PTR(err);
676
677 index = lookup_one_len_unlocked(name.name, ofs->indexdir, name.len);
678 if (IS_ERR(index)) {
Amir Goldsteine0082a02017-09-24 13:01:35 +0300679 err = PTR_ERR(index);
Amir Goldstein7937a562017-10-20 17:19:06 +0300680 if (err == -ENOENT) {
681 index = NULL;
682 goto out;
683 }
Amir Goldstein359f3922017-06-21 15:28:41 +0300684 pr_warn_ratelimited("overlayfs: failed inode index lookup (ino=%lu, key=%*s, err=%i);\n"
685 "overlayfs: mount with '-o index=off' to disable inodes index.\n",
686 d_inode(origin)->i_ino, name.len, name.name,
687 err);
688 goto out;
689 }
690
Amir Goldstein0e082552017-07-18 21:07:43 +0300691 inode = d_inode(index);
Amir Goldstein359f3922017-06-21 15:28:41 +0300692 if (d_is_negative(index)) {
Amir Goldstein6eaf0112017-10-12 19:03:04 +0300693 goto out_dput;
Amir Goldstein06170152018-01-17 14:40:27 +0200694 } else if (ovl_is_whiteout(index) && !verify) {
695 /*
696 * When index lookup is called with !verify for decoding an
697 * overlay file handle, a whiteout index implies that decode
698 * should treat file handle as stale and no need to print a
699 * warning about it.
700 */
701 dput(index);
702 index = ERR_PTR(-ESTALE);
703 goto out;
Amir Goldstein0e082552017-07-18 21:07:43 +0300704 } else if (ovl_dentry_weird(index) || ovl_is_whiteout(index) ||
705 ((inode->i_mode ^ d_inode(origin)->i_mode) & S_IFMT)) {
706 /*
707 * Index should always be of the same file type as origin
708 * except for the case of a whiteout index. A whiteout
709 * index should only exist if all lower aliases have been
710 * unlinked, which means that finding a lower origin on lookup
711 * whose index is a whiteout should be treated as an error.
712 */
713 pr_warn_ratelimited("overlayfs: bad index found (index=%pd2, ftype=%x, origin ftype=%x).\n",
714 index, d_inode(index)->i_mode & S_IFMT,
715 d_inode(origin)->i_mode & S_IFMT);
Amir Goldstein359f3922017-06-21 15:28:41 +0300716 goto fail;
Amir Goldstein06170152018-01-17 14:40:27 +0200717 } else if (is_dir && verify) {
Amir Goldsteinad1d6152018-01-11 10:47:03 +0200718 if (!upper) {
719 pr_warn_ratelimited("overlayfs: suspected uncovered redirected dir found (origin=%pd2, index=%pd2).\n",
720 origin, index);
721 goto fail;
722 }
Amir Goldstein359f3922017-06-21 15:28:41 +0300723
Amir Goldsteinad1d6152018-01-11 10:47:03 +0200724 /* Verify that dir index 'upper' xattr points to upper dir */
725 err = ovl_verify_upper(index, upper, false);
726 if (err) {
727 if (err == -ESTALE) {
728 pr_warn_ratelimited("overlayfs: suspected multiply redirected dir found (upper=%pd2, origin=%pd2, index=%pd2).\n",
729 upper, origin, index);
730 }
731 goto fail;
732 }
733 } else if (upper && d_inode(upper) != inode) {
734 goto out_dput;
735 }
Amir Goldstein359f3922017-06-21 15:28:41 +0300736out:
737 kfree(name.name);
738 return index;
739
Amir Goldstein6eaf0112017-10-12 19:03:04 +0300740out_dput:
741 dput(index);
742 index = NULL;
743 goto out;
744
Amir Goldstein359f3922017-06-21 15:28:41 +0300745fail:
746 dput(index);
747 index = ERR_PTR(-EIO);
748 goto out;
749}
750
751/*
Miklos Szeredibbb1e542016-12-16 11:02:56 +0100752 * Returns next layer in stack starting from top.
753 * Returns -1 if this is the last layer.
754 */
755int ovl_path_next(int idx, struct dentry *dentry, struct path *path)
756{
757 struct ovl_entry *oe = dentry->d_fsdata;
758
759 BUG_ON(idx < 0);
760 if (idx == 0) {
761 ovl_path_upper(dentry, path);
762 if (path->dentry)
763 return oe->numlower ? 1 : -1;
764 idx++;
765 }
766 BUG_ON(idx > oe->numlower);
Chandan Rajendrab9343632017-07-24 01:57:54 -0500767 path->dentry = oe->lowerstack[idx - 1].dentry;
768 path->mnt = oe->lowerstack[idx - 1].layer->mnt;
Miklos Szeredibbb1e542016-12-16 11:02:56 +0100769
770 return (idx < oe->numlower) ? idx + 1 : -1;
771}
772
Amir Goldstein9678e632018-01-03 19:34:45 +0200773/* Fix missing 'origin' xattr */
774static int ovl_fix_origin(struct dentry *dentry, struct dentry *lower,
775 struct dentry *upper)
776{
777 int err;
778
779 if (ovl_check_origin_xattr(upper))
780 return 0;
781
782 err = ovl_want_write(dentry);
783 if (err)
784 return err;
785
786 err = ovl_set_origin(dentry, lower, upper);
787 if (!err)
788 err = ovl_set_impure(dentry->d_parent, upper->d_parent);
789
790 ovl_drop_write(dentry);
791 return err;
792}
793
Miklos Szeredibbb1e542016-12-16 11:02:56 +0100794struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry,
795 unsigned int flags)
796{
797 struct ovl_entry *oe;
798 const struct cred *old_cred;
Miklos Szeredi6b2d5fe2016-12-16 11:02:56 +0100799 struct ovl_fs *ofs = dentry->d_sb->s_fs_info;
Miklos Szeredibbb1e542016-12-16 11:02:56 +0100800 struct ovl_entry *poe = dentry->d_parent->d_fsdata;
Amir Goldsteinc22205d2017-04-26 23:40:52 +0300801 struct ovl_entry *roe = dentry->d_sb->s_root->d_fsdata;
Chandan Rajendrab9343632017-07-24 01:57:54 -0500802 struct ovl_path *stack = NULL;
Miklos Szeredibbb1e542016-12-16 11:02:56 +0100803 struct dentry *upperdir, *upperdentry = NULL;
Amir Goldsteinad1d6152018-01-11 10:47:03 +0200804 struct dentry *origin = NULL;
Amir Goldstein359f3922017-06-21 15:28:41 +0300805 struct dentry *index = NULL;
Miklos Szeredibbb1e542016-12-16 11:02:56 +0100806 unsigned int ctr = 0;
807 struct inode *inode = NULL;
808 bool upperopaque = false;
Miklos Szeredi02b69b22016-12-16 11:02:56 +0100809 char *upperredirect = NULL;
Miklos Szeredibbb1e542016-12-16 11:02:56 +0100810 struct dentry *this;
811 unsigned int i;
812 int err;
Miklos Szeredie28edc42016-12-16 11:02:56 +0100813 struct ovl_lookup_data d = {
814 .name = dentry->d_name,
815 .is_dir = false,
816 .opaque = false,
817 .stop = false,
818 .last = !poe->numlower,
Miklos Szeredi02b69b22016-12-16 11:02:56 +0100819 .redirect = NULL,
Miklos Szeredie28edc42016-12-16 11:02:56 +0100820 };
Miklos Szeredibbb1e542016-12-16 11:02:56 +0100821
Miklos Szeredi6b2d5fe2016-12-16 11:02:56 +0100822 if (dentry->d_name.len > ofs->namelen)
823 return ERR_PTR(-ENAMETOOLONG);
824
Miklos Szeredibbb1e542016-12-16 11:02:56 +0100825 old_cred = ovl_override_creds(dentry->d_sb);
Miklos Szeredi09d8b582017-07-04 22:03:16 +0200826 upperdir = ovl_dentry_upper(dentry->d_parent);
Miklos Szeredibbb1e542016-12-16 11:02:56 +0100827 if (upperdir) {
Miklos Szeredie28edc42016-12-16 11:02:56 +0100828 err = ovl_lookup_layer(upperdir, &d, &upperdentry);
829 if (err)
Miklos Szeredibbb1e542016-12-16 11:02:56 +0100830 goto out;
831
Miklos Szeredie28edc42016-12-16 11:02:56 +0100832 if (upperdentry && unlikely(ovl_dentry_remote(upperdentry))) {
833 dput(upperdentry);
834 err = -EREMOTE;
835 goto out;
Miklos Szeredibbb1e542016-12-16 11:02:56 +0100836 }
Amir Goldsteina9d01952017-04-30 14:46:31 +0300837 if (upperdentry && !d.is_dir) {
838 BUG_ON(!d.stop || d.redirect);
Amir Goldsteinf7d3dac2017-06-21 15:28:34 +0300839 /*
840 * Lookup copy up origin by decoding origin file handle.
841 * We may get a disconnected dentry, which is fine,
842 * because we only need to hold the origin inode in
843 * cache and use its inode number. We may even get a
844 * connected dentry, that is not under any of the lower
845 * layers root. That is also fine for using it's inode
846 * number - it's the same as if we held a reference
847 * to a dentry in lower layer that was moved under us.
848 */
Amir Goldstein1eff1a12017-12-12 22:40:46 +0200849 err = ovl_check_origin(ofs, upperdentry, &stack, &ctr);
Amir Goldsteina9d01952017-04-30 14:46:31 +0300850 if (err)
Vivek Goyal5455f922017-11-01 15:37:22 -0400851 goto out_put_upper;
Amir Goldsteina9d01952017-04-30 14:46:31 +0300852 }
Miklos Szeredi02b69b22016-12-16 11:02:56 +0100853
854 if (d.redirect) {
Dan Carpenter0ce5cdc2017-09-22 23:45:18 +0300855 err = -ENOMEM;
Miklos Szeredi02b69b22016-12-16 11:02:56 +0100856 upperredirect = kstrdup(d.redirect, GFP_KERNEL);
857 if (!upperredirect)
858 goto out_put_upper;
859 if (d.redirect[0] == '/')
Amir Goldsteinc22205d2017-04-26 23:40:52 +0300860 poe = roe;
Miklos Szeredi02b69b22016-12-16 11:02:56 +0100861 }
Miklos Szeredie28edc42016-12-16 11:02:56 +0100862 upperopaque = d.opaque;
Miklos Szeredibbb1e542016-12-16 11:02:56 +0100863 }
864
Miklos Szeredie28edc42016-12-16 11:02:56 +0100865 if (!d.stop && poe->numlower) {
Miklos Szeredibbb1e542016-12-16 11:02:56 +0100866 err = -ENOMEM;
Chandan Rajendrab9343632017-07-24 01:57:54 -0500867 stack = kcalloc(ofs->numlower, sizeof(struct ovl_path),
Michal Hocko0ee931c2017-09-13 16:28:29 -0700868 GFP_KERNEL);
Miklos Szeredibbb1e542016-12-16 11:02:56 +0100869 if (!stack)
870 goto out_put_upper;
871 }
872
Miklos Szeredie28edc42016-12-16 11:02:56 +0100873 for (i = 0; !d.stop && i < poe->numlower; i++) {
Chandan Rajendrab9343632017-07-24 01:57:54 -0500874 struct ovl_path lower = poe->lowerstack[i];
Miklos Szeredibbb1e542016-12-16 11:02:56 +0100875
Miklos Szeredie28edc42016-12-16 11:02:56 +0100876 d.last = i == poe->numlower - 1;
Chandan Rajendrab9343632017-07-24 01:57:54 -0500877 err = ovl_lookup_layer(lower.dentry, &d, &this);
Miklos Szeredie28edc42016-12-16 11:02:56 +0100878 if (err)
Miklos Szeredibbb1e542016-12-16 11:02:56 +0100879 goto out_put;
Miklos Szeredi6b2d5fe2016-12-16 11:02:56 +0100880
Miklos Szeredibbb1e542016-12-16 11:02:56 +0100881 if (!this)
882 continue;
Miklos Szeredibbb1e542016-12-16 11:02:56 +0100883
Amir Goldstein9678e632018-01-03 19:34:45 +0200884 /*
885 * If no origin fh is stored in upper of a merge dir, store fh
886 * of lower dir and set upper parent "impure".
887 */
888 if (upperdentry && !ctr && !ofs->noxattr) {
889 err = ovl_fix_origin(dentry, this, upperdentry);
890 if (err) {
891 dput(this);
892 goto out_put;
893 }
894 }
895
Amir Goldstein37b129162018-01-10 22:29:38 +0200896 /*
897 * When "verify_lower" feature is enabled, do not merge with a
Amir Goldsteinad1d6152018-01-11 10:47:03 +0200898 * lower dir that does not match a stored origin xattr. In any
899 * case, only verified origin is used for index lookup.
Amir Goldstein37b129162018-01-10 22:29:38 +0200900 */
901 if (upperdentry && !ctr && ovl_verify_lower(dentry->d_sb)) {
902 err = ovl_verify_origin(upperdentry, this, false);
903 if (err) {
904 dput(this);
905 break;
906 }
Amir Goldsteinad1d6152018-01-11 10:47:03 +0200907
908 /* Bless lower dir as verified origin */
909 origin = this;
Amir Goldstein37b129162018-01-10 22:29:38 +0200910 }
911
Miklos Szeredibbb1e542016-12-16 11:02:56 +0100912 stack[ctr].dentry = this;
Chandan Rajendrab9343632017-07-24 01:57:54 -0500913 stack[ctr].layer = lower.layer;
Miklos Szeredibbb1e542016-12-16 11:02:56 +0100914 ctr++;
Miklos Szeredi02b69b22016-12-16 11:02:56 +0100915
916 if (d.stop)
917 break;
918
Miklos Szeredi438c84c2017-12-11 11:28:10 +0100919 /*
920 * Following redirects can have security consequences: it's like
921 * a symlink into the lower layer without the permission checks.
922 * This is only a problem if the upper layer is untrusted (e.g
923 * comes from an USB drive). This can allow a non-readable file
924 * or directory to become readable.
925 *
926 * Only following redirects when redirects are enabled disables
927 * this attack vector when not necessary.
928 */
929 err = -EPERM;
930 if (d.redirect && !ofs->config.redirect_follow) {
Amir Goldsteinf8167812017-12-18 14:25:56 +0200931 pr_warn_ratelimited("overlayfs: refusing to follow redirect for (%pd2)\n",
932 dentry);
Miklos Szeredi438c84c2017-12-11 11:28:10 +0100933 goto out_put;
934 }
935
Amir Goldsteinc22205d2017-04-26 23:40:52 +0300936 if (d.redirect && d.redirect[0] == '/' && poe != roe) {
937 poe = roe;
Miklos Szeredi02b69b22016-12-16 11:02:56 +0100938 /* Find the current layer on the root dentry */
Amir Goldsteind583ed72017-11-08 19:23:36 +0200939 i = lower.layer->idx - 1;
Miklos Szeredi02b69b22016-12-16 11:02:56 +0100940 }
Miklos Szeredibbb1e542016-12-16 11:02:56 +0100941 }
942
Amir Goldsteinad1d6152018-01-11 10:47:03 +0200943 /*
944 * Lookup index by lower inode and verify it matches upper inode.
945 * We only trust dir index if we verified that lower dir matches
946 * origin, otherwise dir index entries may be inconsistent and we
947 * ignore them. Always lookup index of non-dir and non-upper.
948 */
949 if (ctr && (!upperdentry || !d.is_dir))
950 origin = stack[0].dentry;
Amir Goldstein359f3922017-06-21 15:28:41 +0300951
Amir Goldsteinad1d6152018-01-11 10:47:03 +0200952 if (origin && ovl_indexdir(dentry->d_sb) &&
953 (!d.is_dir || ovl_index_all(dentry->d_sb))) {
Amir Goldstein06170152018-01-17 14:40:27 +0200954 index = ovl_lookup_index(ofs, upperdentry, origin, true);
Amir Goldstein359f3922017-06-21 15:28:41 +0300955 if (IS_ERR(index)) {
956 err = PTR_ERR(index);
957 index = NULL;
958 goto out_put;
959 }
960 }
961
Miklos Szeredibbb1e542016-12-16 11:02:56 +0100962 oe = ovl_alloc_entry(ctr);
963 err = -ENOMEM;
964 if (!oe)
965 goto out_put;
966
Chandan Rajendrab9343632017-07-24 01:57:54 -0500967 memcpy(oe->lowerstack, stack, sizeof(struct ovl_path) * ctr);
Miklos Szeredie6d2ebd2017-07-04 22:03:16 +0200968 dentry->d_fsdata = oe;
969
Amir Goldsteinc62520a2018-01-14 19:25:31 +0200970 if (upperopaque)
971 ovl_dentry_set_opaque(dentry);
972
Miklos Szeredi55acc662017-07-04 22:03:18 +0200973 if (upperdentry)
974 ovl_dentry_set_upper_alias(dentry);
975 else if (index)
Amir Goldstein359f3922017-06-21 15:28:41 +0300976 upperdentry = dget(index);
977
Miklos Szeredie6d2ebd2017-07-04 22:03:16 +0200978 if (upperdentry || ctr) {
Amir Goldstein0aceb532017-12-12 23:43:16 +0200979 inode = ovl_get_inode(dentry->d_sb, upperdentry, origin, index,
980 ctr);
Miklos Szeredib9ac5c272017-07-04 22:03:17 +0200981 err = PTR_ERR(inode);
982 if (IS_ERR(inode))
Miklos Szeredie6d2ebd2017-07-04 22:03:16 +0200983 goto out_free_oe;
Miklos Szeredicf31c462017-07-04 22:03:16 +0200984
985 OVL_I(inode)->redirect = upperredirect;
Amir Goldstein359f3922017-06-21 15:28:41 +0300986 if (index)
987 ovl_set_flag(OVL_INDEX, inode);
Miklos Szeredie6d2ebd2017-07-04 22:03:16 +0200988 }
989
990 revert_creds(old_cred);
Amir Goldstein359f3922017-06-21 15:28:41 +0300991 dput(index);
Miklos Szeredibbb1e542016-12-16 11:02:56 +0100992 kfree(stack);
Miklos Szeredi02b69b22016-12-16 11:02:56 +0100993 kfree(d.redirect);
Amir Goldstein829c28b2017-09-29 21:43:07 +0300994 return d_splice_alias(inode, dentry);
Miklos Szeredibbb1e542016-12-16 11:02:56 +0100995
996out_free_oe:
Miklos Szeredie6d2ebd2017-07-04 22:03:16 +0200997 dentry->d_fsdata = NULL;
Miklos Szeredibbb1e542016-12-16 11:02:56 +0100998 kfree(oe);
999out_put:
Amir Goldstein359f3922017-06-21 15:28:41 +03001000 dput(index);
Miklos Szeredibbb1e542016-12-16 11:02:56 +01001001 for (i = 0; i < ctr; i++)
1002 dput(stack[i].dentry);
1003 kfree(stack);
1004out_put_upper:
1005 dput(upperdentry);
Miklos Szeredi02b69b22016-12-16 11:02:56 +01001006 kfree(upperredirect);
Miklos Szeredibbb1e542016-12-16 11:02:56 +01001007out:
Miklos Szeredi02b69b22016-12-16 11:02:56 +01001008 kfree(d.redirect);
Miklos Szeredibbb1e542016-12-16 11:02:56 +01001009 revert_creds(old_cred);
1010 return ERR_PTR(err);
1011}
1012
1013bool ovl_lower_positive(struct dentry *dentry)
1014{
Miklos Szeredibbb1e542016-12-16 11:02:56 +01001015 struct ovl_entry *poe = dentry->d_parent->d_fsdata;
1016 const struct qstr *name = &dentry->d_name;
Amir Goldstein6d0a8a92017-11-10 13:18:07 +02001017 const struct cred *old_cred;
Miklos Szeredibbb1e542016-12-16 11:02:56 +01001018 unsigned int i;
1019 bool positive = false;
1020 bool done = false;
1021
1022 /*
1023 * If dentry is negative, then lower is positive iff this is a
1024 * whiteout.
1025 */
1026 if (!dentry->d_inode)
Amir Goldsteinc62520a2018-01-14 19:25:31 +02001027 return ovl_dentry_is_opaque(dentry);
Miklos Szeredibbb1e542016-12-16 11:02:56 +01001028
1029 /* Negative upper -> positive lower */
Miklos Szeredi09d8b582017-07-04 22:03:16 +02001030 if (!ovl_dentry_upper(dentry))
Miklos Szeredibbb1e542016-12-16 11:02:56 +01001031 return true;
1032
Amir Goldstein6d0a8a92017-11-10 13:18:07 +02001033 old_cred = ovl_override_creds(dentry->d_sb);
Miklos Szeredibbb1e542016-12-16 11:02:56 +01001034 /* Positive upper -> have to look up lower to see whether it exists */
1035 for (i = 0; !done && !positive && i < poe->numlower; i++) {
1036 struct dentry *this;
1037 struct dentry *lowerdir = poe->lowerstack[i].dentry;
1038
1039 this = lookup_one_len_unlocked(name->name, lowerdir,
1040 name->len);
1041 if (IS_ERR(this)) {
1042 switch (PTR_ERR(this)) {
1043 case -ENOENT:
1044 case -ENAMETOOLONG:
1045 break;
1046
1047 default:
1048 /*
1049 * Assume something is there, we just couldn't
1050 * access it.
1051 */
1052 positive = true;
1053 break;
1054 }
1055 } else {
1056 if (this->d_inode) {
1057 positive = !ovl_is_whiteout(this);
1058 done = true;
1059 }
1060 dput(this);
1061 }
1062 }
Amir Goldstein6d0a8a92017-11-10 13:18:07 +02001063 revert_creds(old_cred);
Miklos Szeredibbb1e542016-12-16 11:02:56 +01001064
1065 return positive;
1066}