[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4 01/17] common/symbols: Export hypervisor symbols to privileged guest
>>> On 21.01.14 at 20:08, Boris Ostrovsky <boris.ostrovsky@xxxxxxxxxx> wrote: > @@ -601,6 +602,23 @@ ret_t > do_platform_op(XEN_GUEST_HANDLE_PARAM(xen_platform_op_t) u_xenpf_op) > } > break; > > + case XENPF_get_symbol: > + { > + char name[XEN_KSYM_NAME_LEN + 1]; > + XEN_GUEST_HANDLE_64(char) nameh; Why _64? > + > + guest_from_compat_handle(nameh, op->u.symdata.u.name); > + > + ret = xensyms_read(&op->u.symdata.symnum, &op->u.symdata.type, > + &op->u.symdata.address, name); > + > + if ( !ret && copy_to_guest(nameh, name, XEN_KSYM_NAME_LEN + 1) ) Afaict symbols_expand_symbol() always zero terminates its output, so I can't see why you're not properly using strlen() here. The way you do it now you're leaking hypervisor stack contents to the caller. > +int xensyms_read(uint32_t *symnum, uint32_t *type, uint64_t *address, char > *name) > +{ > + if ( *symnum > symbols_num_syms ) > + return -ERANGE; > + if ( *symnum == symbols_num_syms ) > + return 0; > + > + spin_lock(&symbols_mutex); > + > + if ( *symnum == 0 ) > + next_offset = next_symbol = 0; > + if ( next_symbol != *symnum ) > + /* Non-sequential access */ > + next_offset = get_symbol_offset(*symnum); > + > + *type = symbols_get_symbol_type(next_offset); > + next_offset = symbols_expand_symbol(next_offset, name); > + *address = symbols_offsets[*symnum] + SYMBOLS_ORIGIN; > + > + next_symbol = ++(*symnum); Pointless parentheses. > +#define XENPF_get_symbol 61 > +#define XEN_KSYM_NAME_LEN 127 > +struct xenpf_symdata { > + /* IN variables */ > + uint32_t symnum; > + > + /* OUT variables */ > + uint32_t type; > + uint64_t address; > + > + union { > + XEN_GUEST_HANDLE(char) name; > + uint64_t pad; > + } u; Since you need to do translation anyway, I don't see what good the padding field (and hence the union) here does. > --- a/xen/include/xen/symbols.h > +++ b/xen/include/xen/symbols.h > @@ -2,8 +2,8 @@ > #define _XEN_SYMBOLS_H > > #include <xen/types.h> > - > -#define KSYM_NAME_LEN 127 > +#include <public/xen.h> I don't think you really need this one. > +#include <public/platform.h> > > /* Lookup an address. */ > const char *symbols_lookup(unsigned long addr, > @@ -11,4 +11,7 @@ const char *symbols_lookup(unsigned long addr, > unsigned long *offset, > char *namebuf); > > +extern int xensyms_read(uint32_t *symnum, uint32_t *type, > + uint64_t *address, char *name); > + Please be consistent at least within individual files: There's no "extern" in the existing function declaration here, so there shouldn't be one here. Jan _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |