Skip to content

Commit 9421d57

Browse files
chaseyuJaegeuk Kim
authored andcommitted
f2fs: fix to do security initialization of encrypted inode with original filename
When creating new inode, security_inode_init_security will be called for initializing security info related to the inode, and filename is passed to security module, it helps security module such as SElinux to know which rule or label could be applied for the inode with specified name. Previously, if new inode is created as an encrypted one, f2fs will transfer encrypted filename to security module which may fail the check of security policy belong to the inode. So in order to this issue, alter to transfer original unencrypted filename instead. Signed-off-by: Chao Yu <[email protected]> Signed-off-by: Jaegeuk Kim <[email protected]>
1 parent 7ea984b commit 9421d57

File tree

3 files changed

+26
-20
lines changed

3 files changed

+26
-20
lines changed

fs/f2fs/dir.c

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,8 @@ static int make_empty_dir(struct inode *inode,
378378
}
379379

380380
struct page *init_inode_metadata(struct inode *inode, struct inode *dir,
381-
const struct qstr *name, struct page *dpage)
381+
const struct qstr *new_name, const struct qstr *orig_name,
382+
struct page *dpage)
382383
{
383384
struct page *page;
384385
int err;
@@ -403,7 +404,7 @@ struct page *init_inode_metadata(struct inode *inode, struct inode *dir,
403404
if (err)
404405
goto put_error;
405406

406-
err = f2fs_init_security(inode, dir, name, page);
407+
err = f2fs_init_security(inode, dir, orig_name, page);
407408
if (err)
408409
goto put_error;
409410

@@ -420,8 +421,8 @@ struct page *init_inode_metadata(struct inode *inode, struct inode *dir,
420421
set_cold_node(inode, page);
421422
}
422423

423-
if (name)
424-
init_dent_inode(name, page);
424+
if (new_name)
425+
init_dent_inode(new_name, page);
425426

426427
/*
427428
* This file should be checkpointed during fsync.
@@ -507,6 +508,7 @@ void f2fs_update_dentry(nid_t ino, umode_t mode, struct f2fs_dentry_ptr *d,
507508
}
508509

509510
int f2fs_add_regular_entry(struct inode *dir, const struct qstr *new_name,
511+
const struct qstr *orig_name,
510512
struct inode *inode, nid_t ino, umode_t mode)
511513
{
512514
unsigned int bit_pos;
@@ -572,7 +574,8 @@ int f2fs_add_regular_entry(struct inode *dir, const struct qstr *new_name,
572574

573575
if (inode) {
574576
down_write(&F2FS_I(inode)->i_sem);
575-
page = init_inode_metadata(inode, dir, new_name, NULL);
577+
page = init_inode_metadata(inode, dir, new_name,
578+
orig_name, NULL);
576579
if (IS_ERR(page)) {
577580
err = PTR_ERR(page);
578581
goto fail;
@@ -622,9 +625,11 @@ int __f2fs_add_link(struct inode *dir, const struct qstr *name,
622625

623626
err = -EAGAIN;
624627
if (f2fs_has_inline_dentry(dir))
625-
err = f2fs_add_inline_entry(dir, &new_name, inode, ino, mode);
628+
err = f2fs_add_inline_entry(dir, &new_name, fname.usr_fname,
629+
inode, ino, mode);
626630
if (err == -EAGAIN)
627-
err = f2fs_add_regular_entry(dir, &new_name, inode, ino, mode);
631+
err = f2fs_add_regular_entry(dir, &new_name, fname.usr_fname,
632+
inode, ino, mode);
628633

629634
fscrypt_free_filename(&fname);
630635
f2fs_update_time(F2FS_I_SB(dir), REQ_TIME);
@@ -637,7 +642,7 @@ int f2fs_do_tmpfile(struct inode *inode, struct inode *dir)
637642
int err = 0;
638643

639644
down_write(&F2FS_I(inode)->i_sem);
640-
page = init_inode_metadata(inode, dir, NULL, NULL);
645+
page = init_inode_metadata(inode, dir, NULL, NULL, NULL);
641646
if (IS_ERR(page)) {
642647
err = PTR_ERR(page);
643648
goto fail;

fs/f2fs/f2fs.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1926,7 +1926,7 @@ bool f2fs_fill_dentries(struct dir_context *, struct f2fs_dentry_ptr *,
19261926
void do_make_empty_dir(struct inode *, struct inode *,
19271927
struct f2fs_dentry_ptr *);
19281928
struct page *init_inode_metadata(struct inode *, struct inode *,
1929-
const struct qstr *, struct page *);
1929+
const struct qstr *, const struct qstr *, struct page *);
19301930
void update_parent_metadata(struct inode *, struct inode *, unsigned int);
19311931
int room_for_filename(const void *, int, int);
19321932
void f2fs_drop_nlink(struct inode *, struct inode *);
@@ -1940,7 +1940,7 @@ int update_dent_inode(struct inode *, struct inode *, const struct qstr *);
19401940
void f2fs_update_dentry(nid_t ino, umode_t mode, struct f2fs_dentry_ptr *,
19411941
const struct qstr *, f2fs_hash_t , unsigned int);
19421942
int f2fs_add_regular_entry(struct inode *, const struct qstr *,
1943-
struct inode *, nid_t, umode_t);
1943+
const struct qstr *, struct inode *, nid_t, umode_t);
19441944
int __f2fs_add_link(struct inode *, const struct qstr *, struct inode *, nid_t,
19451945
umode_t);
19461946
void f2fs_delete_entry(struct f2fs_dir_entry *, struct page *, struct inode *,
@@ -2310,8 +2310,8 @@ bool recover_inline_data(struct inode *, struct page *);
23102310
struct f2fs_dir_entry *find_in_inline_dir(struct inode *,
23112311
struct fscrypt_name *, struct page **);
23122312
int make_empty_inline_dir(struct inode *inode, struct inode *, struct page *);
2313-
int f2fs_add_inline_entry(struct inode *, const struct qstr *, struct inode *,
2314-
nid_t, umode_t);
2313+
int f2fs_add_inline_entry(struct inode *, const struct qstr *,
2314+
const struct qstr *, struct inode *, nid_t, umode_t);
23152315
void f2fs_delete_inline_entry(struct f2fs_dir_entry *, struct page *,
23162316
struct inode *, struct inode *);
23172317
bool f2fs_empty_inline_dir(struct inode *);

fs/f2fs/inline.c

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -424,7 +424,7 @@ static int f2fs_add_inline_entries(struct inode *dir,
424424
ino = le32_to_cpu(de->ino);
425425
fake_mode = get_de_type(de) << S_SHIFT;
426426

427-
err = f2fs_add_regular_entry(dir, &new_name, NULL,
427+
err = f2fs_add_regular_entry(dir, &new_name, NULL, NULL,
428428
ino, fake_mode);
429429
if (err)
430430
goto punch_dentry_pages;
@@ -488,17 +488,17 @@ static int f2fs_convert_inline_dir(struct inode *dir, struct page *ipage,
488488
return f2fs_move_rehashed_dirents(dir, ipage, inline_dentry);
489489
}
490490

491-
int f2fs_add_inline_entry(struct inode *dir, const struct qstr *name,
492-
struct inode *inode, nid_t ino, umode_t mode)
491+
int f2fs_add_inline_entry(struct inode *dir, const struct qstr *new_name,
492+
const struct qstr *orig_name,
493+
struct inode *inode, nid_t ino, umode_t mode)
493494
{
494495
struct f2fs_sb_info *sbi = F2FS_I_SB(dir);
495496
struct page *ipage;
496497
unsigned int bit_pos;
497498
f2fs_hash_t name_hash;
498-
size_t namelen = name->len;
499499
struct f2fs_inline_dentry *dentry_blk = NULL;
500500
struct f2fs_dentry_ptr d;
501-
int slots = GET_DENTRY_SLOTS(namelen);
501+
int slots = GET_DENTRY_SLOTS(new_name->len);
502502
struct page *page = NULL;
503503
int err = 0;
504504

@@ -519,7 +519,8 @@ int f2fs_add_inline_entry(struct inode *dir, const struct qstr *name,
519519

520520
if (inode) {
521521
down_write(&F2FS_I(inode)->i_sem);
522-
page = init_inode_metadata(inode, dir, name, ipage);
522+
page = init_inode_metadata(inode, dir, new_name,
523+
orig_name, ipage);
523524
if (IS_ERR(page)) {
524525
err = PTR_ERR(page);
525526
goto fail;
@@ -528,9 +529,9 @@ int f2fs_add_inline_entry(struct inode *dir, const struct qstr *name,
528529

529530
f2fs_wait_on_page_writeback(ipage, NODE, true);
530531

531-
name_hash = f2fs_dentry_hash(name);
532+
name_hash = f2fs_dentry_hash(new_name);
532533
make_dentry_ptr(NULL, &d, (void *)dentry_blk, 2);
533-
f2fs_update_dentry(ino, mode, &d, name, name_hash, bit_pos);
534+
f2fs_update_dentry(ino, mode, &d, new_name, name_hash, bit_pos);
534535

535536
set_page_dirty(ipage);
536537

0 commit comments

Comments
 (0)