Merge branch 'x86-setup-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 14 Sep 2009 15:01:47 +0000 (08:01 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 14 Sep 2009 15:01:47 +0000 (08:01 -0700)
* 'x86-setup-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/linux-2.6-tip:
  x86, e820: Guard against array overflowed in __e820_add_region()
  x86, setup: remove obsolete pre-Kconfig CONFIG_VIDEO_ variables

1  2 
arch/x86/boot/video-vesa.c
arch/x86/kernel/e820.c

@@@ -31,7 -31,6 +31,6 @@@ static inline void vesa_store_mode_para
  
  static int vesa_probe(void)
  {
- #if defined(CONFIG_VIDEO_VESA) || defined(CONFIG_FIRMWARE_EDID)
        struct biosregs ireg, oreg;
        u16 mode;
        addr_t mode_ptr;
        ireg.di = (size_t)&vginfo;
        intcall(0x10, &ireg, &oreg);
  
 -      if (ireg.ax != 0x004f ||
 +      if (oreg.ax != 0x004f ||
            vginfo.signature != VESA_MAGIC ||
            vginfo.version < 0x0102)
                return 0;       /* Not present */
- #endif /* CONFIG_VIDEO_VESA || CONFIG_FIRMWARE_EDID */
- #ifdef CONFIG_VIDEO_VESA
        set_fs(vginfo.video_mode_ptr.seg);
        mode_ptr = vginfo.video_mode_ptr.off;
  
@@@ -70,7 -68,7 +68,7 @@@
                ireg.di = (size_t)&vminfo;
                intcall(0x10, &ireg, &oreg);
  
 -              if (ireg.ax != 0x004f)
 +              if (oreg.ax != 0x004f)
                        continue;
  
                if ((vminfo.mode_attr & 0x15) == 0x05) {
        }
  
        return nmodes;
- #else
-       return 0;
- #endif /* CONFIG_VIDEO_VESA */
  }
  
  static int vesa_set_mode(struct mode_info *mode)
diff --combined arch/x86/kernel/e820.c
@@@ -115,7 -115,7 +115,7 @@@ static void __init __e820_add_region(st
  {
        int x = e820x->nr_map;
  
-       if (x == ARRAY_SIZE(e820x->map)) {
+       if (x >= ARRAY_SIZE(e820x->map)) {
                printk(KERN_ERR "Ooops! Too many entries in the memory map!\n");
                return;
        }
@@@ -627,9 -627,10 +627,9 @@@ __init void e820_setup_gap(void
  #ifdef CONFIG_X86_64
        if (!found) {
                gapstart = (max_pfn << PAGE_SHIFT) + 1024*1024;
 -              printk(KERN_ERR "PCI: Warning: Cannot find a gap in the 32bit "
 -                     "address range\n"
 -                     KERN_ERR "PCI: Unassigned devices with 32bit resource "
 -                     "registers may break!\n");
 +              printk(KERN_ERR
 +      "PCI: Warning: Cannot find a gap in the 32bit address range\n"
 +      "PCI: Unassigned devices with 32bit resource registers may break!\n");
        }
  #endif
  
@@@ -1382,8 -1383,6 +1382,8 @@@ static unsigned long ram_alignment(reso
        return 32*1024*1024;
  }
  
 +#define MAX_RESOURCE_SIZE ((resource_size_t)-1)
 +
  void __init e820_reserve_resources_late(void)
  {
        int i;
         * avoid stolen RAM:
         */
        for (i = 0; i < e820.nr_map; i++) {
 -              struct e820entry *entry = &e820_saved.map[i];
 -              resource_size_t start, end;
 +              struct e820entry *entry = &e820.map[i];
 +              u64 start, end;
  
                if (entry->type != E820_RAM)
                        continue;
                start = entry->addr + entry->size;
 -              end = round_up(start, ram_alignment(start));
 -              if (start == end)
 +              end = round_up(start, ram_alignment(start)) - 1;
 +              if (end > MAX_RESOURCE_SIZE)
 +                      end = MAX_RESOURCE_SIZE;
 +              if (start >= end)
                        continue;
 -              reserve_region_with_split(&iomem_resource, start,
 -                                                end - 1, "RAM buffer");
 +              reserve_region_with_split(&iomem_resource, start, end,
 +                                        "RAM buffer");
        }
  }