Hi Mark,

On Thu, Sep 4, 2025 at 1:12 PM Mark Wielaard <m...@klomp.org> wrote:
>
> Hi Aaron,
>
> On Mon, 2025-08-04 at 23:24 -0400, Aaron Merey wrote:
> > Signed-off-by: Aaron Merey <ame...@redhat.com>
> > ---
> > v2: Remove mention of implementation details. Mention that conversion
> > to native byte order and direct access alignment resembles elf_getdata.
> > Mention elf_errmsg.
> >
> > On Mon, Jul 7, 2025 at 1:26 PM Mark Wielaard <m...@klomp.org> wrote:
> > >
> > > Nice overview of ELF data types. But might there be a better place for
> > > this? I would assume elf_data, but that man page is currently very bare
> > > bones.
> >
> > When I update the bare bones man pages including elf_data I'll move
> > the Elf_Type description there.
>
> Thanks.
>
> > > Speaking of thread safety...
> > > This should be MT-Safe and documented that way.
> > >
> > > But is it really?
> > > The code takes a read lock on elf->lock. Checks whether it can find an
> > > existing Elf_Data_Chunk. If yes, it returns that one. Which seems fine.
> > > But if not it inserts the dummy chunk without actually data,
> > > allocates/creates the data, drops the rdlock (!), takes a write lock
> > > and overwrites the dummy chunk with the real data, drops the lock again
> > > and returns the data.
> > >
> > > What if at (!) another call gets the read lock first before the current
> > > thread can (re)take the write lock? That other thread could find the
> > > existing dummy key already in the cache and return the dummy data?
> >
> > I've posted a patch that fixes this race condition.
>
> I cannot find it, could you repost it please?

I wrote the patch but didn't actually send it to the list! It's now sent:
https://sourceware.org/pipermail/elfutils-devel/2025q3/008527.html

