[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [XenPPC] libvirt bad paddr patch for our hcall.c
I added a new inline function "invalid_endianness" for better readability. An invalid address now returns -EINVAL and triggers a WARN_ON().If a more sophisticated check is wanted later on like a additional >0x0C or something we can add this there on a central point. If we will need it somewhere else in the future we can move it to a header.This replaces the workaround patch sent with "libvirt status of bugt racking regarding bad paddr (patch)". FYI I attached the libvirt patch too --Grüsse / regards, Christian Ehrhardt IBM Linux Technology Center, Open Virtualization +49 7031/16-3385 Ehrhardt@xxxxxxxxxxxxxxxxxx Ehrhardt@xxxxxxxxxx IBM Deutschland Entwicklung GmbHVorsitzender des Aufsichtsrats: Johann Weihen Geschäftsführung: Herbert Kircher Sitz der Gesellschaft: Böblingen Registergericht: Amtsgericht Stuttgart, HRB 243294 diff -r 1139ab948449 arch/powerpc/platforms/xen/hcall.c --- a/arch/powerpc/platforms/xen/hcall.c Sun Jul 15 15:33:56 2007 +0200 +++ b/arch/powerpc/platforms/xen/hcall.c Sun Aug 05 03:50:28 2007 +0200 @@ -437,6 +437,16 @@ out: return ret; } +static inline int invalid_endianness(void *ptr) +{ + unsigned long p = (unsigned long)ptr; + if ( ((p & 0x00000000FFFFFFFFUL) == 0x0) + && ((p & 0xFFFFFFFF00000000UL) != 0x0) ) + return 1; + else + return 0; +} + static int xenppc_privcmd_sysctl(privcmd_hypercall_t *hypercall) { xen_sysctl_t kern_op; @@ -481,6 +491,11 @@ static int xenppc_privcmd_sysctl(privcmd printk(KERN_ERR "%s: unknown sysctl cmd %d\n", __func__, kern_op.cmd); return -ENOSYS; case XEN_SYSCTL_getdomaininfolist: + if (invalid_endianness(kern_op.u.getdomaininfolist.buffer.p)) { + WARN_ON(1); + return -EINVAL; + } + desc = xencomm_map( xen_guest_handle(kern_op.u.getdomaininfolist.buffer), kern_op.u.getdomaininfolist.max_domains * diff -r 57c3b9568ea6 src/xen_internal.c --- a/src/xen_internal.c Thu Jul 19 13:52:36 2007 +0200 +++ b/src/xen_internal.c Sun Aug 05 04:04:51 2007 +0200 @@ -314,10 +314,17 @@ struct xen_v2s3_getdomaininfolistop { struct xen_v2s3_getdomaininfolistop { domid_t first_domain; uint32_t max_domains; +#ifdef __BIG_ENDIAN__ + struct { + int __pad[(sizeof (long long) - sizeof (struct xen_v2d5_getdomaininfo *)) / sizeof (int)]; + struct xen_v2d5_getdomaininfo *v; + } buffer; +#else union { struct xen_v2d5_getdomaininfo *v; uint64_t pad ALIGN_64; } buffer; +#endif uint32_t num_domains; }; typedef struct xen_v2s3_getdomaininfolistop xen_v2s3_getdomaininfolistop; @@ -422,10 +429,17 @@ typedef struct xen_v2_setvcpumap xen_v2_ /* HV version 2, Dom version 5 requires 64-bit alignment */ struct xen_v2d5_cpumap { +#ifdef __BIG_ENDIAN__ + struct { + int __pad[(sizeof (long long) - sizeof (uint8_t *)) / sizeof (int)]; + uint8_t *v; + } bitmap; +#else union { uint8_t *v; uint64_t pad ALIGN_64; } bitmap; +#endif uint32_t nr_cpus; }; struct xen_v2d5_setvcpumap { _______________________________________________ Xen-ppc-devel mailing list Xen-ppc-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-ppc-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |