lguest: fix out-by-one error in address checking.
[pandora-kernel.git] / drivers / lguest / core.c
index 2535933..34842e5 100644 (file)
@@ -171,7 +171,7 @@ static void unmap_switcher(void)
 bool lguest_address_ok(const struct lguest *lg,
                       unsigned long addr, unsigned long len)
 {
-       return (addr+len) / PAGE_SIZE < lg->pfn_limit && (addr+len >= addr);
+       return addr+len <= lg->pfn_limit * PAGE_SIZE && (addr+len >= addr);
 }
 
 /*
@@ -232,6 +232,13 @@ int run_guest(struct lg_cpu *cpu, unsigned long __user *user)
                        }
                }
 
+               /*
+                * All long-lived kernel loops need to check with this horrible
+                * thing called the freezer.  If the Host is trying to suspend,
+                * it stops us.
+                */
+               try_to_freeze();
+
                /* Check for signals */
                if (signal_pending(current))
                        return -ERESTARTSYS;
@@ -245,13 +252,6 @@ int run_guest(struct lg_cpu *cpu, unsigned long __user *user)
                if (irq < LGUEST_IRQS)
                        try_deliver_interrupt(cpu, irq, more);
 
-               /*
-                * All long-lived kernel loops need to check with this horrible
-                * thing called the freezer.  If the Host is trying to suspend,
-                * it stops us.
-                */
-               try_to_freeze();
-
                /*
                 * Just make absolutely sure the Guest is still alive.  One of
                 * those hypercalls could have been fatal, for example.
@@ -313,7 +313,7 @@ static int __init init(void)
        int err;
 
        /* Lguest can't run under Xen, VMI or itself.  It does Tricky Stuff. */
-       if (paravirt_enabled()) {
+       if (get_kernel_rpl() != 0) {
                printk("lguest is afraid of being a guest\n");
                return -EPERM;
        }