[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4 1/9] livepatch: Clear .bss when payload is reverted
On Wed, Aug 24, 2016 at 02:55:21AM -0600, Jan Beulich wrote: > >>> On 24.08.16 at 04:22, <konrad.wilk@xxxxxxxxxx> wrote: > > --- a/xen/common/livepatch.c > > +++ b/xen/common/livepatch.c > > @@ -70,6 +70,9 @@ struct payload { > > unsigned int nsyms; /* Nr of entries in .strtab and > > symbols. */ > > struct livepatch_build_id id; /* > > ELFNOTE_DESC(.note.gnu.build-id) of the payload. */ > > struct livepatch_build_id dep; /* > > ELFNOTE_DESC(.livepatch.depends). */ > > + void **bss; /* .bss's of the payload. */ > > + size_t *bss_size; /* and their sizes. */ > > Is size_t wide enough in the extreme case? Perhaps yes, because I > don't think we'll ever load 64-bit ELF on a 32-bit platform. Nonethless having a huge .bss is a kind of extreme? Perhaps we should have an seperate patch that checks the SHT_NOBITS and disallows .bss's bigger than say 2MB? I am using 2MB as that is the limit of the livepatch binaries right now (see verify_payload: 127 if ( upload->size > MB(2) ) 128 return -EINVAL; > > > + size_t n_bss; /* Size of the array. */ > > As opposed to that, I think this one could be unsigned int (or else > you end up with inconsistencies in {move,apply}_payload()). /me nods. Changed to unsitned int. > > > @@ -374,14 +392,24 @@ static int move_payload(struct payload *payload, > > struct livepatch_elf *elf) > > elf->name, elf->sec[i].name, > > elf->sec[i].load_addr); > > } > > else > > - memset(elf->sec[i].load_addr, 0, elf->sec[i].sec->sh_size); > > + { > > + payload->bss[n_bss] = elf->sec[i].load_addr; > > + payload->bss_size[n_bss++] = elf->sec[i].sec->sh_size; > > + } > > } > > } > > + ASSERT(n_bss == payload->n_bss); > > > > out: > > xfree(offset); > > > > return rc; > > + > > + out_mem: > > + dprintk(XENLOG_ERR, LIVEPATCH "%s: Could not allocate memory for > > payload!\n", > > + elf->name); > > + rc = -ENOMEM; > > + goto out; > > You leak any of the three buffers here which you managed to > successfully allocate. I added a call to 'free_payload_data(payload)' there to make it a direct call to it. It is not needed per say as the caller unconditionally calls free_payload_data() if the return of any of the functions is non-zero. But in case things get moved around and that assumption goes away - having a call to free_payload_data makes sense in the function (plus it looks much more nicer to free/alloc in the same function). _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |