platform/upstream/elfutils.git
3 years agodebuginfod: Turn -d ":memory:" into -d "file::memory:?cache=shared"
Mark Wielaard [Sat, 28 Aug 2021 18:25:56 +0000 (20:25 +0200)]
debuginfod: Turn -d ":memory:" into -d "file::memory:?cache=shared"

debuginfod opens the database twice, once in read/wrote and once in
read-only mode. This means the magic ":memory:" in-memory database
cannot be used as is because the two connections don't really share
the underlying database. Fix this by turning ":memory:" into
":file::memory:?cache=shared" which makes the in-memory database
shared. See https://sqlite.org/inmemorydb.html

Document this in debuginfod.8 and make some tests use -d :memory:

Signed-off-by: Mark Wielaard <mark@klomp.org>
3 years agotests: Use fresh separate databases for debuginfd forwarded-ttl-limit
Mark Wielaard [Sat, 28 Aug 2021 13:54:18 +0000 (15:54 +0200)]
tests: Use fresh separate databases for debuginfd forwarded-ttl-limit

Sharing the database between the two debuginfod instances that forward
queries to each other causes issues. Make both debuginfod instances
use a new fresh database.

Signed-off-by: Mark Wielaard <mark@klomp.org>
3 years agodebuginfod: PR27917 - protect against federation loops
Di Chen [Fri, 20 Aug 2021 05:03:21 +0000 (13:03 +0800)]
debuginfod: PR27917 - protect against federation loops

If someone misconfigures a debuginfod federation to have loops, and
a nonexistent buildid lookup is attempted, bad things will happen,
as is documented.

This patch aims to reduce the risk by adding an option to debuginfod
that functions kind of like an IP packet's TTL: a limit on the length of
XFF: header that debuginfod is willing to process. If X-Forwarded-For:
exceeds N hops, it will not delegate a local lookup miss to upstream
debuginfods.

Commit ab38d167c40c99 causes federation loops for non-existent resources
to result in multiple temporary deadlocks, each lasting for
$DEBUGINFOD_TIMEOUT seconds. Since concurrent requests for each unique
resource are now serialized, federation loops can result in one server
thread waiting to acquire a lock while the server thread holding the
lock waits for the first thread to respond to an http request.

This PR can help protect against the above multiple temporary deadlocks
behaviour. Ex. if --forwarded-ttl-limit=0 then the timeout behaviour of
local loops should be avoided.

https://sourceware.org/bugzilla/show_bug.cgi?id=27917

Signed-off-by: Di Chen <dichen@redhat.com>
3 years agoAdd lib/error.c
Mark Wielaard [Fri, 27 Aug 2021 16:47:30 +0000 (18:47 +0200)]
Add lib/error.c

This new file was supposed to be part of 4d6dd0e5a "lib: avoid potential
problems with `-fno-common`".

Signed-off-by: Mark Wielaard <mark@klomp.org>
3 years agolib: avoid potential problems with `-fno-common`
Saleem Abdulrasool [Fri, 27 Aug 2021 15:51:47 +0000 (15:51 +0000)]
lib: avoid potential problems with `-fno-common`

This properly homes the fallback function into a translation unit rather
than trying to define an inline common definition for the fallback path.
The intent of the original approach was to actually simply avoid adding
a new source file that is used for the fallback path.  However, that may
cause trouble with multiple definitions if the symbol does not get vague
linkage (which itself is not particularly great).  This simplifies the
behaviour at the cost of an extra inode.

3 years agolib: remove unused `STROF` definition (NFC)
Saleem Abdulrasool [Fri, 27 Aug 2021 15:20:13 +0000 (15:20 +0000)]
lib: remove unused `STROF` definition (NFC)

This definition was in the fallback path, where `sys/cdefs.h` is not
available.  Now that we have a single path through here, this macro gets
defined, though is unused.  Remove the unused macro definition.

Signed-off-by: Saleem Abdulrasool <abdulras@google.com>
3 years agohandle libc implementations which do not provide `error.h`
Saleem Abdulrasool [Fri, 20 Aug 2021 20:28:23 +0000 (20:28 +0000)]
handle libc implementations which do not provide `error.h`

Introduce a configure time check for the presence of `error.h`.  In the
case that `error.h` is not available, we can fall back to `err.h`.
Although `err.h` is not a C standard header (it is a BSD extension),
many libc implementations provide.  If there are targets which do not
provide an implementation of `err.h`, it would be possible to further
extend the implementation to be more portable.

This resolves bug #21008.

Signed-off-by: Saleem Abdulrasool <abdulras@google.com>
3 years agodebuginfod, elfclassify: remove unnecessary header inclusion
Saleem Abdulrasool [Fri, 20 Aug 2021 18:21:20 +0000 (18:21 +0000)]
debuginfod, elfclassify: remove unnecessary header inclusion

`error.h`'s inclusion was centralised into the `system.h` header.  As
the implementation currently includes `system.h` already, the inclusion
of `error.h` is unnecessary.  This prepares for a future portability
change to allow elfutil to build with alternate libc implementations.

Signed-off-by: Saleem Abdulrasool <abdulras@google.com>
3 years agolib: remove usage of `sys/cdefs.h`
Saleem Abdulrasool [Fri, 20 Aug 2021 18:20:08 +0000 (18:20 +0000)]
lib: remove usage of `sys/cdefs.h`

This header is a BSD header that is also available in glibc.  However,
this is a not a standard C header and was used for `__CONCAT`.  Because
this is not a standard header, not all libc implementations provide the
header.  Remove the usage of the header and always use the previously
fallback path.  This is needed in order to build with musl.

Signed-off-by: Saleem Abdulrasool <abdulras@google.com>
3 years agoPR27950 - package new debuginfod-client-config.7 man page in rpm
Frank Ch. Eigler [Fri, 20 Aug 2021 17:54:55 +0000 (13:54 -0400)]
PR27950 - package new debuginfod-client-config.7 man page in rpm

The template rpm spec file needs to include the new .7 page in all the
subrpms whose man pages may .so it.

Signed-off-by: Frank Ch. Eigler <fche@redhat.com>
3 years agoPR28249: correct debuginfod after-you locking
Frank Ch. Eigler [Thu, 19 Aug 2021 17:11:11 +0000 (13:11 -0400)]
PR28249: correct debuginfod after-you locking

The initial code for bug #27673 accidentally nuked all buildid service
concurrency, not just identical concurrent requests.  Correct this
with one-liner patch.  Observing the effect in the automated testsuite
is difficult, so hand-tested against large requests and short ones,
run in an interleaved way.

Signed-off-by: Frank Ch. Eigler <fche@redhat.com>
3 years agodebuginfod-doc: PR27950: make distcheck happy
Frank Ch. Eigler [Wed, 11 Aug 2021 23:32:29 +0000 (19:32 -0400)]
debuginfod-doc: PR27950: make distcheck happy

The debuginfod-client-config.7 shouldn't be included twice in
notrans_dist_man7_MANS.

Signed-off-by: Frank Ch. Eigler <fche@redhat.com>
3 years agodebuginfod-doc: PR27950 - Remove redanduncies in man page.
Alice Zhang [Wed, 4 Aug 2021 20:50:44 +0000 (16:50 -0400)]
debuginfod-doc: PR27950 - Remove redanduncies in man page.

Create a new file, debuginfod-client-config.7, that holds all
environment variables and cache control files related info. Get rid of
repetitive definitions in three other files, instead, those files will
include the content of new file. Any future modification related to
environment variables and cache files will only require changes in one
file.

Signed-off-by: Alice Zhang <alizhang@redhat.com>
Signed-off-by: Frank Ch. Eigler <fche@redhat.com>
3 years agotests: Allow an extra pthread_kill frame in backtrace tests
Mark Wielaard [Wed, 4 Aug 2021 19:01:27 +0000 (21:01 +0200)]
tests: Allow an extra pthread_kill frame in backtrace tests

glibc 2.34 calls pthread_kill from the raise function. Before raise
directly called the (tg)kill syscall. So allow pthread_kill to be the
first frame in a backtrace where raise is expected. Also change some
asserts to fprintf plus abort to make it more clear why the testcase
fails.

https://sourceware.org/bugzilla/show_bug.cgi?id=28190

Signed-off-by: Mark Wielaard <mark@klomp.org>
3 years agodebuginfod: PR27982 - added DEBUGINFOD_MAXSIZE and DEBUGINFOD_MAXTIME
Noah Sanci [Mon, 26 Jul 2021 17:29:11 +0000 (13:29 -0400)]
debuginfod: PR27982 - added DEBUGINFOD_MAXSIZE and DEBUGINFOD_MAXTIME

DEBUGINFOD_TIMEOUT is a good way to catch servers that are too slow to
*start* transmitting a file.  But we have no way of limiting total
download time or space.  A user might prefer to have his debugger fetch
only quick & small files, and make do without the bigger ones.  Some
transitive dependencies of e.g. gnome programs are huge: 3GB of LLVM
debuginfo, 1GB of webkitgtk, etc. etc.
DEBUGINFOD_MAXSIZE and DEBUGINFOD_MAXTIME were added to dictate the
max download size and time of a debuginfod client. DEBUGINFOD_MAXSIZE
is handled server-side and is sent using the http header:
X-DEBUGINFOD-MAXSIZE. The client side then checks to ensure this maxsize
has been respected.

https://sourceware.org/bugzilla/show_bug.cgi?id=27982

Signed-off-by: Noah Sanci <nsanci@redhat.com>
3 years agoupdate Japanese translation
Hayatsu Shunsuke [Sun, 25 Jul 2021 06:50:30 +0000 (15:50 +0900)]
update Japanese translation

Signed-off-by: Hayatsu Shunsuke <hayatsu.shunsuke@gmail.com>
3 years agodebuginfod: PR27983 - ignore duplicate urls
Noah Sanci [Fri, 9 Jul 2021 18:53:10 +0000 (14:53 -0400)]
debuginfod: PR27983 - ignore duplicate urls

Gazing at server logs, one sees a minority of clients who appear to have
duplicate query traffic coming in: the same URL, milliseconds apart.
Chances are the user accidentally doubled her $DEBUGINFOD_URLS somehow,
and the client library is dutifully asking the servers TWICE. Bug #27863
reduces the pain on the servers' CPU, but dupe network traffic is still
being paid.  We should reject sending outright duplicate concurrent
traffic.
The urls are now simply removed upon finding a duplicate after url
construction.

https://sourceware.org/bugzilla/show_bug.cgi?id=27983

Signed-off-by: Noah Sanci <nsanci@redhat.com>
3 years agolib: Add static inline reallocarray fallback function
Mark Wielaard [Wed, 28 Jul 2021 14:46:36 +0000 (16:46 +0200)]
lib: Add static inline reallocarray fallback function

Signed-off-by: Mark Wielaard <mark@klomp.org>
3 years agodebuginfod: PR28034 - client-side %-escape url characters
Noah Sanci [Fri, 16 Jul 2021 19:16:20 +0000 (15:16 -0400)]
debuginfod: PR28034 - client-side %-escape url characters

When requesting some source files, some URL-inconvenient chars
sometimes pop up.  Example from f33 libstdc++:
/buildid/44d8485cb75512c2ca5c8f70afbd475cae30af4f/source/usr/src/debug/
gcc-10.3.1-1.fc33.x86_64/obj-x86_64-redhat-linux/x86_64-redhat-linux/
libstdc++-v3/src/c++11/../../../../../libstdc++-v3/src/c++11/
condition_variable.cc
As this URL is passed into debuginfod's handler_cb, it appears that the
+ signs are helpfully unescaped to spaces by libmicrohttpd, which
'course breaks everything.
In order to ensure the server properly parses urls such as this one,
%-escape characters on the client side so that the correct url
is preserved and properly processed on the server side.

https://sourceware.org/bugzilla/show_bug.cgi?id=28034

Signed-off-by: Noah Sanci <nsanci@redhat.com>
3 years agodebuginfod: Minor run-debuginfod-find.sh test fixes
Noah Sanci [Wed, 21 Jul 2021 18:52:07 +0000 (14:52 -0400)]
debuginfod: Minor run-debuginfod-find.sh test fixes

$PORT3's metrics are not reported on error and $PID4 was not properly
killed. This patch addresses both of those issues by reporting the
metrics of $PORT3 as $PORT1 and $PORT2 were in err() and waiting for
$PID4 to terminate before continuing with the test.

Signed-off-by: Noah Sanci <nsanci@redhat.com>
3 years agolibelf: Optimize elf_strptr.c validate_str by checking last char first
Mark Wielaard [Mon, 19 Jul 2021 13:52:51 +0000 (15:52 +0200)]
libelf: Optimize elf_strptr.c validate_str by checking last char first

In most cases the last char of the sectio will be zero. Check that
first before calling memrchr. This is a minor optimization in normal
cases. But it helps asan a lot by removing the memrchr call in most
cases.

https://sourceware.org/bugzilla/show_bug.cgi?id=28101

Signed-off-by: Mark Wielaard <mark@klomp.org>
3 years agoreadelf: Pull advance_pc() in file scope
Timm Bäder [Thu, 18 Mar 2021 09:25:24 +0000 (10:25 +0100)]
readelf: Pull advance_pc() in file scope

Make advance_pc() a static function so we can get rid of another nested
function. Rename it to run_advance_pc() and use a local advance_pc()
macro to pass all the local variables. This is similar to what the
equivalent code in libdw/dwarf_getsrclines.c is doing.

Signed-off-by: Timm Bäder <tbaeder@redhat.com>
3 years agodebuginfod: PR25978 - Created the prefetch fdcache
Noah [Thu, 10 Jun 2021 14:29:45 +0000 (10:29 -0400)]
debuginfod: PR25978 - Created the prefetch fdcache

The debuginfod fdcache-prefetch logic has been observed to show some
degeneracies in operation.  Since fdcache evictions are done
frequently, and freshly prefetched archive elements are put at the
back of lru[], each eviction round can summarily nuke things that
were just prefetched .... and are just going to be prefetched again.
It would be better to have two lru lists, or being able to insert
newly prefetched entries somewhere in the middle of the list rather
than at the very very end.

https://sourceware.org/bugzilla/show_bug.cgi?id=25978

Signed-off-by: Noah Sanci <nsanci@redhat.com>
3 years agoPR27531: retry within default retry_limit will be supported.
Alice Zhang [Tue, 6 Jul 2021 20:12:43 +0000 (16:12 -0400)]
PR27531: retry within default retry_limit will be supported.

In debuginfod-client.c (debuginfod_query_server),insert a
goto statement for jumping back to the beginning of curl
handles set up if query fails and a non ENOENT error is returned.

Also introduced DEBUGINFOD_RETRY_LIMIT_ENV_VAR and default
DEBUGINFOD_RETRY_LIMIT(which is 2).

Correponding test has been added to tests/run-debuginfod-find.sh

Signed-off-by: Alice Zhang <alizhang@redhat.com>
3 years agodebuginfod: PR27711 - Use -I/-X regexes during groom phase
Noah [Wed, 7 Jul 2021 18:40:10 +0000 (14:40 -0400)]
debuginfod: PR27711 - Use -I/-X regexes during groom phase

The debuginfod -I/-X regexes operate during traversal to identify
those files in need of scanning.  The regexes are not used during
grooming.  This means that if from run to run, the regex changes so
that formerly indexed files are excluded from traversal, the data is
still retained in the index.

This is both good and bad.  On one hand, if the underlying data is
still available, grooming will preserve the data, and let clients ask
for it.  On the other hand, if the growing index size is a problem,
and one wishes to age no-longer-regex-matching index data out, there
is no way.

Let's add a debuginfod flag to use regexes during grooming.
Specifically, in groom(), where the stat() test exists, also check
for regex matching as in scan_source_paths().  Treat failure of the
regex the same way as though the file didn't exist.

Signed-off-by: Noah Sanci <nsanci@redhat.com>
3 years agotests: Fix EXTRA_DIST typo in testfile-largealign.o.bz2
Mark Wielaard [Thu, 8 Jul 2021 09:44:26 +0000 (11:44 +0200)]
tests: Fix EXTRA_DIST typo in testfile-largealign.o.bz2

Signed-off-by: Mark Wielaard <mark@klomp.org>
3 years agolibelf: Fix unaligned d_off offsets for input sections with large alignments
Andrei Homescu [Tue, 29 Jun 2021 01:26:53 +0000 (18:26 -0700)]
libelf: Fix unaligned d_off offsets for input sections with large alignments

The mkl_memory_patched.o object inside the libmkl_core.a library from
the Intel Math Kernel Library version 2018.2.199 has this section
with an alignment of 4096 and offset of 0xb68:
 [ 2] .data PROGBITS 0000000000000000 000b68 011000 00 WA 0 0 4096

Reading this file with libelf and trying to write it back to disk triggers
the following sequence of events:
1) code in elf_getdata.c clamps d_align for this section's data buffer
   to the section's offset
2) code in elf32_updatenull.c checks if the alignment is a power of two
   and incorrectly returns an error

This commit fixes this corner case by increasing the alignment to the
next power of two after the clamping, so the check passes.

A test that reproduces this bug using strip is also included.

Signed-off-by: Andrei Homescu <ah@immunant.com>
3 years agoreadelf: Handle line tables without line number statements correctly
Mark Wielaard [Sat, 3 Jul 2021 22:08:32 +0000 (00:08 +0200)]
readelf: Handle line tables without line number statements correctly

When we see a line table without line number statements we need to
continue with the next table. Add a testcase for this situation.

https://sourceware.org/bugzilla/show_bug.cgi?id=28032

Signed-off-by: Mark Wielaard <mark@klomp.org>
3 years agoreadelf: Fix error message when two attribute names differ in in compare_listptr.
Mark Wielaard [Sat, 3 Jul 2021 16:56:54 +0000 (18:56 +0200)]
readelf: Fix error message when two attribute names differ in in compare_listptr.

We were printing the second attribute name twice. Print the first and second.

Reported-by: Gabriel Valky <gvalky@tachyum.com>
Signed-off-by: Mark Wielaard <mark@klomp.org>
3 years agounstrip: Always check gelf_getrel[a] results
Mark Wielaard [Fri, 18 Jun 2021 13:08:48 +0000 (15:08 +0200)]
unstrip: Always check gelf_getrel[a] results

Signed-off-by: Mark Wielaard <mark@klomp.org>
3 years agostrip: Always check gelf_update results.
Mark Wielaard [Fri, 18 Jun 2021 13:06:32 +0000 (15:06 +0200)]
strip: Always check gelf_update results.

Signed-off-by: Mark Wielaard <mark@klomp.org>
3 years agodebuginfod-client: Fix client dereference when calloc fails.
Mark Wielaard [Fri, 18 Jun 2021 13:02:43 +0000 (15:02 +0200)]
debuginfod-client: Fix client dereference when calloc fails.

When the calloc call in debuginfod_begin fails we should skip all
initialization of the client handle.

Signed-off-by: Mark Wielaard <mark@klomp.org>
3 years agorun-debuginfod-find.sh: Disable valgrind for debuginfod client cache tests
Mark Wielaard [Fri, 2 Jul 2021 18:26:52 +0000 (20:26 +0200)]
run-debuginfod-find.sh: Disable valgrind for debuginfod client cache tests

valgrind itself might use the debuginfod client. So disable valgrind
when testing the cache.

Signed-off-by: Mark Wielaard <mark@klomp.org>
3 years agodebuginfod test: fix groom/stale race condition
Frank Ch. Eigler [Wed, 16 Jun 2021 22:49:10 +0000 (18:49 -0400)]
debuginfod test: fix groom/stale race condition

Additional tracing, and use of "% make check VERBOSE=1" in a .spec
file allowed tracking down of this intermittent problem.  The race was
between a SIGUSR1 or two to a debuginfod server (triggering two
traverse/scan phases), followed shortly by a SIGUSR2 (triggering a
groom).  If those signals were received too close together, the groom
phase could be stopped early, and the rm'd files not noticed.

New testsuite code adds metric polls after SIGUSR1 & SIGUSR2 to ensure
the respective processing phases are complete.  It also turns on "set -x"
tracing, so as to avoid pulling out quite as much hair next time.
"make check VERBOSE=1" is also important for spec files.

Signed-off-by: Frank Ch. Eigler <fche@redhat.com>
3 years agodebuginfod tests: tolerate 000-perm files in cache-copy test
Frank Ch. Eigler [Wed, 16 Jun 2021 14:49:49 +0000 (10:49 -0400)]
debuginfod tests: tolerate 000-perm files in cache-copy test

It appears possible for 000-permission files to sneak into the
test debuginfod-cache, which cp (or find|cpio) refuse to copy.
These files are OK not to copy, so ignore the error and proceed.

Signed-off-by: Frank Ch. Eigler <fche@redhat.com>
3 years agodebuginfod tests: try to generate diagnostics more reliably on error
Frank Ch. Eigler [Wed, 16 Jun 2021 00:04:53 +0000 (20:04 -0400)]
debuginfod tests: try to generate diagnostics more reliably on error

Signed-off-by: Frank Ch. Eigler <fche@redhat.com>
3 years agolibdwfl: fix potential NULL pointer dereference when reading link map
Omar Sandoval [Thu, 10 Jun 2021 00:45:57 +0000 (17:45 -0700)]
libdwfl: fix potential NULL pointer dereference when reading link map

When read_addrs() was moved into file scope, there was a mistake in
converting "buffer" from a closure variable to a parameter: we are
checking whether the pointer argument is NULL, not whether the buffer
itself is NULL.  This causes a NULL pointer dereference when we try
to use the NULL buffer later.

Fixes: 3bf41d458fb6 ("link_map: Pull read_addrs() into file scope")
Signed-off-by: Omar Sandoval <osandov@fb.com>
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
3 years agoPR27863: debuginfod optimization for concurrent requests
Frank Ch. Eigler [Fri, 4 Jun 2021 12:40:11 +0000 (08:40 -0400)]
PR27863: debuginfod optimization for concurrent requests

Sometimes, due to configuration error, mishap, or DoS misadventure, a
debuginfod server may receive near-concurrent requests for the exact
same data from multiple clients.  In practically all cases, it is
beneficial to the clients, as well as the server, to serialize these
requests.  This way, debuginfod does not waste CPU in repeatedly &
concurrently decompressing large archives or querying upstream
servers.  Second and later requesters can benefit from the fdcache /
client-cache and get their results, probably earlier!

This patch adds an "after-you" queueing phase to servicing
http-buildid requests, whereby thereads serialize themselves on each
query URL being serviced at the moment.  Prometheus metrics are added,
and the http GET trace line is modified to print the queue+service
times separately.

Hand-tested on large kernel-debuginfo's, and shows host CPU refusing
to multiply in the face of concurrent identical queries.  The
automated test tries a hundred concurrent curls, at least some of
which are slow enough to trigger the "after-you" wait here.

Signed-off-by: Frank Ch. Eigler <fche@redhat.com>
3 years agoelflint: fix undefined 'buffer_left' reference
Sergei Trofimovich [Mon, 7 Jun 2021 21:37:42 +0000 (22:37 +0100)]
elflint: fix undefined 'buffer_left' reference

Link failure is reproducible on gcc-11.1.0 target:

```
$ autoreconf -i -f
$ ./configure --enable-maintainer-mode --disable-debuginfod \
    --host=x86_64-pc-linux-gnu \
    CFLAGS=-march=znver3 \
    CXXFLAGS=-march=znver3 \
    LDFLAGS=" "
$ make

  CCLD     elflint
ld: elflint.o: in function `check_attributes':
elflint.c:(.text+0xdcff): undefined reference to `buffer_left'
ld: elflint.c:(.text+0xe557): undefined reference to `buffer_left'
```

It happens due to possible external linkage of `buffer_left()`.

The change forces local linkage to always use local definition
(either inline or out-of-line).

Reported-by: Toralf Förster
Bug: https://bugs.gentoo.org/794601
Signed-off-by: Sergei Trofimovich <slyfox@gentoo.org>
Fixes: e95d1fbb ("elflint: Pull left() in file scope")
Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
3 years agoPrepare for 0.185 elfutils-0.185
Mark Wielaard [Sat, 22 May 2021 13:41:43 +0000 (15:41 +0200)]
Prepare for 0.185

Set version to 0.185
Update NEWS and elfutils.spec.in
Regenerate po/*.po files

Signed-off-by: Mark Wielaard <mark@klomp.org>
3 years agoPR27859: correct 404-latch bug in debuginfod client reuse
Frank Ch. Eigler [Fri, 14 May 2021 22:37:30 +0000 (18:37 -0400)]
PR27859: correct 404-latch bug in debuginfod client reuse

PR27701 implemented curl handle reuse in debuginfod_client objects,
but with an unexpected bug.  Server responses returning an error
"latched" because the curl_easy handles for error cases weren't all
systematically removed from the curl multi handle.  This prevented
their proper re-addition the next time.

This version of the code simplfies matters by making only the curl
curl_multi handle long-lived.  This turns out to be enough, because it
can maintain a pool of long-lived http/https connections and related
data, and lend them out to short-lived curl_easy handles.  This mode
handles errors or hung downloads even better, because the easy handles
don't undergo complex state transitions between reuse.

A new test case confirms this correction via the federating debuginfod
instance (cleaning caches between subtests to make sure http* is being
used and reused).

Signed-off-by: Frank Ch. Eigler <fche@redhat.com>
3 years agoelfcompress: fix exit status in case of an error
Dmitry V. Levin [Wed, 12 May 2021 16:00:00 +0000 (16:00 +0000)]
elfcompress: fix exit status in case of an error

Exit status of 255 in case of an error is probably not what elfcompress
users expect, change it to 1.

Reported-by: Vitaly Chikunov <vt@altlinux.org>
Fixes: 92acb57eb046 ("elfcompress: New utility.")

3 years agoelfcompress: remove redundant assignment
Dmitry V. Levin [Wed, 12 May 2021 15:00:00 +0000 (15:00 +0000)]
elfcompress: remove redundant assignment

At the point of "Nothing to do" fnew variable has not been assigned
after initialization, so it does not have to be reset to NULL.

Note that any reset of fnew to NULL has to preceded with free(fnew).

Fixes: ed62996defc6 ("elfcompress: Don't rewrite file if no section data needs to be updated.")

3 years agoelfcompress: fix exit status regression in case of "Nothing to do"
Dmitry V. Levin [Wed, 12 May 2021 15:00:00 +0000 (15:00 +0000)]
elfcompress: fix exit status regression in case of "Nothing to do"

When elfcompress decides that no section data needs to be updated and
therefore the file does not have to be rewritten, it still has to exit
with a zero status indicating success.

Resolves: https://sourceware.org/bugzilla/show_bug.cgi?id=27856
Fixes: c497478390de ("elfcompress: Replace cleanup() with label")

3 years agoCome up with startswith function.
Martin Liska [Mon, 19 Apr 2021 12:33:36 +0000 (14:33 +0200)]
Come up with startswith function.

New function in system.h that returns true if a string has a given
prefix, false otherwise.  Use it in place of strncmp.

Signed-off-by: Martin Liška <mliska@suse.cz>
3 years agoelfutils.spec: Add procps as a %check BuildRequires:.
Frank Ch. Eigler [Tue, 11 May 2021 19:57:42 +0000 (15:57 -0400)]
elfutils.spec: Add procps as a %check BuildRequires:.

On Fedora rawhide, we can no longer just assume ps(1) is there.

Signed-off-by: Frank Ch. Eigler <fche@redhat.com>
3 years agoPrepare for 0.184 elfutils-0.184
Mark Wielaard [Mon, 10 May 2021 12:13:53 +0000 (14:13 +0200)]
Prepare for 0.184

Set version to 0.184
Update NEWS and elfutils.spec.in
Regenerate po/*.po files

Signed-off-by: Mark Wielaard <mark@klomp.org>
3 years agolibdw: Document and handle DW_FORM_indirect in __libdw_form_val_compute_len
Mark Wielaard [Sat, 1 May 2021 16:00:49 +0000 (18:00 +0200)]
libdw: Document and handle DW_FORM_indirect in __libdw_form_val_compute_len

Update the documentation in __libdw_form_val_compute_len for handling
DW_FORM_indirect and make sure the indirect form isn't DW_FORM_indirect
itself or DW_FORM_implicit_const.

Signed-off-by: Mark Wielaard <mark@klomp.org>
3 years agodebuginfod: debuginfod client should cache negative results.
Alice Zhang via Elfutils-devel [Tue, 4 May 2021 20:25:59 +0000 (16:25 -0400)]
debuginfod: debuginfod client should cache negative results.

Add debuginfod_config_cache for reading and writing to cache
configuration files, make use of the function within
debuginfod_clean_cache and debuginfod_query_server.

In debuginfod_query_server, create 000-permission file on failed
queries. Before querying each BUILDID, if corresponding 000 file
detected, compare its stat mtime with parameter from
.cache/cache_miss_s. If mtime is fresher, then return ENOENT and
exit; otherwise unlink the 000 file and proceed to a new query.

tests: add test in run-debuginfod-find.sh

test if the 000 file is created on failed query; if querying the
same failed BUILDID, whether the query should proceed without
going through server; set the cache_miss_s to 0 and query the same
buildid, and this time should go through the server.

Signed-off-by: Alice Zhang <alizhang@redhat.com>
3 years agoPR27571: debuginfod client cache - file permissions
Frank Ch. Eigler [Mon, 26 Apr 2021 16:21:03 +0000 (12:21 -0400)]
PR27571: debuginfod client cache - file permissions

Files in the download cache should be read-only.

Signed-off-by: Frank Ch. Eigler <fche@redhat.com>
3 years agoPR26125: debuginfod client cache - rmdir harder
Frank Ch. Eigler [Mon, 26 Apr 2021 13:58:45 +0000 (09:58 -0400)]
PR26125: debuginfod client cache - rmdir harder

With PR25365, we accidentally lost the ability to rmdir client-cache
directories corresponding to buildids.  Bring this back, with some
attention to a possible race between a client doing cleanup and
another client doing lookups at the same time.

Signed-off-by: Frank Ch. Eigler <fche@redhat.com>
3 years agolibdw: handle DW_FORM_indirect when reading attributes
Omar Sandoval [Fri, 23 Apr 2021 23:36:15 +0000 (16:36 -0700)]
libdw: handle DW_FORM_indirect when reading attributes

Whenever we encounter an attribute with DW_FORM_indirect, we need to
read its true form from the DIE data. Then, we can continue normally.
This adds support to the most obvious places: __libdw_find_attr() and
dwarf_getattrs(). There may be more places that need to be updated.

I encountered this when inspecting a file that was processed by our BOLT
tool: https://github.com/facebookincubator/BOLT. This also adds a couple
of test cases using a file generated by that tool.

Signed-off-by: Omar Sandoval <osandov@fb.com>
3 years agoPR27701: debuginfod client: encourage reused debuginfod_client objects
Frank Ch. Eigler [Fri, 23 Apr 2021 17:04:26 +0000 (13:04 -0400)]
PR27701: debuginfod client: encourage reused debuginfod_client objects

Client objects now carry long-lived curl handles for outgoing
connections.  This makes it more efficient for multiple sequential
queries, because the TCP connections and/or TLS state info are kept
around awhile, avoiding O(100ms) setup latencies.  debuginfod is
adjusted to take advantage of this for federation.  Other clients
should gradually do this too, perhaps including elfutils itself (in
the libdwfl->debuginfod_client hooks).

A large gdb session with 117 debuginfo downloads was observed to run
twice as fast (45s vs. 1m30s wall-clock time), just in nuking this
extra setup latency.  This was tested via a debuginfod intermediary:
it should be even faster once gdb reuses its own debuginfod_client.

Signed-off-by: Frank Ch. Eigler <fche@redhat.com>
3 years agopo: update XGETTEXT_OPTIONS
Dmitry V. Levin [Sun, 21 Mar 2021 08:00:00 +0000 (08:00 +0000)]
po: update XGETTEXT_OPTIONS

Recognize sgettext as a macro which is used for translations.

Flag _, N_, and sgettext with pass-c-format.  The effect of this
specification is that xgettext will propagate format string
requirements for _, N_, and sgettext calls to their first arguments,
and thus mark them as format strings.

Signed-off-by: Dmitry V. Levin <ldv@altlinux.org>
3 years agodebuginfod: only update database stats once per groom
Frank Ch. Eigler [Thu, 15 Apr 2021 10:29:01 +0000 (06:29 -0400)]
debuginfod: only update database stats once per groom

On very large servers, each database-stat counting pass can take tens
of minutes (!), and doing it twice per groom pass does not seriously
improve data quality.  Just do it once, after stale data removal &
basic sqlite vacuum.

Signed-off-by: Frank Ch. Eigler <fche@redhat.com>
3 years agodebuginfod: Recognize .debug_*-less symtab-laden files as debuginfo
Frank Ch. Eigler [Thu, 15 Apr 2021 08:49:59 +0000 (04:49 -0400)]
debuginfod: Recognize .debug_*-less symtab-laden files as debuginfo

Borrow logic from elfclassify for is_debug_only() for our own
debuginfo identification.

Signed-off-by: Frank Ch. Eigler <fche@redhat.com>
3 years agonm: Fix file descriptor leak on dwfl_begin failure.
Mark Wielaard [Sat, 3 Apr 2021 17:52:38 +0000 (19:52 +0200)]
nm: Fix file descriptor leak on dwfl_begin failure.

If dwfl_begin fails we won't use the dwfl_fd descriptor we just dupped.
Make sure to close on dwfl_begin failure to avoid the leak.

Signed-off-by: Mark Wielaard <mark@klomp.org>
3 years agounstrip: Fix small leak in handle_output_dir_module.
Mark Wielaard [Sat, 3 Apr 2021 17:36:12 +0000 (19:36 +0200)]
unstrip: Fix small leak in handle_output_dir_module.

eu-unstrip might leak a string for each module found when using the -d
option. Make sure to free the output_file name when we are done with the
module.

Signed-off-by: Mark Wielaard <mark@klomp.org>
3 years agoar: Always close newfd in do_oper_insert.
Mark Wielaard [Sat, 3 Apr 2021 17:20:32 +0000 (19:20 +0200)]
ar: Always close newfd in do_oper_insert.

newfd is normally created by mkstemp given the original fd exists.
Otherwise it will created by open from arfname. In the second case
newfd might not get closed. Preventd this by always trying to close
it after errout.

Signed-off-by: Mark Wielaard <mark@klomp.org>
3 years agodoc/debuginfod.8: fix wrong parameter name for .deb files in description
Frank Ch. Eigler [Mon, 5 Apr 2021 01:57:20 +0000 (21:57 -0400)]
doc/debuginfod.8: fix wrong parameter name for .deb files in description

One place in the description referred to the parameter for
.deb/.ddeb files as "-D" as opposed to the correct "-U".

Signed-off-by: Andreas Ziegler <andreas.ziegler@fau.de>
3 years agodebuginfod: Set child thread names via pthread_setname_np()
Frank Ch. Eigler [Tue, 30 Mar 2021 17:22:43 +0000 (13:22 -0400)]
debuginfod: Set child thread names via pthread_setname_np()

In order to assist problem diagnosis / monitoring, use this
gnu-flavoured pthread function to set purpose names to the various
child threads debuginfod starts.  libmicrohttpd already sets this for
its threads.

Signed-off-by: Frank Ch. Eigler <fche@redhat.com>
3 years agodebuginfod-client: Don't compare a double to a long
Timm Bäder [Sun, 7 Mar 2021 18:02:29 +0000 (13:02 -0500)]
debuginfod-client: Don't compare a double to a long

Clang warns about this:

../../debuginfod/debuginfod-client.c:899:28: error: implicit conversion from 'long' to 'double' changes value from 9223372036854775807 to 9223372036854775808 [-Werror,-Wimplicit-int-float-conversion]
                pa = (dl > LONG_MAX ? LONG_MAX : (long)dl);
                         ~ ^~~~~~~~
/usr/lib64/clang/10.0.1/include/limits.h:47:19: note: expanded from macro 'LONG_MAX'
                  ^~~~~~~~~~~~
<built-in>:38:22: note: expanded from here
                     ^~~~~~~~~~~~~~~~~~~~

Modified for jakub's observation about LONG_MAX overflow.

Signed-off-by: Timm Bäder <tbaeder@redhat.com>
3 years agoUpdate Polish translation
Piotr Drąg [Sun, 21 Feb 2021 14:33:43 +0000 (15:33 +0100)]
Update Polish translation

https://sourceware.org/bugzilla/show_bug.cgi?id=27450

Signed-off-by: Piotr Drąg <piotrdrag@gmail.com>
3 years agoUpdate POTFILES.in
Piotr Drąg [Sun, 21 Feb 2021 13:54:46 +0000 (14:54 +0100)]
Update POTFILES.in

https://sourceware.org/bugzilla/show_bug.cgi?id=27450

Signed-off-by: Piotr Drąg <piotrdrag@gmail.com>
3 years agobuild: Check for -Wno-packed-not-aligned support
Timm Bäder [Wed, 17 Feb 2021 09:27:08 +0000 (10:27 +0100)]
build: Check for -Wno-packed-not-aligned support

Clang does not support this warning, so check for compiler support
before using it.

Signed-off-by: Timm Bäder <tbaeder@redhat.com>
3 years agobuild: Check for -Wtrampolines support
Timm Bäder [Wed, 17 Feb 2021 09:27:07 +0000 (10:27 +0100)]
build: Check for -Wtrampolines support

Clang does not support -Wtrampolines, so check if the compiler supports
it before using it.

Signed-off-by: Timm Bäder <tbaeder@redhat.com>
3 years agodebuginfod-client: Fix typo in curl feature detection
Timm Bäder [Fri, 5 Mar 2021 18:36:15 +0000 (13:36 -0500)]
debuginfod-client: Fix typo in curl feature detection

CURLINFO_CURLINFO_CONTENT_LENGTH_DOWNLOAD_T is one CURLINFO_ too much.

Signed-off-by: Timm Bäder <tbaeder@redhat.com>
3 years agoreadelf: Sanity check verneed and verdef offsets in handle_symtab.
Mark Wielaard [Wed, 3 Mar 2021 20:40:53 +0000 (21:40 +0100)]
readelf: Sanity check verneed and verdef offsets in handle_symtab.

We are going through vna_next, vn_next and vd_next in a while loop.
Make sure that all offsets are sane. We don't want things to wrap
around so we go in cycles.

https://sourceware.org/bugzilla/show_bug.cgi?id=27501

Signed-off-by: Mark Wielaard <mark@klomp.org>
3 years agoelfcompress: Replace cleanup() with label
Timm Bäder [Tue, 2 Mar 2021 08:05:33 +0000 (09:05 +0100)]
elfcompress: Replace cleanup() with label

This unifies the error handling with the rest of the code base and gets
rid of a nested function.

Signed-off-by: Timm Bäder <tbaeder@redhat.com>
3 years agobuild: Check for -Wimplicit-fallthrough=5 separately
Timm Bäder [Wed, 17 Feb 2021 09:27:06 +0000 (10:27 +0100)]
build: Check for -Wimplicit-fallthrough=5 separately

GCC accepts the =5, which means it doesn't try to parse any comments
and only accepts the fallthrough attribute in code. Clang does not ever
parse any comments and always wants the fallthrough attribute anyway.
Clang also doesn't accept the =n parameter for -Wimplicit-fallthrough.

Test for =5 separately and use it if supported and fall back to just
-Wimplicit-fallthrough otherwise.

Signed-off-by: Timm Bäder <tbaeder@redhat.com>
3 years agotests: Pull new_data_buf() into file scope for elfstrmerge.
Timm Bäder [Wed, 17 Feb 2021 08:46:05 +0000 (09:46 +0100)]
tests: Pull new_data_buf() into file scope for elfstrmerge.

Get rid of a nested function this way.

Signed-off-by: Timm Bäder <tbaeder@redhat.com>
3 years agotests: Pull newsecndx() info file scope for elfstrmerge
Timm Bäder [Wed, 17 Feb 2021 08:46:04 +0000 (09:46 +0100)]
tests: Pull newsecndx() info file scope for elfstrmerge

Get rid of a nested function this way.

Signed-off-by: Timm Bäder <tbaeder@redhat.com>
3 years agoelfcompress: Pull get_sections() into file scope
Timm Bäder [Wed, 17 Feb 2021 08:45:09 +0000 (09:45 +0100)]
elfcompress: Pull get_sections() into file scope

Get rid of a nested function this way.

Signed-off-by: Timm Bäder <tbaeder@redhat.com>
3 years agoelfcompress: Pull get_section() into file scope
Timm Bäder [Wed, 17 Feb 2021 08:45:08 +0000 (09:45 +0100)]
elfcompress: Pull get_section() into file scope

Get rid of a nested function this way.

Signed-off-by: Timm Bäder <tbaeder@redhat.com>
3 years agoelfcompress: Pull set_section() into file scope
Timm Bäder [Wed, 17 Feb 2021 08:45:07 +0000 (09:45 +0100)]
elfcompress: Pull set_section() into file scope

Get rid of a nested function this way.

Signed-off-by: Timm Bäder <tbaeder@redhat.com>
3 years agounstrip: Remove nested next() function
Timm Bäder [Wed, 17 Feb 2021 08:43:48 +0000 (09:43 +0100)]
unstrip: Remove nested next() function

This is a simple one-liner, so inline this into the few callers.
Get rid of a nested function this way.

Signed-off-by: Timm Bäder <tbaeder@redhat.com>
3 years agounstrip: Pull warn() into file scope
Timm Bäder [Wed, 17 Feb 2021 08:43:47 +0000 (09:43 +0100)]
unstrip: Pull warn() into file scope

Get rid of a nested function this way.

Signed-off-by: Timm Bäder <tbaeder@redhat.com>
3 years agounstrip: Inline find_unalloc_section() into only caller
Timm Bäder [Wed, 17 Feb 2021 08:43:46 +0000 (09:43 +0100)]
unstrip: Inline find_unalloc_section() into only caller

Get rid of an unnecessary nested function this way.

Signed-off-by: Timm Bäder <tbaeder@redhat.com>
3 years agounstrip: Pull check_match() into file scope
Timm Bäder [Wed, 17 Feb 2021 08:43:45 +0000 (09:43 +0100)]
unstrip: Pull check_match() into file scope

Get rid of a nested function this way.

Signed-off-by: Timm Bäder <tbaeder@redhat.com>
3 years agounstrip: Pull adjust_reloc() into file scope
Timm Bäder [Wed, 17 Feb 2021 08:43:44 +0000 (09:43 +0100)]
unstrip: Pull adjust_reloc() into file scope

Get rid of a nested function this way.

Signed-off-by: Timm Bäder <tbaeder@redhat.com>
3 years agoelflint: Pull left() in file scope
Timm Bäder [Wed, 17 Feb 2021 08:42:19 +0000 (09:42 +0100)]
elflint: Pull left() in file scope

And rename it to buffer_left() to be a bit more descriptive

Signed-off-by: Timm Bäder <tbaeder@redhat.com>
3 years agoelflint: Pull pos() info file scope
Timm Bäder [Wed, 17 Feb 2021 08:42:18 +0000 (09:42 +0100)]
elflint: Pull pos() info file scope

Rename it to buffer_pos() to be a bit more descriptive and get rid of a
nested function this way.

Signed-off-by: Timm Bäder <tbaeder@redhat.com>
3 years agodebuginfod: filter webapi for bad keywords early
Frank Ch. Eigler [Thu, 25 Feb 2021 19:04:20 +0000 (14:04 -0500)]
debuginfod: filter webapi for bad keywords early

Prevent some unnecessary processing of user data and
keep invalid request types out of metrics.

Signed-off-by: Frank Ch. Eigler <fche@redhat.com>
3 years agotestsuite: run-debuginfod-find.sh: Fix grooming test indeterminacy
Frank Ch. Eigler [Thu, 18 Feb 2021 00:34:09 +0000 (19:34 -0500)]
testsuite: run-debuginfod-find.sh: Fix grooming test indeterminacy

We were looking at a less-than-ideal metric to check the effects
of grooming on the database.  It turns out there is a counter
just for removed files/archives, which will have the same value
regardless of the presence of other test configurations.

Signed-off-by: Frank Ch. Eigler <fche@redhat.com>
3 years agoNEWS: add a debuginfod blurb re. bsdtar
Frank Ch. Eigler [Wed, 17 Feb 2021 20:20:25 +0000 (15:20 -0500)]
NEWS: add a debuginfod blurb re. bsdtar

Signed-off-by: Frank Ch. Eigler <fche@redhat.com>
3 years agotestsuite: run-debuginfod-find.sh: Be more verbose on failure
Frank Ch. Eigler [Wed, 17 Feb 2021 20:38:43 +0000 (15:38 -0500)]
testsuite: run-debuginfod-find.sh: Be more verbose on failure

To help diagnose timing glitches in debuginfod testing, print more
diagnostics on a metric-timeout failure.

Signed-off-by: Frank Ch. Eigler <fche@redhat.com>
3 years agoreadelf: Type DIE offset is from start of CU.
Mark Wielaard [Fri, 12 Feb 2021 15:42:44 +0000 (16:42 +0100)]
readelf: Type DIE offset is from start of CU.

While inspecting some type units I noticed the type offset seemed off.
We were printing the offset as is, but it should include the offset of
the unit. There was actually a testcase for this, run-readelf-types.sh
but that had the same bug in the expected output. Fixed both.

Signed-off-by: Mark Wielaard <mark@klomp.org>
3 years agoreadelf, libdw: blocks aren't expressions for DWARF version 4
Mark Wielaard [Fri, 12 Feb 2021 15:28:50 +0000 (16:28 +0100)]
readelf, libdw: blocks aren't expressions for DWARF version 4

For DWARF version 4 or higher a block form really encodes a block,
not an expression location. Also constant offsets can be expressed
as DW_FORM_implicit_const in DWARF version 5.

Signed-off-by: Mark Wielaard <mark@klomp.org>
3 years agoPR27413: use bsdtar to unpack deb-related formats
Frank Ch. Eigler [Sun, 14 Feb 2021 21:02:05 +0000 (16:02 -0500)]
PR27413: use bsdtar to unpack deb-related formats

dpkg-deb has been reported to be fragile when running under
debuginfod, whereas bsdtar (libarchive) is happy with all these
flavors of files.  Switch to a bsdtar based pipeline, now
equipped with an escaped glob pattern that adapts to a variety
of interior data.tar* compression formats.

No testsuite impact.  .ipk format tested with some random openwrt and
kino-extension binaries found on the net.  Some of these are built
with out buildid, and hardly any with debuginfo, but whatever, bsdtar
and elfutils extract whatever info is there.

Signed-off-by: Frank Ch. Eigler <fche@redhat.com>
Signed-off-by: Dorinda Bassey <dorindabassey@gmail.com>
3 years agotests: Quote make variables in TESTS_ENVIRONMENT
Alexander Miller via Elfutils-devel [Sun, 7 Feb 2021 15:48:17 +0000 (16:48 +0100)]
tests: Quote make variables in TESTS_ENVIRONMENT

Commit eb922a1b8f3a ("tests: use ${CC} instead of 'gcc' in tests")
exports ${CC} into the test environment, but doesn't quote the
value for the assignment. That doesn't work properly if the value
contains whitespace. In a multilib/biarch environment however, it's
common to set CC="gcc -m32" or similar. That causes tests to print
error messages: "/bin/sh: line 2: -m32: command not found".

Fix that by adding quotes around all make variables (not just $CC)
used in setting up TESTS_ENVIRONMENT.

Signed-off-by: Alexander Miller <alex.miller@gmx.de>
3 years agoelfutils.spec.in: Escape %%check in comment.
Mark Wielaard [Fri, 12 Feb 2021 15:36:04 +0000 (16:36 +0100)]
elfutils.spec.in: Escape %%check in comment.

Signed-off-by: Mark Wielaard <mark@klomp.org>
3 years agotests/run-debuginfod-find.sh: skip test if cpio isn't available.
Érico Rolim [Tue, 9 Feb 2021 00:56:50 +0000 (19:56 -0500)]
tests/run-debuginfod-find.sh: skip test if cpio isn't available.

Signed-off-by: Érico Rolim <erico.erc@gmail.com>
3 years agoNEWS: add one more debuginfod brag elfutils-0.183
Frank Ch. Eigler [Sat, 6 Feb 2021 01:18:39 +0000 (20:18 -0500)]
NEWS: add one more debuginfod brag

Signed-off-by: Frank Ch. Eigler <fche@redhat.com>
3 years agoPrepare for 0.183
Mark Wielaard [Fri, 5 Feb 2021 21:55:10 +0000 (22:55 +0100)]
Prepare for 0.183

Set version to 0.183
Update NEWS and elfutils.spec.in.
Set copyright year in configure.ac and printversion.
Regenerate po/*.po files.

Signed-off-by: Mark Wielaard <mark@klomp.org>
3 years agobackends/ppc_initreg.c: include <asm/ptrace.h>.
Érico Rolim [Fri, 5 Feb 2021 17:52:06 +0000 (14:52 -0300)]
backends/ppc_initreg.c: include <asm/ptrace.h>.

Necessary on musl for struct pt_regs definition, doesn't affect the
build on glibc, since <sys/user.h> includes the same header.

Signed-off-by: Érico Rolim <erico.erc@gmail.com>
3 years agoar: Pull should_truncate_fname() into file scope
Timm Bäder [Wed, 3 Feb 2021 14:44:46 +0000 (15:44 +0100)]
ar: Pull should_truncate_fname() into file scope

Get rid of a nested function this way.

Signed-off-by: Timm Bäder <tbaeder@redhat.com>
3 years agoPR27092: debuginfod low-memory handling
Frank Ch. Eigler [Fri, 5 Feb 2021 01:31:56 +0000 (20:31 -0500)]
PR27092: debuginfod low-memory handling

A couple of closely related pieces of work allow more early warning
about low storage/memory conditions:

- New prometheus metrics to track filesystem freespace, and more
  details about some errors.
- Frequent checking of $TMPDIR freespace, to trigger fdcache
  emergency flushes.
- Switch to floating point prometheus metrics, to communicate
  fractions - and short time intervals - accurately.
- Fix startup-time pthread-creation error handling.

Testing is smoke-test-level only as it is hard to create
free-space-limited $TMPDIRs. Locally tested against tiny through
medium tmpfs filesystems, with or without sqlite db also there.  Shows
a pleasant stream of diagnostics and metrics during shortage but
generally does not fail outright.  However, catching an actual
libstdc++- or kernel-level OOM is beyond our ken.

Signed-off-by: Frank Ch. Eigler <fche@redhat.com>
3 years agoPR27323 debuginfod: improve query concurrency with grooming
Frank Ch. Eigler [Tue, 2 Feb 2021 21:49:19 +0000 (16:49 -0500)]
PR27323 debuginfod: improve query concurrency with grooming

Start using a second sqlite3 database connection for webapi query
servicing.  This allows much better concurrency when long-running
grooming operations are in progress.

No testsuite impact.  Grooming times are too short to try to hit with
concurrent requests.  OTOH the existing tests did show some
interesting regressions that needed fixing, like needing not to
dual-wield db and dbq when doing rpm-dwz-related lookups from during
scanning, and the way in which corrupted databases are reported.
These needed some automated invocations of gdb on the running
debuginfod binaries that just failed their testing, for in-situ
debugging.

Hand-tested for function on a huge 20GB index file.  Allowed webapi
queries to be run throughout random points of the grooming process,
including especially the long count(*) report loops before & after.

Signed-off-by: Frank Ch. Eigler <fche@redhat.com>
3 years agoreadelf: Remove show_op_index variable
Timm Bäder [Tue, 2 Feb 2021 10:23:24 +0000 (11:23 +0100)]
readelf: Remove show_op_index variable

advance_pc() uses show_op_index to save whether the current op_index is
> 0 OR the new op_index is > 0.

The new op index is calculated via

new_op_index = (op_index + op_advance) % max_ops_per_instr;

since all of the variables involved are unsigned,
new_op_index >= op_index is always true.

So...

if op_index > 0, then new_op_index > 0
if op_index == 0, then new_op_index >= 0

and if the new_op_index is > 0, then the old one was as well.

In any case, we only need to check the new_op_index, since show_op_index
used to OR the two comparisons.

In other words:

 op_index > 0  |  new_op_index > 0  || show_op_index
 ------------------------------------------------
      true           true                true
     false           true                true
      true          false                true     xx
     false          false                false

... but since the third line (marked with xx) is not possible,
the table becomes:

 op_index > 0  |  new_op_index > 0  || show_op_index
 ------------------------------------------------
      true           true                true
     false           true                true
     false          false                false

... and show_op_index is equal to (new_op_index > 0).
So, remove the show_op_index variable and simply replace it by comparing
the new op_index > 0.

3 years agolibdwfl: use GNU strerror_r only when available.
Érico Rolim [Tue, 2 Feb 2021 00:16:56 +0000 (21:16 -0300)]
libdwfl: use GNU strerror_r only when available.

Some C libraries don't provide the GNU version of strerror_r, only the
XSI-compliant one. We use the GNU version when available, since it fits
the code better, and otherwise use the XSI-compliant one.

https://sourceware.org/bugzilla/show_bug.cgi?id=21010

Signed-off-by: Érico Rolim <erico.erc@gmail.com>