kernel: fix CVE-2013-1763 in older kernels
[openwrt.git] / target / linux / generic / patches-3.6 / 930-crashlog.patch
index bce0ea4..8c1a18a 100644 (file)
 +#endif
 --- a/init/Kconfig
 +++ b/init/Kconfig
-@@ -926,6 +926,10 @@ config RELAY
+@@ -1105,6 +1105,10 @@ config RELAY
  
          If unsure, say N.
  
 +config CRASHLOG
 +      bool "Crash logging"
-+      depends on (!NO_BOOTMEM || HAVE_MEMBLOCK) && !ARM
++      depends on (!NO_BOOTMEM || HAVE_MEMBLOCK) && !(ARM || SPARC || PPC)
 +
  config BLK_DEV_INITRD
        bool "Initial RAM filesystem and RAM disk (initramfs/initrd) support"
        depends on BROKEN || !FRV
 --- a/kernel/Makefile
 +++ b/kernel/Makefile
-@@ -107,6 +107,7 @@ obj-$(CONFIG_USER_RETURN_NOTIFIER) += us
+@@ -110,6 +110,7 @@ obj-$(CONFIG_USER_RETURN_NOTIFIER) += us
  obj-$(CONFIG_PADATA) += padata.o
  obj-$(CONFIG_CRASH_DUMP) += crash_dump.o
  obj-$(CONFIG_JUMP_LABEL) += jump_label.o
@@ -43,7 +43,7 @@
  
 --- /dev/null
 +++ b/kernel/crashlog.c
-@@ -0,0 +1,190 @@
+@@ -0,0 +1,181 @@
 +/*
 + * Crash information logger
 + * Copyright (C) 2010 Felix Fietkau <nbd@openwrt.org>
 +}
 +
 +static void crashlog_do_dump(struct kmsg_dumper *dumper,
-+              enum kmsg_dump_reason reason, const char *s1, unsigned long l1,
-+              const char *s2, unsigned long l2)
++              enum kmsg_dump_reason reason)
 +{
-+      unsigned long s1_start, s2_start;
-+      unsigned long l1_cpy, l2_cpy;
 +      struct timeval tv;
 +      struct module *m;
 +      char *buf;
-+      int len;
++      size_t len;
 +
 +      if (!first)
 +              crashlog_printf("\n===================================\n");
 +      }
 +
 +      buf = (char *)&crashlog_buf->data[crashlog_buf->len];
-+      len = get_maxlen();
 +
-+      l2_cpy = min(l2, (unsigned long)len);
-+      l1_cpy = min(l1, (unsigned long)len - l2_cpy);
++      kmsg_dump_get_buffer(dumper, true, buf, get_maxlen(), &len);
 +
-+      s2_start = l2 - l2_cpy;
-+      s1_start = l1 - l1_cpy;
-+
-+      memcpy(buf, s1 + s1_start, l1_cpy);
-+      memcpy(buf + l1_cpy, s2 + s2_start, l2_cpy);
-+      crashlog_buf->len += l1_cpy + l2_cpy;
++      crashlog_buf->len += len;
 +}
 +
 +
 +      crashlog_buf->magic = CRASHLOG_MAGIC;
 +      crashlog_buf->len = 0;
 +
++      dump.max_reason = KMSG_DUMP_OOPS;
 +      dump.dump = crashlog_do_dump;
 +      kmsg_dump_register(&dump);
 +
  
  static struct memblock_region memblock_memory_init_regions[INIT_MEMBLOCK_REGIONS] __initdata_memblock;
  static struct memblock_region memblock_reserved_init_regions[INIT_MEMBLOCK_REGIONS] __initdata_memblock;
-@@ -305,6 +306,8 @@ static void __init_memblock memblock_ins
+@@ -341,6 +342,8 @@ static void __init_memblock memblock_ins
        memblock_set_region_node(rgn, nid);
        type->cnt++;
        type->total_size += size;