>
> >  doc/Makefile.am            |   1 +
> >  doc/elf_getdata_rawchunk.3 | 140 +++++++++++++++++++++++++++++++++++++
> >  2 files changed, 141 insertions(+)
> >  create mode 100644 doc/elf_getdata_rawchunk.3
> >
> > diff --git a/doc/Makefile.am b/doc/Makefile.am
> > index 791a68da..fbe69980 100644
> > --- a/doc/Makefile.am
> > +++ b/doc/Makefile.am
> > @@ -67,6 +67,7 @@ notrans_dist_man3_MANS= elf32_checksum.3 \
> >                       elf_getarsym.3 \
> >                       elf_getbase.3 \
> >                       elf_getdata.3 \
> > +                     elf_getdata_rawchunk.3 \
> >                       elf_getscn.3 \
> >                       elf_hash.3 \
> >                       elf_kind.3 \
>
> OK.
>
> > diff --git a/doc/elf_getdata_rawchunk.3 b/doc/elf_getdata_rawchunk.3
> > new file mode 100644
> > index 00000000..9660b1f1
> > --- /dev/null
> > +++ b/doc/elf_getdata_rawchunk.3
> > @@ -0,0 +1,140 @@
> > +.TH ELF_GETDATA_RAWCHUNK 3 2025-06-30 "Libelf" "Libelf Programmer's Manual"
> > +
> > +.SH NAME
> > +elf_getdata_rawchunk \- create a raw data descriptor from a file offset
> > +
> > +.SH SYNOPSIS
> > +.nf
> > +#include <libelf.h>
> > +
> > +.B Elf_Data * elf_getdata_rawchunk("Elf *elf", "int64_t offset", "size_t 
> > size", "Elf_Type type");
> > +.fi
>
> OK.
>
> > +.SH DESCRIPTION
> > +The
> > +.BR elf_getdata_rawchunk ()
> > +function returns an
> > +.B Elf_Data
> > +descriptor that refers to a raw region of the ELF file, starting at the
> > +given file
> > +.I offset
> > +and spanning
> > +.I size
> > +bytes. This is used to access arbitrary byte ranges in the ELF file that 
> > may
> > +not correspond to any section or segment.
> > +
> > +The returned
> > +.B Elf_Data
> > +.I d_buf
> > +will be properly aligned for the requested
> > +.IR type .
> > +
> > +If the file’s byte order matches the host, and alignment permits, the raw 
> > data is
> > +returned as-is. If the file’s byte order differs, the buffer is converted 
> > into native
> > +byte order and aligned for direct access.  This behaves like
> > +.BR elf_getdata (),
> > +and not
> > +.BR elf_rawdata ().
> > +The contents of the return value's
> > +.I d_buf
> > +are a decoded representation.
> > +
> > +The returned data is not associated with any section or update mechanism. 
> > It will not
> > +be included in any output written by
> > +.BR elf_update (3).
> > +It is also owned by libelf and is valid until
> > +.BR elf_end ()
> > +is called on
> > +.IR elf .
>
> OK.
>
> > +.SH PARAMETERS
> > +.TP
> > +.I elf
> > +A pointer to an
> > +.B Elf
> > +descriptor representing the ELF file.
> > +
> > +.TP
> > +.I offset
> > +The starting file offset in bytes. This must lie within the bounds of the 
> > file.
> > +
> > +.TP
> > +.I size
> > +The number of bytes to include in the data chunk, starting at
> > +.IR offset .
> > +
> > +.TP
> > +.I type
> > +An
> > +.B Elf_Type
> > +enumeration value indicating the intended interpretation of the data.  
> > Values include:
> > +
> > +.RS
> > +.TP
> > +.B ELF_T_BYTE
> > +Raw bytes.
> > +.TP
> > +.B ELF_T_ADDR, ELF_T_OFF, ELF_T_HALF, ELF_T_WORD, ELF_T_XWORD, 
> > ELF_T_SWORD, ELF_T_SXWORD
> > +Integer and pointer types.
> > +.TP
> > +.B ELF_T_EHDR, ELF_T_SHDR, ELF_T_PHDR
> > +ELF file, section, and program headers.
> > +.TP
> > +.B ELF_T_SYM, ELF_T_DYN, ELF_T_REL, ELF_T_RELA, ELF_T_RELR
> > +Symbols and relocations.
> > +.TP
> > +.B ELF_T_NHDR, ELF_T_CHDR, ELF_T_NHDR8
> > +ELF note headers and compressed data headers.
> > +.TP
> > +.B ELF_T_VDEF, ELF_T_VDAUX, ELF_T_VNEED, ELF_T_VNAUX
> > +Versioning structures.
> > +.TP
> > +.B ELF_T_SYMINFO, ELF_T_MOVE, ELF_T_LIB
> > +Other ELF metadata.
> > +.TP
> > +.B ELF_T_GNUHASH
> > +GNU-style hash table.
> > +.TP
> > +.B ELF_T_AUXV
> > +Auxiliary vectors.
> > +.RE
>
> OK.
>
> > +.SH RETURN VALUE
> > +Returns a pointer to an
> > +.B Elf_Data
> > +descriptor on success.
> > +
> > +Returns NULL if any arguments are invalid, or if memory allocation or file 
> > reading
> > +fails. An error code is set which can be retrieved with
> > +.BR elf_errmsg ().
> > +The result is cached and shared between repeated calls using the same 
> > arguments.
>
> OK.
>
> > +.SH SEE ALSO
> > +.BR elf (3),
> > +.BR elf_errmsg (3),
> > +.BR elf_getdata (3),
> > +.BR elf_getscn (3),
> > +.BR elf_rawdata (3),
> > +.BR libelf (3),
> > +.BR elf (5)
>
> OK.
>
> > +.SH ATTRIBUTES
> > +.TS
> > +allbox;
> > +lbx lb lb
> > +l l l.
> > +Interface    Attribute       Value
> > +T{
> > +.na
> > +.nh
> > +.BR elf_getdata_rawchunk ()
> > +T}   Thread safety   MT-Safe
> > +.TE
> > +
> > +.SH REPORTING BUGS
> > +Report bugs to <elfutils-devel@sourceware.org> or 
> > https://sourceware.org/bugzilla/.
> > +
> > +.SH HISTORY
> > +.B elf_getdata_rawchunk
> > +first appeared in elfutils 0.130.  This function is a elfutils libelf 
> > extension and
> > +may not be available in other libelf implementations.
>
> OK.
>

Reply via email to