[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v9 12/27] xsplice: Implement support for applying/reverting/replacing patches.



>>> On 25.04.16 at 17:34, <konrad.wilk@xxxxxxxxxx> wrote:
> +static int check_special_sections(const struct xsplice_elf *elf)
> +{
> +    unsigned int i;
> +    static const char *const names[] = { ELF_XSPLICE_FUNC };
> +    bool_t count[ARRAY_SIZE(names)] = { 0 };
> +
> +    for ( i = 0; i < ARRAY_SIZE(names); i++ )
> +    {
> +        const struct xsplice_elf_sec *sec;
> +
> +        sec = xsplice_elf_sec_by_name(elf, names[i]);
> +        if ( !sec )
> +        {
> +            dprintk(XENLOG_ERR, XSPLICE "%s: %s is missing!\n",
> +                    elf->name, names[i]);
> +            return -EINVAL;
> +        }
> +
> +        if ( !sec->sec->sh_size )
> +        {
> +            dprintk(XENLOG_ERR, XSPLICE "%s: %s is empty!\n",
> +                    elf->name, names[i]);
> +            return -EINVAL;
> +        }
> +        if ( ++count[i] > 1 )

boolean values can only validly be 0 or 1. Just "if ( count[i] )" here
and ...

> +        {
> +            dprintk(XENLOG_ERR, XSPLICE "%s: %s was seen more than once!\n",
> +                    elf->name, names[i]);
> +            return -EINVAL;
> +        }

"count[i] = 1;" here.

Thinking about it again, even more stack conserving would be a
bitmap...

> +static int apply_payload(struct payload *data)
> +{
> +    unsigned int i;
> +
> +    printk(XENLOG_INFO XSPLICE "%s: Applying %u functions\n",
> +            data->name, data->nfuncs);
> +
> +    arch_xsplice_patching_enter();
> +
> +    for ( i = 0; i < data->nfuncs; i++ )
> +        arch_xsplice_apply_jmp(&data->funcs[i]);
> +
> +    arch_xsplice_patching_leave();
> +
> +    list_add_tail_rcu(&data->applied_list, &applied_list);

Neither in the comment earlier on nor here it becomes clear that this
is more of an abuse than a use of RCU.

> +struct xsplice_patch_func {
> +    const char *name;       /* Name of function to be patched. */
> +    void *new_addr;
> +    void *old_addr;
> +    uint32_t new_size;
> +    uint32_t old_size;
> +    uint8_t version;        /* MUST be XSPLICE_PAYLOAD_VERSION. */
> +    uint8_t opaque[31];     /* MUST be zero filled. */

I don't see the zero filling being a requirement, nor it being enforced.

Jan


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.