Browse Source

libfuse: fix narrowing conversion of nsec fields on i386 (#1593)

On 32 bit platforms tv_nsec is a signed long while the FUSE setattr
arguments provide nanoseconds as uint32_t. C++17 treats uint32_t -> long
in a brace initializer as a narrowing conversion and rejects it on ILP32
targets. This surfaced when building on FreeBSD i386 with clang 19 where
the compiler refused the list initialization of struct timespec.

Add explicit static_cast<long>() for the nsec fields to make the
conversion intentional and portable. This avoids build failures on i386
while leaving 64 bit builds unchanged.
master
Emanuel Haupt 2 days ago
committed by GitHub
parent
commit
d8918458bf
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 4
      libfuse/lib/fuse.cpp

4
libfuse/lib/fuse.cpp

@ -1636,12 +1636,12 @@ fuse_lib_setattr(fuse_req_t *req_,
if(arg->valid & FATTR_ATIME_NOW)
tv[0].tv_nsec = UTIME_NOW;
else if(arg->valid & FATTR_ATIME)
tv[0] = (struct timespec){ static_cast<time_t>(arg->atime), arg->atimensec };
tv[0] = (struct timespec){ static_cast<time_t>(arg->atime), static_cast<long>(arg->atimensec) };
if(arg->valid & FATTR_MTIME_NOW)
tv[1].tv_nsec = UTIME_NOW;
else if(arg->valid & FATTR_MTIME)
tv[1] = (struct timespec){ static_cast<time_t>(arg->mtime), arg->mtimensec };
tv[1] = (struct timespec){ static_cast<time_t>(arg->mtime), static_cast<long>(arg->mtimensec) };
err = ((fusepath != NULL) ?
f.ops.utimens(&req_->ctx,&fusepath[1],tv) :

Loading…
Cancel
Save