namei.c (2e1a532883cf77f01031bef4b83d864a46c1bed0) | namei.c (1eff1a1deec727bacead79ec64554c1df190f43c) |
---|---|
1/* 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 */ --- 277 unchanged lines hidden (view full) --- 286 if (WARN_ON(rem >= d->name.len)) 287 return -EIO; 288 } 289 *ret = dentry; 290 return 0; 291} 292 293 | 1/* 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 */ --- 277 unchanged lines hidden (view full) --- 286 if (WARN_ON(rem >= d->name.len)) 287 return -EIO; 288 } 289 *ret = dentry; 290 return 0; 291} 292 293 |
294static int ovl_check_origin_fh(struct ovl_fh *fh, struct dentry *upperdentry, 295 struct ovl_path *lower, unsigned int numlower, | 294static int ovl_check_origin_fh(struct ovl_fs *ofs, struct ovl_fh *fh, 295 struct dentry *upperdentry, |
296 struct ovl_path **stackp) 297{ | 296 struct ovl_path **stackp) 297{ |
298 struct vfsmount *mnt; | |
299 struct dentry *origin = NULL; 300 int i; 301 | 298 struct dentry *origin = NULL; 299 int i; 300 |
302 for (i = 0; i < numlower; i++) { 303 mnt = lower[i].layer->mnt; 304 origin = ovl_decode_fh(fh, mnt); | 301 for (i = 0; i < ofs->numlower; i++) { 302 origin = ovl_decode_fh(fh, ofs->lower_layers[i].mnt); |
305 if (origin) 306 break; 307 } 308 309 if (!origin) 310 return -ESTALE; 311 else if (IS_ERR(origin)) 312 return PTR_ERR(origin); 313 314 if (!ovl_is_whiteout(upperdentry) && 315 ((d_inode(origin)->i_mode ^ d_inode(upperdentry)->i_mode) & S_IFMT)) 316 goto invalid; 317 318 if (!*stackp) 319 *stackp = kmalloc(sizeof(struct ovl_path), GFP_KERNEL); 320 if (!*stackp) { 321 dput(origin); 322 return -ENOMEM; 323 } | 303 if (origin) 304 break; 305 } 306 307 if (!origin) 308 return -ESTALE; 309 else if (IS_ERR(origin)) 310 return PTR_ERR(origin); 311 312 if (!ovl_is_whiteout(upperdentry) && 313 ((d_inode(origin)->i_mode ^ d_inode(upperdentry)->i_mode) & S_IFMT)) 314 goto invalid; 315 316 if (!*stackp) 317 *stackp = kmalloc(sizeof(struct ovl_path), GFP_KERNEL); 318 if (!*stackp) { 319 dput(origin); 320 return -ENOMEM; 321 } |
324 **stackp = (struct ovl_path){.dentry = origin, .layer = lower[i].layer}; | 322 **stackp = (struct ovl_path){ 323 .dentry = origin, 324 .layer = &ofs->lower_layers[i] 325 }; |
325 326 return 0; 327 328invalid: 329 pr_warn_ratelimited("overlayfs: invalid origin (%pd2, ftype=%x, origin ftype=%x).\n", 330 upperdentry, d_inode(upperdentry)->i_mode & S_IFMT, 331 d_inode(origin)->i_mode & S_IFMT); 332 dput(origin); 333 return -EIO; 334} 335 | 326 327 return 0; 328 329invalid: 330 pr_warn_ratelimited("overlayfs: invalid origin (%pd2, ftype=%x, origin ftype=%x).\n", 331 upperdentry, d_inode(upperdentry)->i_mode & S_IFMT, 332 d_inode(origin)->i_mode & S_IFMT); 333 dput(origin); 334 return -EIO; 335} 336 |
336static int ovl_check_origin(struct dentry *upperdentry, 337 struct ovl_path *lower, unsigned int numlower, | 337static int ovl_check_origin(struct ovl_fs *ofs, struct dentry *upperdentry, |
338 struct ovl_path **stackp, unsigned int *ctrp) 339{ 340 struct ovl_fh *fh = ovl_get_origin_fh(upperdentry); 341 int err; 342 343 if (IS_ERR_OR_NULL(fh)) 344 return PTR_ERR(fh); 345 | 338 struct ovl_path **stackp, unsigned int *ctrp) 339{ 340 struct ovl_fh *fh = ovl_get_origin_fh(upperdentry); 341 int err; 342 343 if (IS_ERR_OR_NULL(fh)) 344 return PTR_ERR(fh); 345 |
346 err = ovl_check_origin_fh(fh, upperdentry, lower, numlower, stackp); | 346 err = ovl_check_origin_fh(ofs, fh, upperdentry, stackp); |
347 kfree(fh); 348 349 if (err) { 350 if (err == -ESTALE) 351 return 0; 352 return err; 353 } 354 --- 63 unchanged lines hidden (view full) --- 418 goto out; 419} 420 421/* 422 * Verify that an index entry name matches the origin file handle stored in 423 * OVL_XATTR_ORIGIN and that origin file handle can be decoded to lower path. 424 * Return 0 on match, -ESTALE on mismatch or stale origin, < 0 on error. 425 */ | 347 kfree(fh); 348 349 if (err) { 350 if (err == -ESTALE) 351 return 0; 352 return err; 353 } 354 --- 63 unchanged lines hidden (view full) --- 418 goto out; 419} 420 421/* 422 * Verify that an index entry name matches the origin file handle stored in 423 * OVL_XATTR_ORIGIN and that origin file handle can be decoded to lower path. 424 * Return 0 on match, -ESTALE on mismatch or stale origin, < 0 on error. 425 */ |
426int ovl_verify_index(struct dentry *index, struct ovl_path *lower, 427 unsigned int numlower) | 426int ovl_verify_index(struct ovl_fs *ofs, struct dentry *index) |
428{ 429 struct ovl_fh *fh = NULL; 430 size_t len; 431 struct ovl_path origin = { }; 432 struct ovl_path *stack = &origin; 433 int err; 434 435 if (!d_inode(index)) --- 30 unchanged lines hidden (view full) --- 466 err = ovl_check_fh_len(fh, len); 467 if (err) 468 goto fail; 469 470 err = ovl_verify_origin_fh(index, fh); 471 if (err) 472 goto fail; 473 | 427{ 428 struct ovl_fh *fh = NULL; 429 size_t len; 430 struct ovl_path origin = { }; 431 struct ovl_path *stack = &origin; 432 int err; 433 434 if (!d_inode(index)) --- 30 unchanged lines hidden (view full) --- 465 err = ovl_check_fh_len(fh, len); 466 if (err) 467 goto fail; 468 469 err = ovl_verify_origin_fh(index, fh); 470 if (err) 471 goto fail; 472 |
474 err = ovl_check_origin_fh(fh, index, lower, numlower, &stack); | 473 err = ovl_check_origin_fh(ofs, fh, index, &stack); |
475 if (err) 476 goto fail; 477 478 /* Check if index is orphan and don't warn before cleaning it */ 479 if (d_inode(index)->i_nlink == 1 && 480 ovl_get_nlink(origin.dentry, index, 0) == 0) 481 err = -ENOENT; 482 --- 201 unchanged lines hidden (view full) --- 684 * We may get a disconnected dentry, which is fine, 685 * because we only need to hold the origin inode in 686 * cache and use its inode number. We may even get a 687 * connected dentry, that is not under any of the lower 688 * layers root. That is also fine for using it's inode 689 * number - it's the same as if we held a reference 690 * to a dentry in lower layer that was moved under us. 691 */ | 474 if (err) 475 goto fail; 476 477 /* Check if index is orphan and don't warn before cleaning it */ 478 if (d_inode(index)->i_nlink == 1 && 479 ovl_get_nlink(origin.dentry, index, 0) == 0) 480 err = -ENOENT; 481 --- 201 unchanged lines hidden (view full) --- 683 * We may get a disconnected dentry, which is fine, 684 * because we only need to hold the origin inode in 685 * cache and use its inode number. We may even get a 686 * connected dentry, that is not under any of the lower 687 * layers root. That is also fine for using it's inode 688 * number - it's the same as if we held a reference 689 * to a dentry in lower layer that was moved under us. 690 */ |
692 err = ovl_check_origin(upperdentry, roe->lowerstack, 693 roe->numlower, &stack, &ctr); | 691 err = ovl_check_origin(ofs, upperdentry, &stack, &ctr); |
694 if (err) 695 goto out_put_upper; 696 } 697 698 if (d.redirect) { 699 err = -ENOMEM; 700 upperredirect = kstrdup(d.redirect, GFP_KERNEL); 701 if (!upperredirect) --- 186 unchanged lines hidden --- | 692 if (err) 693 goto out_put_upper; 694 } 695 696 if (d.redirect) { 697 err = -ENOMEM; 698 upperredirect = kstrdup(d.redirect, GFP_KERNEL); 699 if (!upperredirect) --- 186 unchanged lines hidden --- |