https://bugs.exim.org/show_bug.cgi?id=1749

--- Comment #37 from Petr Pisar <ppi...@redhat.com> ---
(In reply to Zoltan Herczeg from comment #36)
> Landed another big patch which adds allocator support for other CPUs except
> Tile-GX. The good (bad) news is that on-the-fly code modifications are
> available again regardless of allocator. However it is not tested on real
> hardware only in qemu, which seems have issues with dual mapped files. Would
> be good to test the JIT compiler regression tests on real hardware as well.
> 
A build the SVN code and run tests without and with
-DSLJIT_PROT_EXECUTABLE_ALLOCATOR=1 on with JIT enabled where supported on
these platforms without any failure:

aarch64
i686
ppc
ppc64le
ppc64
s390
s390x
x86_64

All the tests were run without SELinux enforcing.

Running the tests with SELinux enforcing W^X pages on all of the platforms
would require more time, thus I checked only on my x86_64 workstation and I can
state it works.

> > If the code checked for the error and propagated it back to the
> > pcre2_jit_compile(), applications could handle it in the same way as if JIT
> > was unavailable at all (pcre2_jit_compile() would return
> > PCRE2_ERROR_JIT_BADOPTION).
> 
> I am not sure I understand the reason behind this. The allocator may open
> several 64K+ tmp files, and if some of them are not successful, why should
> we return with BADOPTION? And PCRE always falls back to interpreted mode
> regardless of error.
> 
If the JIT allocator cannot open the temporary file, it will pcre2grep tool
will fail with "Error in command-line regex at offset 7: no more memory". If
the library returned BADOPTION, the tool would conclude that JIT is not
available and could continue.

You can try it with:

# chmod 01770 /tmp
$ make check

The pcre2grep tests will fail with "no more memory", fastjit pcre2test tests
will segfault and pcre2_jit_test will fail with "JIT compiler does not
support...". 

While I admit running the tests with this condition is quite artificial, it's
quite common that secure-tightened daemons are not allowed to write to any file
system. Then these daemons would fail.

pcre2_jit_compile(3) reads:

       The  yield  of  the function is 0 for success, or a negative error code
       otherwise.  In particular, PCRE2_ERROR_JIT_BADOPTION is returned if JIT
       is not supported or if an unknown bit is set in options.

I think it's more correct to return PCRE2_ERROR_JIT_BADOPTION than
PCRE2_ERROR_NOMEMORY from pcre2_jit_compile() in this case because the result
is that such system does not support JIT. Not that the system does not have
free memory. Applications tends to raise an error in case of
PCRE2_ERROR_NOMEMORY while they ignore the error in case of
PCRE2_ERROR_JIT_BADOPTION. At least this is how I would write an application
after reading the pcre2_jit_compile(3) manual.

But you can be right especially if the JIT compiler does multiple allocations
and only a subsequent allocation fails. Then probably the easiest solution is
keep the JIT code as it is and only amend pcre2_jit_compile(3) documentation
stating it is safe to ingnore pcre2_jit_compile(3) failure if the application
is not going to use JIT specific functions later.

> I also don't understand the following sentence:
> 
> > The environment variable TMPDIR, if it is defined. For security reasons
> > this only happens if the program is not SUID or SGID enabled.
> 
> This is again some security feature I don't understand. The echo $TMPDIR
> yields nothing on my system.

Some programs create fix-named temporary files. If an attacker can control
TMPDIR environment variable, SUID program would write to directory of
attacker's choice and the final file could coincide with a file the attacker
does not have access otherwise.

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-- 
## List details at https://lists.exim.org/mailman/listinfo/pcre-dev 

Reply via email to