|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 1/2] livepatch: do not ignore sections with 0 size
Ping?
There was some discussion on whether we need to handle such empty
sections, but I think we settled that it's necessary.
Thanks, Roger.
On Thu, Mar 17, 2022 at 12:08:53PM +0100, Roger Pau Monne wrote:
> A side effect of ignoring such sections is that symbols belonging to
> them won't be resolved, and that could make relocations belonging to
> other sections that reference those symbols fail.
>
> For example it's likely to have an empty .altinstr_replacement with
> symbols pointing to it, and marking the section as ignored will
> prevent the symbols from being resolved, which in turn will cause any
> relocations against them to fail.
>
> In order to solve this do not ignore sections with 0 size, only ignore
> sections that don't have the SHF_ALLOC flag set.
>
> Special case such empty sections in move_payload so they are not taken
> into account in order to decide whether a livepatch can be safely
> re-applied after a revert.
>
> Fixes: 98b728a7b2 ('livepatch: Disallow applying after an revert')
> Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
> ---
> xen/common/livepatch.c | 16 +++++++++++-----
> xen/include/xen/livepatch_elf.h | 2 +-
> 2 files changed, 12 insertions(+), 6 deletions(-)
>
> diff --git a/xen/common/livepatch.c b/xen/common/livepatch.c
> index be2cf75c2d..abc1cae136 100644
> --- a/xen/common/livepatch.c
> +++ b/xen/common/livepatch.c
> @@ -300,9 +300,6 @@ static int move_payload(struct payload *payload, struct
> livepatch_elf *elf)
> * and .shstrtab. For the non-relocate we allocate and copy these
> * via other means - and the .rel we can ignore as we only use it
> * once during loading.
> - *
> - * Also ignore sections with zero size. Those can be for example:
> - * data, or .bss.
> */
> if ( livepatch_elf_ignore_section(elf->sec[i].sec) )
> offset[i] = UINT_MAX;
> @@ -361,8 +358,17 @@ static int move_payload(struct payload *payload, struct
> livepatch_elf *elf)
> else if ( elf->sec[i].sec->sh_flags & SHF_WRITE )
> {
> buf = rw_buf;
> - rw_buf_sec = i;
> - rw_buf_cnt++;
> + if ( elf->sec[i].sec->sh_size )
> + {
> + /*
> + * Special handling of RW empty regions: do not account
> for
> + * them in order to decide whether a patch can safely be
> + * re-applied, but assign them a load address so symbol
> + * resolution and relocations work.
> + */
> + rw_buf_sec = i;
> + rw_buf_cnt++;
> + }
> }
> else
> buf = ro_buf;
> diff --git a/xen/include/xen/livepatch_elf.h b/xen/include/xen/livepatch_elf.h
> index 9ad499ee8b..5b1ec469da 100644
> --- a/xen/include/xen/livepatch_elf.h
> +++ b/xen/include/xen/livepatch_elf.h
> @@ -48,7 +48,7 @@ int livepatch_elf_perform_relocs(struct livepatch_elf *elf);
>
> static inline bool livepatch_elf_ignore_section(const Elf_Shdr *sec)
> {
> - return !(sec->sh_flags & SHF_ALLOC) || sec->sh_size == 0;
> + return !(sec->sh_flags & SHF_ALLOC);
> }
> #endif /* __XEN_LIVEPATCH_ELF_H__ */
>
> --
> 2.34.1
>
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |