fs/attr.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
Variable `now` is declared without initialization. The variable
could be accessed inside the if-else statements following the
variable declaration, before it has been initialized.
This patch initializes the variable to
`inode_set_ctime_current(inode)` by default.
This issue was reported by Coverity Scan.
Signed-off-by: Everest K.C. <everestkc@everestkc.com.np>
---
fs/attr.c | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/fs/attr.c b/fs/attr.c
index c614b954bda5..77523af2e62d 100644
--- a/fs/attr.c
+++ b/fs/attr.c
@@ -284,7 +284,7 @@ EXPORT_SYMBOL(inode_newsize_ok);
static void setattr_copy_mgtime(struct inode *inode, const struct iattr *attr)
{
unsigned int ia_valid = attr->ia_valid;
- struct timespec64 now;
+ struct timespec64 now = inode_set_ctime_current(inode);
if (ia_valid & ATTR_CTIME) {
/*
@@ -293,8 +293,6 @@ static void setattr_copy_mgtime(struct inode *inode, const struct iattr *attr)
*/
if (ia_valid & ATTR_DELEG)
now = inode_set_ctime_deleg(inode, attr->ia_ctime);
- else
- now = inode_set_ctime_current(inode);
} else {
/* If ATTR_CTIME isn't set, then ATTR_MTIME shouldn't be either. */
WARN_ON_ONCE(ia_valid & ATTR_MTIME);
--
2.43.0
On Wed, Oct 09, 2024 at 02:05:25PM -0600, Everest K.C. wrote:
> Variable `now` is declared without initialization. The variable
> could be accessed inside the if-else statements following the
> variable declaration, before it has been initialized.
>
> This patch initializes the variable to
> `inode_set_ctime_current(inode)` by default.
>
> This issue was reported by Coverity Scan.
>
> Signed-off-by: Everest K.C. <everestkc@everestkc.com.np>
Fixes: d8d11298e8a1 ("fs: handle delegated timestamps in setattr_copy_mgtime")
Maybe the WARN_ON_ONCE() should be updated to check ATTR_ATIME as well?
regards,
dan carpenter
> ---
> fs/attr.c | 4 +---
> 1 file changed, 1 insertion(+), 3 deletions(-)
>
> diff --git a/fs/attr.c b/fs/attr.c
> index c614b954bda5..77523af2e62d 100644
> --- a/fs/attr.c
> +++ b/fs/attr.c
> @@ -284,7 +284,7 @@ EXPORT_SYMBOL(inode_newsize_ok);
> static void setattr_copy_mgtime(struct inode *inode, const struct iattr *attr)
> {
> unsigned int ia_valid = attr->ia_valid;
> - struct timespec64 now;
> + struct timespec64 now = inode_set_ctime_current(inode);
>
> if (ia_valid & ATTR_CTIME) {
> /*
> @@ -293,8 +293,6 @@ static void setattr_copy_mgtime(struct inode *inode, const struct iattr *attr)
> */
> if (ia_valid & ATTR_DELEG)
> now = inode_set_ctime_deleg(inode, attr->ia_ctime);
> - else
> - now = inode_set_ctime_current(inode);
> } else {
> /* If ATTR_CTIME isn't set, then ATTR_MTIME shouldn't be either. */
> WARN_ON_ONCE(ia_valid & ATTR_MTIME);
> --
> 2.43.0
>
On Wed, 2024-10-09 at 23:45 +0300, Dan Carpenter wrote:
> On Wed, Oct 09, 2024 at 02:05:25PM -0600, Everest K.C. wrote:
> > Variable `now` is declared without initialization. The variable
> > could be accessed inside the if-else statements following the
> > variable declaration, before it has been initialized.
> >
> > This patch initializes the variable to
> > `inode_set_ctime_current(inode)` by default.
> >
> > This issue was reported by Coverity Scan.
> >
> > Signed-off-by: Everest K.C. <everestkc@everestkc.com.np>
>
> Fixes: d8d11298e8a1 ("fs: handle delegated timestamps in setattr_copy_mgtime")
>
> Maybe the WARN_ON_ONCE() should be updated to check ATTR_ATIME as well?
>
> regards,
> dan carpenter
>
> > ---
> > fs/attr.c | 4 +---
> > 1 file changed, 1 insertion(+), 3 deletions(-)
> >
> > diff --git a/fs/attr.c b/fs/attr.c
> > index c614b954bda5..77523af2e62d 100644
> > --- a/fs/attr.c
> > +++ b/fs/attr.c
> > @@ -284,7 +284,7 @@ EXPORT_SYMBOL(inode_newsize_ok);
> > static void setattr_copy_mgtime(struct inode *inode, const struct iattr *attr)
> > {
> > unsigned int ia_valid = attr->ia_valid;
> > - struct timespec64 now;
> > + struct timespec64 now = inode_set_ctime_current(inode);
> >
> > if (ia_valid & ATTR_CTIME) {
> > /*
> > @@ -293,8 +293,6 @@ static void setattr_copy_mgtime(struct inode *inode, const struct iattr *attr)
> > */
> > if (ia_valid & ATTR_DELEG)
> > now = inode_set_ctime_deleg(inode, attr->ia_ctime);
> > - else
> > - now = inode_set_ctime_current(inode);
> > } else {
> > /* If ATTR_CTIME isn't set, then ATTR_MTIME shouldn't be either. */
> > WARN_ON_ONCE(ia_valid & ATTR_MTIME);
> > --
> > 2.43.0
> >
This doesn't look correct. inode_set_ctime_current will update the time
to the current time and then inode_set_ctime_deleg() won't work
properly if the time being set is earlier than that.
I proposed a different fix earlier today which should be correct:
https://lore.kernel.org/linux-fsdevel/20241009-mgtime-v1-1-383b9e0481b5@kernel.org/
Thanks,
--
Jeff Layton <jlayton@kernel.org>
On Wed, Oct 9, 2024 at 4:40 PM Jeff Layton <jlayton@kernel.org> wrote:
>
> On Wed, 2024-10-09 at 23:45 +0300, Dan Carpenter wrote:
> > On Wed, Oct 09, 2024 at 02:05:25PM -0600, Everest K.C. wrote:
> > > Variable `now` is declared without initialization. The variable
> > > could be accessed inside the if-else statements following the
> > > variable declaration, before it has been initialized.
> > >
> > > This patch initializes the variable to
> > > `inode_set_ctime_current(inode)` by default.
> > >
> > > This issue was reported by Coverity Scan.
> > >
> > > Signed-off-by: Everest K.C. <everestkc@everestkc.com.np>
> >
> > Fixes: d8d11298e8a1 ("fs: handle delegated timestamps in setattr_copy_mgtime")
> >
> > Maybe the WARN_ON_ONCE() should be updated to check ATTR_ATIME as well?
> >
> > regards,
> > dan carpenter
> >
> > > ---
> > > fs/attr.c | 4 +---
> > > 1 file changed, 1 insertion(+), 3 deletions(-)
> > >
> > > diff --git a/fs/attr.c b/fs/attr.c
> > > index c614b954bda5..77523af2e62d 100644
> > > --- a/fs/attr.c
> > > +++ b/fs/attr.c
> > > @@ -284,7 +284,7 @@ EXPORT_SYMBOL(inode_newsize_ok);
> > > static void setattr_copy_mgtime(struct inode *inode, const struct iattr *attr)
> > > {
> > > unsigned int ia_valid = attr->ia_valid;
> > > - struct timespec64 now;
> > > + struct timespec64 now = inode_set_ctime_current(inode);
> > >
> > > if (ia_valid & ATTR_CTIME) {
> > > /*
> > > @@ -293,8 +293,6 @@ static void setattr_copy_mgtime(struct inode *inode, const struct iattr *attr)
> > > */
> > > if (ia_valid & ATTR_DELEG)
> > > now = inode_set_ctime_deleg(inode, attr->ia_ctime);
> > > - else
> > > - now = inode_set_ctime_current(inode);
> > > } else {
> > > /* If ATTR_CTIME isn't set, then ATTR_MTIME shouldn't be either. */
> > > WARN_ON_ONCE(ia_valid & ATTR_MTIME);
> > > --
> > > 2.43.0
> > >
>
> This doesn't look correct. inode_set_ctime_current will update the time
> to the current time and then inode_set_ctime_deleg() won't work
> properly if the time being set is earlier than that.
Yes. I get it now.
> I proposed a different fix earlier today which should be correct:
>
> https://lore.kernel.org/linux-fsdevel/20241009-mgtime-v1-1-383b9e0481b5@kernel.org/
> Thanks,
> --
> Jeff Layton <jlayton@kernel.org>
Thanks,
Everest K.C.
On Wed, Oct 9, 2024 at 2:45 PM Dan Carpenter <dan.carpenter@linaro.org> wrote:
>
> On Wed, Oct 09, 2024 at 02:05:25PM -0600, Everest K.C. wrote:
> > Variable `now` is declared without initialization. The variable
> > could be accessed inside the if-else statements following the
> > variable declaration, before it has been initialized.
> >
> > This patch initializes the variable to
> > `inode_set_ctime_current(inode)` by default.
> >
> > This issue was reported by Coverity Scan.
> >
> > Signed-off-by: Everest K.C. <everestkc@everestkc.com.np>
>
> Fixes: d8d11298e8a1 ("fs: handle delegated timestamps in setattr_copy_mgtime")
>
> Maybe the WARN_ON_ONCE() should be updated to check ATTR_ATIME as well?
I am not sure about that, but even if that is necessary. I think it
should be handled in a different patch.
> regards,
> dan carpenter
>
> > ---
> > fs/attr.c | 4 +---
> > 1 file changed, 1 insertion(+), 3 deletions(-)
> >
> > diff --git a/fs/attr.c b/fs/attr.c
> > index c614b954bda5..77523af2e62d 100644
> > --- a/fs/attr.c
> > +++ b/fs/attr.c
> > @@ -284,7 +284,7 @@ EXPORT_SYMBOL(inode_newsize_ok);
> > static void setattr_copy_mgtime(struct inode *inode, const struct iattr *attr)
> > {
> > unsigned int ia_valid = attr->ia_valid;
> > - struct timespec64 now;
> > + struct timespec64 now = inode_set_ctime_current(inode);
> >
> > if (ia_valid & ATTR_CTIME) {
> > /*
> > @@ -293,8 +293,6 @@ static void setattr_copy_mgtime(struct inode *inode, const struct iattr *attr)
> > */
> > if (ia_valid & ATTR_DELEG)
> > now = inode_set_ctime_deleg(inode, attr->ia_ctime);
> > - else
> > - now = inode_set_ctime_current(inode);
> > } else {
> > /* If ATTR_CTIME isn't set, then ATTR_MTIME shouldn't be either. */
> > WARN_ON_ONCE(ia_valid & ATTR_MTIME);
> > --
> > 2.43.0
> >
On 10/9/24 14:05, Everest K.C. wrote:
> Variable `now` is declared without initialization. The variable
> could be accessed inside the if-else statements following the
> variable declaration, before it has been initialized.
It could be, but it isn't. I am not sure if this change is needed.
>
> This patch initializes the variable to
> `inode_set_ctime_current(inode)` by default.
Instead of "This patch initializes", change it to "Initialize ..."
Do refer to submitting patches document for information on how
to write change logs.
>
> This issue was reported by Coverity Scan.
Include the the error/report from Coverity.
>
> Signed-off-by: Everest K.C. <everestkc@everestkc.com.np>
> ---
> fs/attr.c | 4 +---
> 1 file changed, 1 insertion(+), 3 deletions(-)
>
> diff --git a/fs/attr.c b/fs/attr.c
> index c614b954bda5..77523af2e62d 100644
> --- a/fs/attr.c
> +++ b/fs/attr.c
> @@ -284,7 +284,7 @@ EXPORT_SYMBOL(inode_newsize_ok);
> static void setattr_copy_mgtime(struct inode *inode, const struct iattr *attr)
> {
> unsigned int ia_valid = attr->ia_valid;
> - struct timespec64 now;
> + struct timespec64 now = inode_set_ctime_current(inode);
>
> if (ia_valid & ATTR_CTIME) {
> /*
> @@ -293,8 +293,6 @@ static void setattr_copy_mgtime(struct inode *inode, const struct iattr *attr)
> */
> if (ia_valid & ATTR_DELEG)
> now = inode_set_ctime_deleg(inode, attr->ia_ctime);
> - else
> - now = inode_set_ctime_current(inode);
The code is clear and easy to read the way it is since it handles both cases
and does appropriate initialization.
> } else {
> /* If ATTR_CTIME isn't set, then ATTR_MTIME shouldn't be either. */
> WARN_ON_ONCE(ia_valid & ATTR_MTIME);
I will leave it up to the maintainers to decide whether to take
this change or not.
thanks,
-- Shuah
On Wed, Oct 9, 2024 at 2:38 PM Shuah Khan <skhan@linuxfoundation.org> wrote:
>
> On 10/9/24 14:05, Everest K.C. wrote:
> > Variable `now` is declared without initialization. The variable
> > could be accessed inside the if-else statements following the
> > variable declaration, before it has been initialized.
>
> It could be, but it isn't. I am not sure if this change is needed.
If you look at the full code then, if `ia_valid & ATTR_CTIME`
evaluates to False then now is never initialized.
> > This patch initializes the variable to
> > `inode_set_ctime_current(inode)` by default.
>
> Instead of "This patch initializes", change it to "Initialize ..."
> Do refer to submitting patches document for information on how
> to write change logs.
Will do that and send V2.
> >
> > This issue was reported by Coverity Scan.
>
> Include the the error/report from Coverity.
Will do that and send V2.
> >
> > Signed-off-by: Everest K.C. <everestkc@everestkc.com.np>
> > ---
> > fs/attr.c | 4 +---
> > 1 file changed, 1 insertion(+), 3 deletions(-)
> >
> > diff --git a/fs/attr.c b/fs/attr.c
> > index c614b954bda5..77523af2e62d 100644
> > --- a/fs/attr.c
> > +++ b/fs/attr.c
> > @@ -284,7 +284,7 @@ EXPORT_SYMBOL(inode_newsize_ok);
> > static void setattr_copy_mgtime(struct inode *inode, const struct iattr *attr)
> > {
> > unsigned int ia_valid = attr->ia_valid;
> > - struct timespec64 now;
> > + struct timespec64 now = inode_set_ctime_current(inode);
> >
> > if (ia_valid & ATTR_CTIME) {
> > /*
> > @@ -293,8 +293,6 @@ static void setattr_copy_mgtime(struct inode *inode, const struct iattr *attr)
> > */
> > if (ia_valid & ATTR_DELEG)
> > now = inode_set_ctime_deleg(inode, attr->ia_ctime);
> > - else
> > - now = inode_set_ctime_current(inode);
>
> The code is clear and easy to read the way it is since it handles both cases
> and does appropriate initialization.
Yes, I agree, but if we initialize now to the current time during its
declaration then the else
condition won't be necessary.
>
> > } else {
> > /* If ATTR_CTIME isn't set, then ATTR_MTIME shouldn't be either. */
> > WARN_ON_ONCE(ia_valid & ATTR_MTIME);
>
> I will leave it up to the maintainers to decide whether to take
> this change or not.
>
> thanks,
> -- Shuah
© 2016 - 2026 Red Hat, Inc.