You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'akpm' (incoming from Andrew)
Merge third batch of fixes from Andrew Morton: "Most of the rest. I still have two large patchsets against AIO and IPC, but they're a bit stuck behind other trees and I'm about to vanish for six days. - random fixlets - inotify - more of the MM queue - show_stack() cleanups - DMI update - kthread/workqueue things - compat cleanups - epoll udpates - binfmt updates - nilfs2 - hfs - hfsplus - ptrace - kmod - coredump - kexec - rbtree - pids - pidns - pps - semaphore tweaks - some w1 patches - relay updates - core Kconfig changes - sysrq tweaks" * emailed patches from Andrew Morton <akpm@linux-foundation.org>: (109 commits) Documentation/sysrq: fix inconstistent help message of sysrq key ethernet/emac/sysrq: fix inconstistent help message of sysrq key sparc/sysrq: fix inconstistent help message of sysrq key powerpc/xmon/sysrq: fix inconstistent help message of sysrq key ARM/etm/sysrq: fix inconstistent help message of sysrq key power/sysrq: fix inconstistent help message of sysrq key kgdb/sysrq: fix inconstistent help message of sysrq key lib/decompress.c: fix initconst notifier-error-inject: fix module names in Kconfig kernel/sys.c: make prctl(PR_SET_MM) generally available UAPI: remove empty Kbuild files menuconfig: print more info for symbol without prompts init/Kconfig: re-order CONFIG_EXPERT options to fix menuconfig display kconfig menu: move Virtualization drivers near other virtualization options Kconfig: consolidate CONFIG_DEBUG_STRICT_USER_COPY_CHECKS relay: use macro PAGE_ALIGN instead of FIX_SIZE kernel/relay.c: move FIX_SIZE macro into relay.c kernel/relay.c: remove unused function argument actor drivers/w1/slaves/w1_ds2760.c: fix the error handling in w1_ds2760_add_slave() drivers/w1/slaves/w1_ds2781.c: fix the error handling in w1_ds2781_add_slave() ...
This commit is contained in:
+23
-2
@@ -1192,7 +1192,7 @@ config MEMORY_NOTIFIER_ERROR_INJECT
|
||||
bash: echo: write error: Cannot allocate memory
|
||||
|
||||
To compile this code as a module, choose M here: the module will
|
||||
be called pSeries-reconfig-notifier-error-inject.
|
||||
be called memory-notifier-error-inject.
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
@@ -1209,7 +1209,7 @@ config OF_RECONFIG_NOTIFIER_ERROR_INJECT
|
||||
notified, write the error code to "actions/<notifier event>/error".
|
||||
|
||||
To compile this code as a module, choose M here: the module will
|
||||
be called memory-notifier-error-inject.
|
||||
be called of-reconfig-notifier-error-inject.
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
@@ -1292,6 +1292,24 @@ config LATENCYTOP
|
||||
Enable this option if you want to use the LatencyTOP tool
|
||||
to find out which userspace is blocking on what kernel operations.
|
||||
|
||||
config ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS
|
||||
bool
|
||||
|
||||
config DEBUG_STRICT_USER_COPY_CHECKS
|
||||
bool "Strict user copy size checks"
|
||||
depends on ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS
|
||||
depends on DEBUG_KERNEL && !TRACE_BRANCH_PROFILING
|
||||
help
|
||||
Enabling this option turns a certain set of sanity checks for user
|
||||
copy operations into compile time failures.
|
||||
|
||||
The copy_from_user() etc checks are there to help test if there
|
||||
are sufficient security checks on the length argument of
|
||||
the copy operation, by having gcc prove that the argument is
|
||||
within bounds.
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
source mm/Kconfig.debug
|
||||
source kernel/trace/Kconfig
|
||||
|
||||
@@ -1463,5 +1481,8 @@ source "lib/Kconfig.kgdb"
|
||||
|
||||
source "lib/Kconfig.kmemcheck"
|
||||
|
||||
config TEST_STRING_HELPERS
|
||||
tristate "Test functions located in the string_helpers module at runtime"
|
||||
|
||||
config TEST_KSTRTOX
|
||||
tristate "Test kstrto*() family of functions at runtime"
|
||||
|
||||
+4
-1
@@ -15,6 +15,7 @@ lib-y := ctype.o string.o vsprintf.o cmdline.o \
|
||||
is_single_threaded.o plist.o decompress.o kobject_uevent.o \
|
||||
earlycpio.o
|
||||
|
||||
obj-$(CONFIG_ARCH_HAS_DEBUG_STRICT_USER_COPY_CHECKS) += usercopy.o
|
||||
lib-$(CONFIG_MMU) += ioremap.o
|
||||
lib-$(CONFIG_SMP) += cpumask.o
|
||||
|
||||
@@ -22,8 +23,10 @@ lib-y += kobject.o klist.o
|
||||
|
||||
obj-y += bcd.o div64.o sort.o parser.o halfmd4.o debug_locks.o random32.o \
|
||||
bust_spinlocks.o hexdump.o kasprintf.o bitmap.o scatterlist.o \
|
||||
string_helpers.o gcd.o lcm.o list_sort.o uuid.o flex_array.o \
|
||||
gcd.o lcm.o list_sort.o uuid.o flex_array.o \
|
||||
bsearch.o find_last_bit.o find_next_bit.o llist.o memweight.o kfifo.o
|
||||
obj-y += string_helpers.o
|
||||
obj-$(CONFIG_TEST_STRING_HELPERS) += test-string_helpers.o
|
||||
obj-y += kstrtox.o
|
||||
obj-$(CONFIG_TEST_KSTRTOX) += test-kstrtox.o
|
||||
|
||||
|
||||
+1
-1
@@ -38,7 +38,7 @@ struct compress_format {
|
||||
decompress_fn decompressor;
|
||||
};
|
||||
|
||||
static const struct compress_format compressed_formats[] __initdata = {
|
||||
static const struct compress_format compressed_formats[] __initconst = {
|
||||
{ {037, 0213}, "gzip", gunzip },
|
||||
{ {037, 0236}, "gzip", gunzip },
|
||||
{ {0x42, 0x5a}, "bzip2", bunzip2 },
|
||||
|
||||
+8
-3
@@ -5,11 +5,16 @@
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/sched.h>
|
||||
|
||||
/**
|
||||
* dump_stack - dump the current task information and its stack trace
|
||||
*
|
||||
* Architectures can override this implementation by implementing its own.
|
||||
*/
|
||||
void dump_stack(void)
|
||||
{
|
||||
printk(KERN_NOTICE
|
||||
"This architecture does not implement dump_stack()\n");
|
||||
dump_stack_print_info(KERN_DEFAULT);
|
||||
show_stack(NULL, NULL);
|
||||
}
|
||||
|
||||
EXPORT_SYMBOL(dump_stack);
|
||||
|
||||
+5
-43
@@ -24,6 +24,7 @@
|
||||
#include <linux/sysctl.h>
|
||||
#include <linux/ctype.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/string_helpers.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/dynamic_debug.h>
|
||||
#include <linux/debugfs.h>
|
||||
@@ -276,47 +277,6 @@ static inline int parse_lineno(const char *str, unsigned int *val)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Undo octal escaping in a string, inplace. This is useful to
|
||||
* allow the user to express a query which matches a format
|
||||
* containing embedded spaces.
|
||||
*/
|
||||
static char *unescape(char *str)
|
||||
{
|
||||
char *in = str;
|
||||
char *out = str;
|
||||
|
||||
while (*in) {
|
||||
if (*in == '\\') {
|
||||
if (in[1] == '\\') {
|
||||
*out++ = '\\';
|
||||
in += 2;
|
||||
continue;
|
||||
} else if (in[1] == 't') {
|
||||
*out++ = '\t';
|
||||
in += 2;
|
||||
continue;
|
||||
} else if (in[1] == 'n') {
|
||||
*out++ = '\n';
|
||||
in += 2;
|
||||
continue;
|
||||
} else if (isodigit(in[1]) &&
|
||||
isodigit(in[2]) &&
|
||||
isodigit(in[3])) {
|
||||
*out++ = (((in[1] - '0') << 6) |
|
||||
((in[2] - '0') << 3) |
|
||||
(in[3] - '0'));
|
||||
in += 4;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
*out++ = *in++;
|
||||
}
|
||||
*out = '\0';
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
static int check_set(const char **dest, char *src, char *name)
|
||||
{
|
||||
int rc = 0;
|
||||
@@ -370,8 +330,10 @@ static int ddebug_parse_query(char *words[], int nwords,
|
||||
} else if (!strcmp(words[i], "module")) {
|
||||
rc = check_set(&query->module, words[i+1], "module");
|
||||
} else if (!strcmp(words[i], "format")) {
|
||||
rc = check_set(&query->format, unescape(words[i+1]),
|
||||
"format");
|
||||
string_unescape_inplace(words[i+1], UNESCAPE_SPACE |
|
||||
UNESCAPE_OCTAL |
|
||||
UNESCAPE_SPECIAL);
|
||||
rc = check_set(&query->format, words[i+1], "format");
|
||||
} else if (!strcmp(words[i], "line")) {
|
||||
char *first = words[i+1];
|
||||
char *last = strchr(first, '-');
|
||||
|
||||
+5
-4
@@ -117,8 +117,7 @@ static int black_path_count(struct rb_node *rb)
|
||||
static void check(int nr_nodes)
|
||||
{
|
||||
struct rb_node *rb;
|
||||
int count = 0;
|
||||
int blacks = 0;
|
||||
int count = 0, blacks = 0;
|
||||
u32 prev_key = 0;
|
||||
|
||||
for (rb = rb_first(&root); rb; rb = rb_next(rb)) {
|
||||
@@ -134,7 +133,9 @@ static void check(int nr_nodes)
|
||||
prev_key = node->key;
|
||||
count++;
|
||||
}
|
||||
|
||||
WARN_ON_ONCE(count != nr_nodes);
|
||||
WARN_ON_ONCE(count < (1 << black_path_count(rb_last(&root))) - 1);
|
||||
}
|
||||
|
||||
static void check_augmented(int nr_nodes)
|
||||
@@ -148,7 +149,7 @@ static void check_augmented(int nr_nodes)
|
||||
}
|
||||
}
|
||||
|
||||
static int rbtree_test_init(void)
|
||||
static int __init rbtree_test_init(void)
|
||||
{
|
||||
int i, j;
|
||||
cycles_t time1, time2, time;
|
||||
@@ -221,7 +222,7 @@ static int rbtree_test_init(void)
|
||||
return -EAGAIN; /* Fail will directly unload the module */
|
||||
}
|
||||
|
||||
static void rbtree_test_exit(void)
|
||||
static void __exit rbtree_test_exit(void)
|
||||
{
|
||||
printk(KERN_ALERT "test exit\n");
|
||||
}
|
||||
|
||||
@@ -2,10 +2,12 @@
|
||||
* Helpers for formatting and printing strings
|
||||
*
|
||||
* Copyright 31 August 2008 James Bottomley
|
||||
* Copyright (C) 2013, Intel Corporation
|
||||
*/
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/math64.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/ctype.h>
|
||||
#include <linux/string_helpers.h>
|
||||
|
||||
/**
|
||||
@@ -66,3 +68,134 @@ int string_get_size(u64 size, const enum string_size_units units,
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(string_get_size);
|
||||
|
||||
static bool unescape_space(char **src, char **dst)
|
||||
{
|
||||
char *p = *dst, *q = *src;
|
||||
|
||||
switch (*q) {
|
||||
case 'n':
|
||||
*p = '\n';
|
||||
break;
|
||||
case 'r':
|
||||
*p = '\r';
|
||||
break;
|
||||
case 't':
|
||||
*p = '\t';
|
||||
break;
|
||||
case 'v':
|
||||
*p = '\v';
|
||||
break;
|
||||
case 'f':
|
||||
*p = '\f';
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
*dst += 1;
|
||||
*src += 1;
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool unescape_octal(char **src, char **dst)
|
||||
{
|
||||
char *p = *dst, *q = *src;
|
||||
u8 num;
|
||||
|
||||
if (isodigit(*q) == 0)
|
||||
return false;
|
||||
|
||||
num = (*q++) & 7;
|
||||
while (num < 32 && isodigit(*q) && (q - *src < 3)) {
|
||||
num <<= 3;
|
||||
num += (*q++) & 7;
|
||||
}
|
||||
*p = num;
|
||||
*dst += 1;
|
||||
*src = q;
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool unescape_hex(char **src, char **dst)
|
||||
{
|
||||
char *p = *dst, *q = *src;
|
||||
int digit;
|
||||
u8 num;
|
||||
|
||||
if (*q++ != 'x')
|
||||
return false;
|
||||
|
||||
num = digit = hex_to_bin(*q++);
|
||||
if (digit < 0)
|
||||
return false;
|
||||
|
||||
digit = hex_to_bin(*q);
|
||||
if (digit >= 0) {
|
||||
q++;
|
||||
num = (num << 4) | digit;
|
||||
}
|
||||
*p = num;
|
||||
*dst += 1;
|
||||
*src = q;
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool unescape_special(char **src, char **dst)
|
||||
{
|
||||
char *p = *dst, *q = *src;
|
||||
|
||||
switch (*q) {
|
||||
case '\"':
|
||||
*p = '\"';
|
||||
break;
|
||||
case '\\':
|
||||
*p = '\\';
|
||||
break;
|
||||
case 'a':
|
||||
*p = '\a';
|
||||
break;
|
||||
case 'e':
|
||||
*p = '\e';
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
*dst += 1;
|
||||
*src += 1;
|
||||
return true;
|
||||
}
|
||||
|
||||
int string_unescape(char *src, char *dst, size_t size, unsigned int flags)
|
||||
{
|
||||
char *out = dst;
|
||||
|
||||
while (*src && --size) {
|
||||
if (src[0] == '\\' && src[1] != '\0' && size > 1) {
|
||||
src++;
|
||||
size--;
|
||||
|
||||
if (flags & UNESCAPE_SPACE &&
|
||||
unescape_space(&src, &out))
|
||||
continue;
|
||||
|
||||
if (flags & UNESCAPE_OCTAL &&
|
||||
unescape_octal(&src, &out))
|
||||
continue;
|
||||
|
||||
if (flags & UNESCAPE_HEX &&
|
||||
unescape_hex(&src, &out))
|
||||
continue;
|
||||
|
||||
if (flags & UNESCAPE_SPECIAL &&
|
||||
unescape_special(&src, &out))
|
||||
continue;
|
||||
|
||||
*out++ = '\\';
|
||||
}
|
||||
*out++ = *src++;
|
||||
}
|
||||
*out = '\0';
|
||||
|
||||
return out - dst;
|
||||
}
|
||||
EXPORT_SYMBOL(string_unescape);
|
||||
|
||||
@@ -0,0 +1,103 @@
|
||||
/*
|
||||
* Test cases for lib/string_helpers.c module.
|
||||
*/
|
||||
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/random.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/string_helpers.h>
|
||||
|
||||
struct test_string {
|
||||
const char *in;
|
||||
const char *out;
|
||||
unsigned int flags;
|
||||
};
|
||||
|
||||
static const struct test_string strings[] __initconst = {
|
||||
{
|
||||
.in = "\\f\\ \\n\\r\\t\\v",
|
||||
.out = "\f\\ \n\r\t\v",
|
||||
.flags = UNESCAPE_SPACE,
|
||||
},
|
||||
{
|
||||
.in = "\\40\\1\\387\\0064\\05\\040\\8a\\110\\777",
|
||||
.out = " \001\00387\0064\005 \\8aH?7",
|
||||
.flags = UNESCAPE_OCTAL,
|
||||
},
|
||||
{
|
||||
.in = "\\xv\\xa\\x2c\\xD\\x6f2",
|
||||
.out = "\\xv\n,\ro2",
|
||||
.flags = UNESCAPE_HEX,
|
||||
},
|
||||
{
|
||||
.in = "\\h\\\\\\\"\\a\\e\\",
|
||||
.out = "\\h\\\"\a\e\\",
|
||||
.flags = UNESCAPE_SPECIAL,
|
||||
},
|
||||
};
|
||||
|
||||
static void __init test_string_unescape(unsigned int flags, bool inplace)
|
||||
{
|
||||
char in[256];
|
||||
char out_test[256];
|
||||
char out_real[256];
|
||||
int i, p = 0, q_test = 0, q_real = sizeof(out_real);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(strings); i++) {
|
||||
const char *s = strings[i].in;
|
||||
int len = strlen(strings[i].in);
|
||||
|
||||
/* Copy string to in buffer */
|
||||
memcpy(&in[p], s, len);
|
||||
p += len;
|
||||
|
||||
/* Copy expected result for given flags */
|
||||
if (flags & strings[i].flags) {
|
||||
s = strings[i].out;
|
||||
len = strlen(strings[i].out);
|
||||
}
|
||||
memcpy(&out_test[q_test], s, len);
|
||||
q_test += len;
|
||||
}
|
||||
in[p++] = '\0';
|
||||
|
||||
/* Call string_unescape and compare result */
|
||||
if (inplace) {
|
||||
memcpy(out_real, in, p);
|
||||
if (flags == UNESCAPE_ANY)
|
||||
q_real = string_unescape_any_inplace(out_real);
|
||||
else
|
||||
q_real = string_unescape_inplace(out_real, flags);
|
||||
} else if (flags == UNESCAPE_ANY) {
|
||||
q_real = string_unescape_any(in, out_real, q_real);
|
||||
} else {
|
||||
q_real = string_unescape(in, out_real, q_real, flags);
|
||||
}
|
||||
|
||||
if (q_real != q_test || memcmp(out_test, out_real, q_test)) {
|
||||
pr_warn("Test failed: flags = %u\n", flags);
|
||||
print_hex_dump(KERN_WARNING, "Input: ",
|
||||
DUMP_PREFIX_NONE, 16, 1, in, p - 1, true);
|
||||
print_hex_dump(KERN_WARNING, "Expected: ",
|
||||
DUMP_PREFIX_NONE, 16, 1, out_test, q_test, true);
|
||||
print_hex_dump(KERN_WARNING, "Got: ",
|
||||
DUMP_PREFIX_NONE, 16, 1, out_real, q_real, true);
|
||||
}
|
||||
}
|
||||
|
||||
static int __init test_string_helpers_init(void)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
pr_info("Running tests...\n");
|
||||
for (i = 0; i < UNESCAPE_ANY + 1; i++)
|
||||
test_string_unescape(i, false);
|
||||
test_string_unescape(get_random_int() % (UNESCAPE_ANY + 1), true);
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
module_init(test_string_helpers_init);
|
||||
MODULE_LICENSE("Dual BSD/GPL");
|
||||
@@ -0,0 +1,9 @@
|
||||
#include <linux/export.h>
|
||||
#include <linux/bug.h>
|
||||
#include <linux/uaccess.h>
|
||||
|
||||
void copy_from_user_overflow(void)
|
||||
{
|
||||
WARN(1, "Buffer overflow detected!\n");
|
||||
}
|
||||
EXPORT_SYMBOL(copy_from_user_overflow);
|
||||
Reference in New Issue
Block a user