From: kernel test robot <lkp@intel.com>
To: kbuild@lists.01.org
Subject: [amir73il:fsnotify-fixes 2/2] fs/notify/fsnotify.c:540 fsnotify() warn: variable dereferenced before check 'dir1' (see line 499)
Date: Sun, 08 May 2022 03:26:49 +0800 [thread overview]
Message-ID: <202205080346.m0fb3UXK-lkp@intel.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 13823 bytes --]
CC: kbuild-all(a)lists.01.org
BCC: lkp(a)intel.com
CC: linux-kernel(a)vger.kernel.org
TO: Amir Goldstein <amir73il@gmail.com>
tree: https://github.com/amir73il/linux fsnotify-fixes
head: d25f3ce8da49ce1a3b0a0621f0bf7b1d6ba2dad6
commit: d25f3ce8da49ce1a3b0a0621f0bf7b1d6ba2dad6 [2/2] fsnotify: send FS_RENAME to groups watching the moved inode
:::::: branch date: 4 hours ago
:::::: commit date: 4 hours ago
config: s390-randconfig-m031-20220508 (https://download.01.org/0day-ci/archive/20220508/202205080346.m0fb3UXK-lkp(a)intel.com/config)
compiler: s390-linux-gcc (GCC) 11.3.0
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
smatch warnings:
fs/notify/fsnotify.c:540 fsnotify() warn: variable dereferenced before check 'dir1' (see line 499)
vim +/dir1 +540 fs/notify/fsnotify.c
d9a6f30bb89309 Amir Goldstein 2018-04-20 454
90586523eb4b34 Eric Paris 2009-05-21 455 /*
40a100d3adc1ad Amir Goldstein 2020-07-22 456 * fsnotify - This is the main call to fsnotify.
40a100d3adc1ad Amir Goldstein 2020-07-22 457 *
40a100d3adc1ad Amir Goldstein 2020-07-22 458 * The VFS calls into hook specific functions in linux/fsnotify.h.
40a100d3adc1ad Amir Goldstein 2020-07-22 459 * Those functions then in turn call here. Here will call out to all of the
40a100d3adc1ad Amir Goldstein 2020-07-22 460 * registered fsnotify_group. Those groups can then use the notification event
40a100d3adc1ad Amir Goldstein 2020-07-22 461 * in whatever means they feel necessary.
40a100d3adc1ad Amir Goldstein 2020-07-22 462 *
40a100d3adc1ad Amir Goldstein 2020-07-22 463 * @mask: event type and flags
40a100d3adc1ad Amir Goldstein 2020-07-22 464 * @data: object that event happened on
40a100d3adc1ad Amir Goldstein 2020-07-22 465 * @data_type: type of object for fanotify_data_XXX() accessors
40a100d3adc1ad Amir Goldstein 2020-07-22 466 * @dir: optional directory associated with event -
40a100d3adc1ad Amir Goldstein 2020-07-22 467 * if @file_name is not NULL, this is the directory that
40a100d3adc1ad Amir Goldstein 2020-07-22 468 * @file_name is relative to
40a100d3adc1ad Amir Goldstein 2020-07-22 469 * @file_name: optional file name associated with event
40a100d3adc1ad Amir Goldstein 2020-07-22 470 * @inode: optional inode associated with event -
29335033c574a1 Gabriel Krisman Bertazi 2021-10-25 471 * If @dir and @inode are both non-NULL, event may be
29335033c574a1 Gabriel Krisman Bertazi 2021-10-25 472 * reported to both.
40a100d3adc1ad Amir Goldstein 2020-07-22 473 * @cookie: inotify rename cookie
90586523eb4b34 Eric Paris 2009-05-21 474 */
40a100d3adc1ad Amir Goldstein 2020-07-22 475 int fsnotify(__u32 mask, const void *data, int data_type, struct inode *dir,
40a100d3adc1ad Amir Goldstein 2020-07-22 476 const struct qstr *file_name, struct inode *inode, u32 cookie)
90586523eb4b34 Eric Paris 2009-05-21 477 {
b54cecf5e2293d Amir Goldstein 2020-06-07 478 const struct path *path = fsnotify_data_path(data, data_type);
29335033c574a1 Gabriel Krisman Bertazi 2021-10-25 479 struct super_block *sb = fsnotify_data_sb(data, data_type);
3427ce71554123 Miklos Szeredi 2017-10-30 480 struct fsnotify_iter_info iter_info = {};
60f7ed8c7c4d06 Amir Goldstein 2018-09-01 481 struct mount *mnt = NULL;
d25f3ce8da49ce Amir Goldstein 2022-05-07 482 struct inode *dir1, *dir2;
e54183fa7047c1 Amir Goldstein 2021-11-29 483 struct dentry *moved;
d25f3ce8da49ce Amir Goldstein 2022-05-07 484 int dir1_type = 0;
9385a84d7e1f65 Jan Kara 2016-11-10 485 int ret = 0;
71d734103edfa2 Mel Gorman 2020-07-08 486 __u32 test_mask, marks_mask;
90586523eb4b34 Eric Paris 2009-05-21 487
71d734103edfa2 Mel Gorman 2020-07-08 488 if (path)
aa93bdc5500cc9 Amir Goldstein 2020-03-19 489 mnt = real_mount(path->mnt);
3a9fb89f4cd04c Eric Paris 2009-12-17 490
40a100d3adc1ad Amir Goldstein 2020-07-22 491 if (!inode) {
40a100d3adc1ad Amir Goldstein 2020-07-22 492 /* Dirent event - report on TYPE_INODE to dir */
40a100d3adc1ad Amir Goldstein 2020-07-22 493 inode = dir;
d25f3ce8da49ce Amir Goldstein 2022-05-07 494 } else if (mask & FS_RENAME) {
d25f3ce8da49ce Amir Goldstein 2022-05-07 495 /* For FS_RENAME, dir1 is old_dir and dir2 is new_dir */
e54183fa7047c1 Amir Goldstein 2021-11-29 496 moved = fsnotify_data_dentry(data, data_type);
d25f3ce8da49ce Amir Goldstein 2022-05-07 497 dir1 = moved->d_parent->d_inode;
d25f3ce8da49ce Amir Goldstein 2022-05-07 498 dir2 = dir;
d25f3ce8da49ce Amir Goldstein 2022-05-07 @499 if (dir1->i_fsnotify_marks || dir2->i_fsnotify_marks)
d25f3ce8da49ce Amir Goldstein 2022-05-07 500 dir1_type = FSNOTIFY_ITER_TYPE_OLD_DIR;
d25f3ce8da49ce Amir Goldstein 2022-05-07 501 /*
d25f3ce8da49ce Amir Goldstein 2022-05-07 502 * Send FS_RENAME to groups watching the moved inode itself
d25f3ce8da49ce Amir Goldstein 2022-05-07 503 * only if the moved inode is a non-dir.
d25f3ce8da49ce Amir Goldstein 2022-05-07 504 * Sending FS_RENAME to a moved watched directory would be
d25f3ce8da49ce Amir Goldstein 2022-05-07 505 * confusing and FS_MOVE_SELF provided enough information to
d25f3ce8da49ce Amir Goldstein 2022-05-07 506 * track the movements of a watched directory.
d25f3ce8da49ce Amir Goldstein 2022-05-07 507 */
d25f3ce8da49ce Amir Goldstein 2022-05-07 508 if (mask & FS_ISDIR)
d25f3ce8da49ce Amir Goldstein 2022-05-07 509 inode = NULL;
40a100d3adc1ad Amir Goldstein 2020-07-22 510 } else if (mask & FS_EVENT_ON_CHILD) {
40a100d3adc1ad Amir Goldstein 2020-07-22 511 /*
fecc4559780d52 Amir Goldstein 2020-12-02 512 * Event on child - report on TYPE_PARENT to dir if it is
fecc4559780d52 Amir Goldstein 2020-12-02 513 * watching children and on TYPE_INODE to child.
40a100d3adc1ad Amir Goldstein 2020-07-22 514 */
d25f3ce8da49ce Amir Goldstein 2022-05-07 515 dir1 = dir;
d25f3ce8da49ce Amir Goldstein 2022-05-07 516 dir2 = NULL;
d25f3ce8da49ce Amir Goldstein 2022-05-07 517 if (dir1->i_fsnotify_marks)
d25f3ce8da49ce Amir Goldstein 2022-05-07 518 dir1_type = FSNOTIFY_ITER_TYPE_PARENT;
40a100d3adc1ad Amir Goldstein 2020-07-22 519 }
497b0c5a7c0688 Amir Goldstein 2020-07-16 520
7c49b8616460eb Dave Hansen 2015-09-04 521 /*
7c49b8616460eb Dave Hansen 2015-09-04 522 * Optimization: srcu_read_lock() has a memory barrier which can
7c49b8616460eb Dave Hansen 2015-09-04 523 * be expensive. It protects walking the *_fsnotify_marks lists.
7c49b8616460eb Dave Hansen 2015-09-04 524 * However, if we do not walk the lists, we do not have to do
7c49b8616460eb Dave Hansen 2015-09-04 525 * SRCU because we have no references to any objects and do not
7c49b8616460eb Dave Hansen 2015-09-04 526 * need SRCU to keep them "alive".
7c49b8616460eb Dave Hansen 2015-09-04 527 */
9b93f33105f5f9 Amir Goldstein 2020-07-16 528 if (!sb->s_fsnotify_marks &&
497b0c5a7c0688 Amir Goldstein 2020-07-16 529 (!mnt || !mnt->mnt_fsnotify_marks) &&
9b93f33105f5f9 Amir Goldstein 2020-07-16 530 (!inode || !inode->i_fsnotify_marks) &&
d25f3ce8da49ce Amir Goldstein 2022-05-07 531 !dir1_type)
7c49b8616460eb Dave Hansen 2015-09-04 532 return 0;
71d734103edfa2 Mel Gorman 2020-07-08 533
9b93f33105f5f9 Amir Goldstein 2020-07-16 534 marks_mask = sb->s_fsnotify_mask;
71d734103edfa2 Mel Gorman 2020-07-08 535 if (mnt)
71d734103edfa2 Mel Gorman 2020-07-08 536 marks_mask |= mnt->mnt_fsnotify_mask;
9b93f33105f5f9 Amir Goldstein 2020-07-16 537 if (inode)
9b93f33105f5f9 Amir Goldstein 2020-07-16 538 marks_mask |= inode->i_fsnotify_mask;
d25f3ce8da49ce Amir Goldstein 2022-05-07 539 if (dir1_type) {
d25f3ce8da49ce Amir Goldstein 2022-05-07 @540 if (dir1)
d25f3ce8da49ce Amir Goldstein 2022-05-07 541 marks_mask |= dir1->i_fsnotify_mask;
d25f3ce8da49ce Amir Goldstein 2022-05-07 542 if (dir2)
d25f3ce8da49ce Amir Goldstein 2022-05-07 543 marks_mask |= dir2->i_fsnotify_mask;
d25f3ce8da49ce Amir Goldstein 2022-05-07 544 }
497b0c5a7c0688 Amir Goldstein 2020-07-16 545
71d734103edfa2 Mel Gorman 2020-07-08 546
613a807fe7c793 Eric Paris 2010-07-28 547 /*
04e317ba72d079 Amir Goldstein 2022-02-23 548 * If this is a modify event we may need to clear some ignored masks.
04e317ba72d079 Amir Goldstein 2022-02-23 549 * In that case, the object with ignored masks will have the FS_MODIFY
04e317ba72d079 Amir Goldstein 2022-02-23 550 * event in its mask.
04e317ba72d079 Amir Goldstein 2022-02-23 551 * Otherwise, return if none of the marks care about this type of event.
613a807fe7c793 Eric Paris 2010-07-28 552 */
71d734103edfa2 Mel Gorman 2020-07-08 553 test_mask = (mask & ALL_FSNOTIFY_EVENTS);
04e317ba72d079 Amir Goldstein 2022-02-23 554 if (!(test_mask & marks_mask))
613a807fe7c793 Eric Paris 2010-07-28 555 return 0;
75c1be487a690d Eric Paris 2010-07-28 556
9385a84d7e1f65 Jan Kara 2016-11-10 557 iter_info.srcu_idx = srcu_read_lock(&fsnotify_mark_srcu);
75c1be487a690d Eric Paris 2010-07-28 558
1c9007d62bea6f Amir Goldstein 2021-11-29 559 iter_info.marks[FSNOTIFY_ITER_TYPE_SB] =
45a9fb3725d886 Amir Goldstein 2019-01-10 560 fsnotify_first_mark(&sb->s_fsnotify_marks);
9bdda4e9cf2dce Amir Goldstein 2018-09-01 561 if (mnt) {
1c9007d62bea6f Amir Goldstein 2021-11-29 562 iter_info.marks[FSNOTIFY_ITER_TYPE_VFSMOUNT] =
3427ce71554123 Miklos Szeredi 2017-10-30 563 fsnotify_first_mark(&mnt->mnt_fsnotify_marks);
7131485a93679f Eric Paris 2009-12-17 564 }
9b93f33105f5f9 Amir Goldstein 2020-07-16 565 if (inode) {
1c9007d62bea6f Amir Goldstein 2021-11-29 566 iter_info.marks[FSNOTIFY_ITER_TYPE_INODE] =
9b93f33105f5f9 Amir Goldstein 2020-07-16 567 fsnotify_first_mark(&inode->i_fsnotify_marks);
9b93f33105f5f9 Amir Goldstein 2020-07-16 568 }
d25f3ce8da49ce Amir Goldstein 2022-05-07 569 if (dir1_type) {
d25f3ce8da49ce Amir Goldstein 2022-05-07 570 if (dir1)
d25f3ce8da49ce Amir Goldstein 2022-05-07 571 iter_info.marks[dir1_type] =
d25f3ce8da49ce Amir Goldstein 2022-05-07 572 fsnotify_first_mark(&dir1->i_fsnotify_marks);
d25f3ce8da49ce Amir Goldstein 2022-05-07 573 if (dir2)
d25f3ce8da49ce Amir Goldstein 2022-05-07 574 iter_info.marks[FSNOTIFY_ITER_TYPE_NEW_DIR] =
d25f3ce8da49ce Amir Goldstein 2022-05-07 575 fsnotify_first_mark(&dir2->i_fsnotify_marks);
497b0c5a7c0688 Amir Goldstein 2020-07-16 576 }
75c1be487a690d Eric Paris 2010-07-28 577
8edc6e1688fc8f Jan Kara 2014-11-13 578 /*
60f7ed8c7c4d06 Amir Goldstein 2018-09-01 579 * We need to merge inode/vfsmount/sb mark lists so that e.g. inode mark
60f7ed8c7c4d06 Amir Goldstein 2018-09-01 580 * ignore masks are properly reflected for mount/sb mark notifications.
8edc6e1688fc8f Jan Kara 2014-11-13 581 * That's why this traversal is so complicated...
8edc6e1688fc8f Jan Kara 2014-11-13 582 */
d9a6f30bb89309 Amir Goldstein 2018-04-20 583 while (fsnotify_iter_select_report_types(&iter_info)) {
b54cecf5e2293d Amir Goldstein 2020-06-07 584 ret = send_to_group(mask, data, data_type, dir, file_name,
b54cecf5e2293d Amir Goldstein 2020-06-07 585 cookie, &iter_info);
613a807fe7c793 Eric Paris 2010-07-28 586
ff8bcbd03da881 Eric Paris 2010-10-28 587 if (ret && (mask & ALL_FSNOTIFY_PERM_EVENTS))
ff8bcbd03da881 Eric Paris 2010-10-28 588 goto out;
ff8bcbd03da881 Eric Paris 2010-10-28 589
d9a6f30bb89309 Amir Goldstein 2018-04-20 590 fsnotify_iter_next(&iter_info);
90586523eb4b34 Eric Paris 2009-05-21 591 }
ff8bcbd03da881 Eric Paris 2010-10-28 592 ret = 0;
ff8bcbd03da881 Eric Paris 2010-10-28 593 out:
9385a84d7e1f65 Jan Kara 2016-11-10 594 srcu_read_unlock(&fsnotify_mark_srcu, iter_info.srcu_idx);
c4ec54b40d33f8 Eric Paris 2009-12-17 595
98b5c10d320adf Jean-Christophe Dubois 2010-03-23 596 return ret;
90586523eb4b34 Eric Paris 2009-05-21 597 }
90586523eb4b34 Eric Paris 2009-05-21 598 EXPORT_SYMBOL_GPL(fsnotify);
90586523eb4b34 Eric Paris 2009-05-21 599
--
0-DAY CI Kernel Test Service
https://01.org/lkp
WARNING: multiple messages have this Message-ID (diff)
From: Dan Carpenter <dan.carpenter@oracle.com>
To: kbuild-all@lists.01.org
Subject: [amir73il:fsnotify-fixes 2/2] fs/notify/fsnotify.c:540 fsnotify() warn: variable dereferenced before check 'dir1' (see line 499)
Date: Mon, 09 May 2022 13:08:37 +0300 [thread overview]
Message-ID: <202205080346.m0fb3UXK-lkp@intel.com> (raw)
[-- Attachment #1: Type: text/plain, Size: 11873 bytes --]
tree: https://github.com/amir73il/linux fsnotify-fixes
head: d25f3ce8da49ce1a3b0a0621f0bf7b1d6ba2dad6
commit: d25f3ce8da49ce1a3b0a0621f0bf7b1d6ba2dad6 [2/2] fsnotify: send FS_RENAME to groups watching the moved inode
config: s390-randconfig-m031-20220508 (https://download.01.org/0day-ci/archive/20220508/202205080346.m0fb3UXK-lkp(a)intel.com/config)
compiler: s390-linux-gcc (GCC) 11.3.0
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
smatch warnings:
fs/notify/fsnotify.c:540 fsnotify() warn: variable dereferenced before check 'dir1' (see line 499)
vim +/dir1 +540 fs/notify/fsnotify.c
40a100d3adc1ad Amir Goldstein 2020-07-22 475 int fsnotify(__u32 mask, const void *data, int data_type, struct inode *dir,
40a100d3adc1ad Amir Goldstein 2020-07-22 476 const struct qstr *file_name, struct inode *inode, u32 cookie)
90586523eb4b34 Eric Paris 2009-05-21 477 {
b54cecf5e2293d Amir Goldstein 2020-06-07 478 const struct path *path = fsnotify_data_path(data, data_type);
29335033c574a1 Gabriel Krisman Bertazi 2021-10-25 479 struct super_block *sb = fsnotify_data_sb(data, data_type);
3427ce71554123 Miklos Szeredi 2017-10-30 480 struct fsnotify_iter_info iter_info = {};
60f7ed8c7c4d06 Amir Goldstein 2018-09-01 481 struct mount *mnt = NULL;
d25f3ce8da49ce Amir Goldstein 2022-05-07 482 struct inode *dir1, *dir2;
e54183fa7047c1 Amir Goldstein 2021-11-29 483 struct dentry *moved;
d25f3ce8da49ce Amir Goldstein 2022-05-07 484 int dir1_type = 0;
9385a84d7e1f65 Jan Kara 2016-11-10 485 int ret = 0;
71d734103edfa2 Mel Gorman 2020-07-08 486 __u32 test_mask, marks_mask;
90586523eb4b34 Eric Paris 2009-05-21 487
71d734103edfa2 Mel Gorman 2020-07-08 488 if (path)
aa93bdc5500cc9 Amir Goldstein 2020-03-19 489 mnt = real_mount(path->mnt);
3a9fb89f4cd04c Eric Paris 2009-12-17 490
40a100d3adc1ad Amir Goldstein 2020-07-22 491 if (!inode) {
40a100d3adc1ad Amir Goldstein 2020-07-22 492 /* Dirent event - report on TYPE_INODE to dir */
40a100d3adc1ad Amir Goldstein 2020-07-22 493 inode = dir;
d25f3ce8da49ce Amir Goldstein 2022-05-07 494 } else if (mask & FS_RENAME) {
d25f3ce8da49ce Amir Goldstein 2022-05-07 495 /* For FS_RENAME, dir1 is old_dir and dir2 is new_dir */
e54183fa7047c1 Amir Goldstein 2021-11-29 496 moved = fsnotify_data_dentry(data, data_type);
d25f3ce8da49ce Amir Goldstein 2022-05-07 497 dir1 = moved->d_parent->d_inode;
d25f3ce8da49ce Amir Goldstein 2022-05-07 498 dir2 = dir;
d25f3ce8da49ce Amir Goldstein 2022-05-07 @499 if (dir1->i_fsnotify_marks || dir2->i_fsnotify_marks)
^^^^^^^^^^^^^^^^^^^^^^
Dereference
d25f3ce8da49ce Amir Goldstein 2022-05-07 500 dir1_type = FSNOTIFY_ITER_TYPE_OLD_DIR;
d25f3ce8da49ce Amir Goldstein 2022-05-07 501 /*
d25f3ce8da49ce Amir Goldstein 2022-05-07 502 * Send FS_RENAME to groups watching the moved inode itself
d25f3ce8da49ce Amir Goldstein 2022-05-07 503 * only if the moved inode is a non-dir.
d25f3ce8da49ce Amir Goldstein 2022-05-07 504 * Sending FS_RENAME to a moved watched directory would be
d25f3ce8da49ce Amir Goldstein 2022-05-07 505 * confusing and FS_MOVE_SELF provided enough information to
d25f3ce8da49ce Amir Goldstein 2022-05-07 506 * track the movements of a watched directory.
d25f3ce8da49ce Amir Goldstein 2022-05-07 507 */
d25f3ce8da49ce Amir Goldstein 2022-05-07 508 if (mask & FS_ISDIR)
d25f3ce8da49ce Amir Goldstein 2022-05-07 509 inode = NULL;
40a100d3adc1ad Amir Goldstein 2020-07-22 510 } else if (mask & FS_EVENT_ON_CHILD) {
40a100d3adc1ad Amir Goldstein 2020-07-22 511 /*
fecc4559780d52 Amir Goldstein 2020-12-02 512 * Event on child - report on TYPE_PARENT to dir if it is
fecc4559780d52 Amir Goldstein 2020-12-02 513 * watching children and on TYPE_INODE to child.
40a100d3adc1ad Amir Goldstein 2020-07-22 514 */
d25f3ce8da49ce Amir Goldstein 2022-05-07 515 dir1 = dir;
d25f3ce8da49ce Amir Goldstein 2022-05-07 516 dir2 = NULL;
d25f3ce8da49ce Amir Goldstein 2022-05-07 517 if (dir1->i_fsnotify_marks)
^^^^^^^^^^^^^^^^^^^^^^
Dereference
d25f3ce8da49ce Amir Goldstein 2022-05-07 518 dir1_type = FSNOTIFY_ITER_TYPE_PARENT;
40a100d3adc1ad Amir Goldstein 2020-07-22 519 }
497b0c5a7c0688 Amir Goldstein 2020-07-16 520
7c49b8616460eb Dave Hansen 2015-09-04 521 /*
7c49b8616460eb Dave Hansen 2015-09-04 522 * Optimization: srcu_read_lock() has a memory barrier which can
7c49b8616460eb Dave Hansen 2015-09-04 523 * be expensive. It protects walking the *_fsnotify_marks lists.
7c49b8616460eb Dave Hansen 2015-09-04 524 * However, if we do not walk the lists, we do not have to do
7c49b8616460eb Dave Hansen 2015-09-04 525 * SRCU because we have no references to any objects and do not
7c49b8616460eb Dave Hansen 2015-09-04 526 * need SRCU to keep them "alive".
7c49b8616460eb Dave Hansen 2015-09-04 527 */
9b93f33105f5f9 Amir Goldstein 2020-07-16 528 if (!sb->s_fsnotify_marks &&
497b0c5a7c0688 Amir Goldstein 2020-07-16 529 (!mnt || !mnt->mnt_fsnotify_marks) &&
9b93f33105f5f9 Amir Goldstein 2020-07-16 530 (!inode || !inode->i_fsnotify_marks) &&
d25f3ce8da49ce Amir Goldstein 2022-05-07 531 !dir1_type)
7c49b8616460eb Dave Hansen 2015-09-04 532 return 0;
71d734103edfa2 Mel Gorman 2020-07-08 533
9b93f33105f5f9 Amir Goldstein 2020-07-16 534 marks_mask = sb->s_fsnotify_mask;
71d734103edfa2 Mel Gorman 2020-07-08 535 if (mnt)
71d734103edfa2 Mel Gorman 2020-07-08 536 marks_mask |= mnt->mnt_fsnotify_mask;
9b93f33105f5f9 Amir Goldstein 2020-07-16 537 if (inode)
9b93f33105f5f9 Amir Goldstein 2020-07-16 538 marks_mask |= inode->i_fsnotify_mask;
d25f3ce8da49ce Amir Goldstein 2022-05-07 539 if (dir1_type) {
d25f3ce8da49ce Amir Goldstein 2022-05-07 @540 if (dir1)
If "dir1_type" is set then we have already dereferenced "dir1". I guess
this unnecessary NULL check is something that probably wouldn't bother
a human reader too much...
d25f3ce8da49ce Amir Goldstein 2022-05-07 541 marks_mask |= dir1->i_fsnotify_mask;
d25f3ce8da49ce Amir Goldstein 2022-05-07 542 if (dir2)
d25f3ce8da49ce Amir Goldstein 2022-05-07 543 marks_mask |= dir2->i_fsnotify_mask;
d25f3ce8da49ce Amir Goldstein 2022-05-07 544 }
497b0c5a7c0688 Amir Goldstein 2020-07-16 545
71d734103edfa2 Mel Gorman 2020-07-08 546
613a807fe7c793 Eric Paris 2010-07-28 547 /*
04e317ba72d079 Amir Goldstein 2022-02-23 548 * If this is a modify event we may need to clear some ignored masks.
04e317ba72d079 Amir Goldstein 2022-02-23 549 * In that case, the object with ignored masks will have the FS_MODIFY
04e317ba72d079 Amir Goldstein 2022-02-23 550 * event in its mask.
04e317ba72d079 Amir Goldstein 2022-02-23 551 * Otherwise, return if none of the marks care about this type of event.
613a807fe7c793 Eric Paris 2010-07-28 552 */
71d734103edfa2 Mel Gorman 2020-07-08 553 test_mask = (mask & ALL_FSNOTIFY_EVENTS);
04e317ba72d079 Amir Goldstein 2022-02-23 554 if (!(test_mask & marks_mask))
613a807fe7c793 Eric Paris 2010-07-28 555 return 0;
75c1be487a690d Eric Paris 2010-07-28 556
9385a84d7e1f65 Jan Kara 2016-11-10 557 iter_info.srcu_idx = srcu_read_lock(&fsnotify_mark_srcu);
75c1be487a690d Eric Paris 2010-07-28 558
1c9007d62bea6f Amir Goldstein 2021-11-29 559 iter_info.marks[FSNOTIFY_ITER_TYPE_SB] =
45a9fb3725d886 Amir Goldstein 2019-01-10 560 fsnotify_first_mark(&sb->s_fsnotify_marks);
9bdda4e9cf2dce Amir Goldstein 2018-09-01 561 if (mnt) {
1c9007d62bea6f Amir Goldstein 2021-11-29 562 iter_info.marks[FSNOTIFY_ITER_TYPE_VFSMOUNT] =
3427ce71554123 Miklos Szeredi 2017-10-30 563 fsnotify_first_mark(&mnt->mnt_fsnotify_marks);
7131485a93679f Eric Paris 2009-12-17 564 }
9b93f33105f5f9 Amir Goldstein 2020-07-16 565 if (inode) {
1c9007d62bea6f Amir Goldstein 2021-11-29 566 iter_info.marks[FSNOTIFY_ITER_TYPE_INODE] =
9b93f33105f5f9 Amir Goldstein 2020-07-16 567 fsnotify_first_mark(&inode->i_fsnotify_marks);
9b93f33105f5f9 Amir Goldstein 2020-07-16 568 }
d25f3ce8da49ce Amir Goldstein 2022-05-07 569 if (dir1_type) {
d25f3ce8da49ce Amir Goldstein 2022-05-07 570 if (dir1)
d25f3ce8da49ce Amir Goldstein 2022-05-07 571 iter_info.marks[dir1_type] =
d25f3ce8da49ce Amir Goldstein 2022-05-07 572 fsnotify_first_mark(&dir1->i_fsnotify_marks);
d25f3ce8da49ce Amir Goldstein 2022-05-07 573 if (dir2)
d25f3ce8da49ce Amir Goldstein 2022-05-07 574 iter_info.marks[FSNOTIFY_ITER_TYPE_NEW_DIR] =
d25f3ce8da49ce Amir Goldstein 2022-05-07 575 fsnotify_first_mark(&dir2->i_fsnotify_marks);
497b0c5a7c0688 Amir Goldstein 2020-07-16 576 }
75c1be487a690d Eric Paris 2010-07-28 577
8edc6e1688fc8f Jan Kara 2014-11-13 578 /*
60f7ed8c7c4d06 Amir Goldstein 2018-09-01 579 * We need to merge inode/vfsmount/sb mark lists so that e.g. inode mark
60f7ed8c7c4d06 Amir Goldstein 2018-09-01 580 * ignore masks are properly reflected for mount/sb mark notifications.
8edc6e1688fc8f Jan Kara 2014-11-13 581 * That's why this traversal is so complicated...
8edc6e1688fc8f Jan Kara 2014-11-13 582 */
d9a6f30bb89309 Amir Goldstein 2018-04-20 583 while (fsnotify_iter_select_report_types(&iter_info)) {
b54cecf5e2293d Amir Goldstein 2020-06-07 584 ret = send_to_group(mask, data, data_type, dir, file_name,
b54cecf5e2293d Amir Goldstein 2020-06-07 585 cookie, &iter_info);
613a807fe7c793 Eric Paris 2010-07-28 586
ff8bcbd03da881 Eric Paris 2010-10-28 587 if (ret && (mask & ALL_FSNOTIFY_PERM_EVENTS))
ff8bcbd03da881 Eric Paris 2010-10-28 588 goto out;
ff8bcbd03da881 Eric Paris 2010-10-28 589
d9a6f30bb89309 Amir Goldstein 2018-04-20 590 fsnotify_iter_next(&iter_info);
90586523eb4b34 Eric Paris 2009-05-21 591 }
ff8bcbd03da881 Eric Paris 2010-10-28 592 ret = 0;
ff8bcbd03da881 Eric Paris 2010-10-28 593 out:
9385a84d7e1f65 Jan Kara 2016-11-10 594 srcu_read_unlock(&fsnotify_mark_srcu, iter_info.srcu_idx);
c4ec54b40d33f8 Eric Paris 2009-12-17 595
98b5c10d320adf Jean-Christophe Dubois 2010-03-23 596 return ret;
90586523eb4b34 Eric Paris 2009-05-21 597 }
--
0-DAY CI Kernel Test Service
https://01.org/lkp
WARNING: multiple messages have this Message-ID (diff)
From: Dan Carpenter <dan.carpenter@oracle.com>
To: kbuild@lists.01.org, Amir Goldstein <amir73il@gmail.com>
Cc: lkp@intel.com, kbuild-all@lists.01.org, linux-kernel@vger.kernel.org
Subject: [amir73il:fsnotify-fixes 2/2] fs/notify/fsnotify.c:540 fsnotify() warn: variable dereferenced before check 'dir1' (see line 499)
Date: Mon, 9 May 2022 13:08:37 +0300 [thread overview]
Message-ID: <202205080346.m0fb3UXK-lkp@intel.com> (raw)
tree: https://github.com/amir73il/linux fsnotify-fixes
head: d25f3ce8da49ce1a3b0a0621f0bf7b1d6ba2dad6
commit: d25f3ce8da49ce1a3b0a0621f0bf7b1d6ba2dad6 [2/2] fsnotify: send FS_RENAME to groups watching the moved inode
config: s390-randconfig-m031-20220508 (https://download.01.org/0day-ci/archive/20220508/202205080346.m0fb3UXK-lkp@intel.com/config)
compiler: s390-linux-gcc (GCC) 11.3.0
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
smatch warnings:
fs/notify/fsnotify.c:540 fsnotify() warn: variable dereferenced before check 'dir1' (see line 499)
vim +/dir1 +540 fs/notify/fsnotify.c
40a100d3adc1ad Amir Goldstein 2020-07-22 475 int fsnotify(__u32 mask, const void *data, int data_type, struct inode *dir,
40a100d3adc1ad Amir Goldstein 2020-07-22 476 const struct qstr *file_name, struct inode *inode, u32 cookie)
90586523eb4b34 Eric Paris 2009-05-21 477 {
b54cecf5e2293d Amir Goldstein 2020-06-07 478 const struct path *path = fsnotify_data_path(data, data_type);
29335033c574a1 Gabriel Krisman Bertazi 2021-10-25 479 struct super_block *sb = fsnotify_data_sb(data, data_type);
3427ce71554123 Miklos Szeredi 2017-10-30 480 struct fsnotify_iter_info iter_info = {};
60f7ed8c7c4d06 Amir Goldstein 2018-09-01 481 struct mount *mnt = NULL;
d25f3ce8da49ce Amir Goldstein 2022-05-07 482 struct inode *dir1, *dir2;
e54183fa7047c1 Amir Goldstein 2021-11-29 483 struct dentry *moved;
d25f3ce8da49ce Amir Goldstein 2022-05-07 484 int dir1_type = 0;
9385a84d7e1f65 Jan Kara 2016-11-10 485 int ret = 0;
71d734103edfa2 Mel Gorman 2020-07-08 486 __u32 test_mask, marks_mask;
90586523eb4b34 Eric Paris 2009-05-21 487
71d734103edfa2 Mel Gorman 2020-07-08 488 if (path)
aa93bdc5500cc9 Amir Goldstein 2020-03-19 489 mnt = real_mount(path->mnt);
3a9fb89f4cd04c Eric Paris 2009-12-17 490
40a100d3adc1ad Amir Goldstein 2020-07-22 491 if (!inode) {
40a100d3adc1ad Amir Goldstein 2020-07-22 492 /* Dirent event - report on TYPE_INODE to dir */
40a100d3adc1ad Amir Goldstein 2020-07-22 493 inode = dir;
d25f3ce8da49ce Amir Goldstein 2022-05-07 494 } else if (mask & FS_RENAME) {
d25f3ce8da49ce Amir Goldstein 2022-05-07 495 /* For FS_RENAME, dir1 is old_dir and dir2 is new_dir */
e54183fa7047c1 Amir Goldstein 2021-11-29 496 moved = fsnotify_data_dentry(data, data_type);
d25f3ce8da49ce Amir Goldstein 2022-05-07 497 dir1 = moved->d_parent->d_inode;
d25f3ce8da49ce Amir Goldstein 2022-05-07 498 dir2 = dir;
d25f3ce8da49ce Amir Goldstein 2022-05-07 @499 if (dir1->i_fsnotify_marks || dir2->i_fsnotify_marks)
^^^^^^^^^^^^^^^^^^^^^^
Dereference
d25f3ce8da49ce Amir Goldstein 2022-05-07 500 dir1_type = FSNOTIFY_ITER_TYPE_OLD_DIR;
d25f3ce8da49ce Amir Goldstein 2022-05-07 501 /*
d25f3ce8da49ce Amir Goldstein 2022-05-07 502 * Send FS_RENAME to groups watching the moved inode itself
d25f3ce8da49ce Amir Goldstein 2022-05-07 503 * only if the moved inode is a non-dir.
d25f3ce8da49ce Amir Goldstein 2022-05-07 504 * Sending FS_RENAME to a moved watched directory would be
d25f3ce8da49ce Amir Goldstein 2022-05-07 505 * confusing and FS_MOVE_SELF provided enough information to
d25f3ce8da49ce Amir Goldstein 2022-05-07 506 * track the movements of a watched directory.
d25f3ce8da49ce Amir Goldstein 2022-05-07 507 */
d25f3ce8da49ce Amir Goldstein 2022-05-07 508 if (mask & FS_ISDIR)
d25f3ce8da49ce Amir Goldstein 2022-05-07 509 inode = NULL;
40a100d3adc1ad Amir Goldstein 2020-07-22 510 } else if (mask & FS_EVENT_ON_CHILD) {
40a100d3adc1ad Amir Goldstein 2020-07-22 511 /*
fecc4559780d52 Amir Goldstein 2020-12-02 512 * Event on child - report on TYPE_PARENT to dir if it is
fecc4559780d52 Amir Goldstein 2020-12-02 513 * watching children and on TYPE_INODE to child.
40a100d3adc1ad Amir Goldstein 2020-07-22 514 */
d25f3ce8da49ce Amir Goldstein 2022-05-07 515 dir1 = dir;
d25f3ce8da49ce Amir Goldstein 2022-05-07 516 dir2 = NULL;
d25f3ce8da49ce Amir Goldstein 2022-05-07 517 if (dir1->i_fsnotify_marks)
^^^^^^^^^^^^^^^^^^^^^^
Dereference
d25f3ce8da49ce Amir Goldstein 2022-05-07 518 dir1_type = FSNOTIFY_ITER_TYPE_PARENT;
40a100d3adc1ad Amir Goldstein 2020-07-22 519 }
497b0c5a7c0688 Amir Goldstein 2020-07-16 520
7c49b8616460eb Dave Hansen 2015-09-04 521 /*
7c49b8616460eb Dave Hansen 2015-09-04 522 * Optimization: srcu_read_lock() has a memory barrier which can
7c49b8616460eb Dave Hansen 2015-09-04 523 * be expensive. It protects walking the *_fsnotify_marks lists.
7c49b8616460eb Dave Hansen 2015-09-04 524 * However, if we do not walk the lists, we do not have to do
7c49b8616460eb Dave Hansen 2015-09-04 525 * SRCU because we have no references to any objects and do not
7c49b8616460eb Dave Hansen 2015-09-04 526 * need SRCU to keep them "alive".
7c49b8616460eb Dave Hansen 2015-09-04 527 */
9b93f33105f5f9 Amir Goldstein 2020-07-16 528 if (!sb->s_fsnotify_marks &&
497b0c5a7c0688 Amir Goldstein 2020-07-16 529 (!mnt || !mnt->mnt_fsnotify_marks) &&
9b93f33105f5f9 Amir Goldstein 2020-07-16 530 (!inode || !inode->i_fsnotify_marks) &&
d25f3ce8da49ce Amir Goldstein 2022-05-07 531 !dir1_type)
7c49b8616460eb Dave Hansen 2015-09-04 532 return 0;
71d734103edfa2 Mel Gorman 2020-07-08 533
9b93f33105f5f9 Amir Goldstein 2020-07-16 534 marks_mask = sb->s_fsnotify_mask;
71d734103edfa2 Mel Gorman 2020-07-08 535 if (mnt)
71d734103edfa2 Mel Gorman 2020-07-08 536 marks_mask |= mnt->mnt_fsnotify_mask;
9b93f33105f5f9 Amir Goldstein 2020-07-16 537 if (inode)
9b93f33105f5f9 Amir Goldstein 2020-07-16 538 marks_mask |= inode->i_fsnotify_mask;
d25f3ce8da49ce Amir Goldstein 2022-05-07 539 if (dir1_type) {
d25f3ce8da49ce Amir Goldstein 2022-05-07 @540 if (dir1)
If "dir1_type" is set then we have already dereferenced "dir1". I guess
this unnecessary NULL check is something that probably wouldn't bother
a human reader too much...
d25f3ce8da49ce Amir Goldstein 2022-05-07 541 marks_mask |= dir1->i_fsnotify_mask;
d25f3ce8da49ce Amir Goldstein 2022-05-07 542 if (dir2)
d25f3ce8da49ce Amir Goldstein 2022-05-07 543 marks_mask |= dir2->i_fsnotify_mask;
d25f3ce8da49ce Amir Goldstein 2022-05-07 544 }
497b0c5a7c0688 Amir Goldstein 2020-07-16 545
71d734103edfa2 Mel Gorman 2020-07-08 546
613a807fe7c793 Eric Paris 2010-07-28 547 /*
04e317ba72d079 Amir Goldstein 2022-02-23 548 * If this is a modify event we may need to clear some ignored masks.
04e317ba72d079 Amir Goldstein 2022-02-23 549 * In that case, the object with ignored masks will have the FS_MODIFY
04e317ba72d079 Amir Goldstein 2022-02-23 550 * event in its mask.
04e317ba72d079 Amir Goldstein 2022-02-23 551 * Otherwise, return if none of the marks care about this type of event.
613a807fe7c793 Eric Paris 2010-07-28 552 */
71d734103edfa2 Mel Gorman 2020-07-08 553 test_mask = (mask & ALL_FSNOTIFY_EVENTS);
04e317ba72d079 Amir Goldstein 2022-02-23 554 if (!(test_mask & marks_mask))
613a807fe7c793 Eric Paris 2010-07-28 555 return 0;
75c1be487a690d Eric Paris 2010-07-28 556
9385a84d7e1f65 Jan Kara 2016-11-10 557 iter_info.srcu_idx = srcu_read_lock(&fsnotify_mark_srcu);
75c1be487a690d Eric Paris 2010-07-28 558
1c9007d62bea6f Amir Goldstein 2021-11-29 559 iter_info.marks[FSNOTIFY_ITER_TYPE_SB] =
45a9fb3725d886 Amir Goldstein 2019-01-10 560 fsnotify_first_mark(&sb->s_fsnotify_marks);
9bdda4e9cf2dce Amir Goldstein 2018-09-01 561 if (mnt) {
1c9007d62bea6f Amir Goldstein 2021-11-29 562 iter_info.marks[FSNOTIFY_ITER_TYPE_VFSMOUNT] =
3427ce71554123 Miklos Szeredi 2017-10-30 563 fsnotify_first_mark(&mnt->mnt_fsnotify_marks);
7131485a93679f Eric Paris 2009-12-17 564 }
9b93f33105f5f9 Amir Goldstein 2020-07-16 565 if (inode) {
1c9007d62bea6f Amir Goldstein 2021-11-29 566 iter_info.marks[FSNOTIFY_ITER_TYPE_INODE] =
9b93f33105f5f9 Amir Goldstein 2020-07-16 567 fsnotify_first_mark(&inode->i_fsnotify_marks);
9b93f33105f5f9 Amir Goldstein 2020-07-16 568 }
d25f3ce8da49ce Amir Goldstein 2022-05-07 569 if (dir1_type) {
d25f3ce8da49ce Amir Goldstein 2022-05-07 570 if (dir1)
d25f3ce8da49ce Amir Goldstein 2022-05-07 571 iter_info.marks[dir1_type] =
d25f3ce8da49ce Amir Goldstein 2022-05-07 572 fsnotify_first_mark(&dir1->i_fsnotify_marks);
d25f3ce8da49ce Amir Goldstein 2022-05-07 573 if (dir2)
d25f3ce8da49ce Amir Goldstein 2022-05-07 574 iter_info.marks[FSNOTIFY_ITER_TYPE_NEW_DIR] =
d25f3ce8da49ce Amir Goldstein 2022-05-07 575 fsnotify_first_mark(&dir2->i_fsnotify_marks);
497b0c5a7c0688 Amir Goldstein 2020-07-16 576 }
75c1be487a690d Eric Paris 2010-07-28 577
8edc6e1688fc8f Jan Kara 2014-11-13 578 /*
60f7ed8c7c4d06 Amir Goldstein 2018-09-01 579 * We need to merge inode/vfsmount/sb mark lists so that e.g. inode mark
60f7ed8c7c4d06 Amir Goldstein 2018-09-01 580 * ignore masks are properly reflected for mount/sb mark notifications.
8edc6e1688fc8f Jan Kara 2014-11-13 581 * That's why this traversal is so complicated...
8edc6e1688fc8f Jan Kara 2014-11-13 582 */
d9a6f30bb89309 Amir Goldstein 2018-04-20 583 while (fsnotify_iter_select_report_types(&iter_info)) {
b54cecf5e2293d Amir Goldstein 2020-06-07 584 ret = send_to_group(mask, data, data_type, dir, file_name,
b54cecf5e2293d Amir Goldstein 2020-06-07 585 cookie, &iter_info);
613a807fe7c793 Eric Paris 2010-07-28 586
ff8bcbd03da881 Eric Paris 2010-10-28 587 if (ret && (mask & ALL_FSNOTIFY_PERM_EVENTS))
ff8bcbd03da881 Eric Paris 2010-10-28 588 goto out;
ff8bcbd03da881 Eric Paris 2010-10-28 589
d9a6f30bb89309 Amir Goldstein 2018-04-20 590 fsnotify_iter_next(&iter_info);
90586523eb4b34 Eric Paris 2009-05-21 591 }
ff8bcbd03da881 Eric Paris 2010-10-28 592 ret = 0;
ff8bcbd03da881 Eric Paris 2010-10-28 593 out:
9385a84d7e1f65 Jan Kara 2016-11-10 594 srcu_read_unlock(&fsnotify_mark_srcu, iter_info.srcu_idx);
c4ec54b40d33f8 Eric Paris 2009-12-17 595
98b5c10d320adf Jean-Christophe Dubois 2010-03-23 596 return ret;
90586523eb4b34 Eric Paris 2009-05-21 597 }
--
0-DAY CI Kernel Test Service
https://01.org/lkp
next reply other threads:[~2022-05-07 19:26 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-05-07 19:26 kernel test robot [this message]
2022-05-09 10:08 ` [amir73il:fsnotify-fixes 2/2] fs/notify/fsnotify.c:540 fsnotify() warn: variable dereferenced before check 'dir1' (see line 499) Dan Carpenter
2022-05-09 10:08 ` Dan Carpenter
2022-05-09 11:48 ` Amir Goldstein
2022-05-09 11:48 ` Amir Goldstein
2022-05-12 9:32 ` [kbuild-all] " Chen, Rong A
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=202205080346.m0fb3UXK-lkp@intel.com \
--to=lkp@intel.com \
--cc=kbuild@lists.01.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.