Author: qboosh                       Date: Sun Apr 22 16:51:18 2007 GMT
Module: SOURCES                       Tag: LINUX_2_6_16
---- Log message:
- fixed microcode-xen (invalid user data access, unresolved symbols on x86_64)

---- Files affected:
SOURCES:
   xen-3.0-2.6.16.patch (1.1.2.2.2.4 -> 1.1.2.2.2.5) 

---- Diffs:

================================================================
Index: SOURCES/xen-3.0-2.6.16.patch
diff -u SOURCES/xen-3.0-2.6.16.patch:1.1.2.2.2.4 
SOURCES/xen-3.0-2.6.16.patch:1.1.2.2.2.5
--- SOURCES/xen-3.0-2.6.16.patch:1.1.2.2.2.4    Sun Apr 22 18:31:58 2007
+++ SOURCES/xen-3.0-2.6.16.patch        Sun Apr 22 18:51:13 2007
@@ -7445,7 +7445,7 @@
 diff -durN -x '*~' -x '*.orig' -x '*.rej' 
linux-2.6.16.orig/arch/i386/kernel/microcode-xen.c 
linux-2.6.16/arch/i386/kernel/microcode-xen.c
 --- linux-2.6.16.orig/arch/i386/kernel/microcode-xen.c 1970-01-01 
01:00:00.000000000 +0100
 +++ linux-2.6.16/arch/i386/kernel/microcode-xen.c      2006-06-26 
09:51:32.000000000 +0200
-@@ -0,0 +1,165 @@
+@@ -0,0 +1,159 @@
 +/*
 + *    Intel CPU Microcode Update Driver for Linux
 + *
@@ -7499,30 +7499,32 @@
 +/* no concurrent ->write()s are allowed on /dev/cpu/microcode */
 +static DECLARE_MUTEX(microcode_sem);
 +
-+static void __user *user_buffer;      /* user area microcode data buffer */
-+static unsigned int user_buffer_size; /* it's size */
-+                              
 +static int microcode_open (struct inode *unused1, struct file *unused2)
 +{
 +      return capable(CAP_SYS_RAWIO) ? 0 : -EPERM;
 +}
 +
 +
-+static int do_microcode_update (void)
++static int do_microcode_update (const void __user *ubuf, size_t len)
 +{
 +      int err;
-+      dom0_op_t op;
++      void *kbuf;
 +
-+      err = sys_mlock((unsigned long)user_buffer, user_buffer_size);
-+      if (err != 0)
-+              return err;
-+
-+      op.cmd = DOM0_MICROCODE;
-+      op.u.microcode.data = user_buffer;
-+      op.u.microcode.length = user_buffer_size;
-+      err = HYPERVISOR_dom0_op(&op);
++      kbuf = vmalloc(len);
++      if (!kbuf)
++              return -ENOMEM
++
++      if (copy_from_user(kbuf, ubuf, len) == 0) {
++              dom0_op_t op;
++
++              op.cmd = DOM0_MICROCODE;
++              op.u.microcode.data = kbuf;
++              op.u.microcode.length = len;
++              err = HYPERVISOR_dom0_op(&op);
++      } else
++              err = -EFAULT;
 +
-+      (void)sys_munlock((unsigned long)user_buffer, user_buffer_size);
++      vfree(kbuf);
 +
 +      return err;
 +}
@@ -7536,17 +7538,9 @@
 +              return -EINVAL;
 +      }
 +
-+      if ((len >> PAGE_SHIFT) > num_physpages) {
-+              printk(KERN_ERR "microcode: too much data (max %ld pages)\n", 
num_physpages);
-+              return -EINVAL;
-+      }
-+
 +      down(&microcode_sem);
 +
-+      user_buffer = (void __user *) buf;
-+      user_buffer_size = (int) len;
-+
-+      ret = do_microcode_update();
++      ret = do_microcode_update(buf, len);
 +      if (!ret)
 +              ret = (ssize_t)len;
 +
================================================================

---- CVS-web:
    
http://cvs.pld-linux.org/SOURCES/xen-3.0-2.6.16.patch?r1=1.1.2.2.2.4&r2=1.1.2.2.2.5&f=u

_______________________________________________
pld-cvs-commit mailing list
[email protected]
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to