On Thu, 21 Mar 2024 at 14:13:38 +0500, Andrey Rakhmatullin wrote:
> On Wed, Mar 20, 2024 at 03:05:34AM +0000, Thorsten Glaser wrote:
> > cc -Ilibumockdev-preload.so.0.0.0.p -I. -I.. -fdiagnostics-color=always 
> > -Wall -Winvalid-pch -std=gnu11 -Werror=missing-prototypes 
> > -Werror=strict-prototypes -Werror=nested-externs -Werror=pointer-arith 
> > -Werror=implicit-function-declaration -Werror=implicit-int 
> > -Werror=int-conversion -Werror=old-style-definition -Werror=pointer-arith 
> > -Werror=init-self -Werror=format-security -Werror=format=2 
> > -Werror=return-type -Werror=uninitialized -Wcast-align -Wno-error=pragmas 
> > -Wno-error=discarded-qualifiers -Wno-error=incompatible-pointer-types 
> > -Wno-error=pointer-sign -Wno-unused-but-set-variable -Wno-unused-function 
> > -Wno-unused-label -Wno-unused-value -Wno-unused-variable -g -O2 
> > -Werror=implicit-function-declaration -ffile-prefix-map=/<<PKGBUILDDIR>>=. 
> > -specs=/usr/share/dpkg/pie-compile.specs -fstack-protector-strong -Wformat 
> > -Werror=format-security -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 
> > -D_TIME_BITS=64 -Wdate-time -D_FORTIFY_SOURCE=2 -fPIC -fvisibility=default 
> > -MD -MQ libumockdev-preload.so.0.0.0.p/src_libumockdev-preload.c.o -MF 
> > libumockdev-preload.so.0.0.0.p/src_libumockdev-preload.c.o.d -o 
> > libumockdev-preload.so.0.0.0.p/src_libumockdev-preload.c.o -c 
> > ../src/libumockdev-preload.c
> > In file included from /usr/include/features.h:393,
> >                  from /usr/include/assert.h:35,
> >                  from ../src/libumockdev-preload.c:31:
> > /usr/include/features-time64.h:26:5: error: #error "_TIME_BITS=64 is 
> > allowed only with _FILE_OFFSET_BITS=64"
> >    26 | #   error "_TIME_BITS=64 is allowed only with _FILE_OFFSET_BITS=64"
> >       |     ^~~~~
> > 
> > 
> > I admit I don’t exactly see what’s going on here. Does it
> > maybe #unset _FILE_OFFSET_BITS or something?
> It does. src/libumockdev-preload.c:
> 
> /* override -D_FILE_OFFSET_BITS, it breaks us */
> #undef _FILE_OFFSET_BITS
> 
> This has the same roots as
> https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1065973 as this file
> says "The initial code for intercepting function calls was inspired and
> partially copied from kmod's testsuite". Maybe it can also have the same
> fix (but that bug isn't fixed yet, though it has a proposed fix).

This appears to be because umockdev is based on a LD_PRELOAD module that
interposes wrapped or mock versions of glibc functions like stat() that
are sensitive to the sizes of off_t and time_t.

I don't think the proposed fix in kmod is correct, and I don't think
an equivalent in umockdev would be correct either. Since glibc 2.34,
on 32-bit architectures all such LD_PRELOAD modules will need updating
to also wrap __lstat64_time64(), __stat64_time64(), __fstat64_time64()
and __fstatat64_time64() on architectures where they exist - otherwise,
programs and libraries compiled with 64-bit time_t will bypass the
wrapped stat(), stat64() etc. and call __stat64_time64() instead, and
therefore the wrapping will be ineffective and umockdev's mock devices
will not be seen.

fakeroot, fakechroot and other LD_PRELOAD modules that interpose stat()
will already be doing something similar, and might provide a useful
reference for what is needed. Here's the equivalent in fakechroot:
https://github.com/dex4er/fakechroot/pull/104/commits/dac74cd68cfb6eeaae9cd13bdc48737a44980df9

    smcv

Reply via email to