diff options
| -rw-r--r-- | include/linux/string.h | 5 | ||||
| -rw-r--r-- | kernel/trace/ftrace.c | 6 | ||||
| -rw-r--r-- | kernel/trace/ring_buffer.c | 4 | ||||
| -rw-r--r-- | kernel/trace/trace_events_filter.c | 29 | ||||
| -rw-r--r-- | lib/string.c | 27 | ||||
| -rwxr-xr-x | scripts/recordmcount.pl | 2 |
6 files changed, 56 insertions, 17 deletions
diff --git a/include/linux/string.h b/include/linux/string.h index 651839a2a755..a716ee2a8adb 100644 --- a/include/linux/string.h +++ b/include/linux/string.h | |||
| @@ -72,7 +72,10 @@ static inline __must_check char *strstrip(char *str) | |||
| 72 | } | 72 | } |
| 73 | 73 | ||
| 74 | #ifndef __HAVE_ARCH_STRSTR | 74 | #ifndef __HAVE_ARCH_STRSTR |
| 75 | extern char * strstr(const char *,const char *); | 75 | extern char * strstr(const char *, const char *); |
| 76 | #endif | ||
| 77 | #ifndef __HAVE_ARCH_STRNSTR | ||
| 78 | extern char * strnstr(const char *, const char *, size_t); | ||
| 76 | #endif | 79 | #endif |
| 77 | #ifndef __HAVE_ARCH_STRLEN | 80 | #ifndef __HAVE_ARCH_STRLEN |
| 78 | extern __kernel_size_t strlen(const char *); | 81 | extern __kernel_size_t strlen(const char *); |
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c index 7968762c8167..1e6640f80454 100644 --- a/kernel/trace/ftrace.c +++ b/kernel/trace/ftrace.c | |||
| @@ -1690,7 +1690,7 @@ ftrace_regex_lseek(struct file *file, loff_t offset, int origin) | |||
| 1690 | static int ftrace_match(char *str, char *regex, int len, int type) | 1690 | static int ftrace_match(char *str, char *regex, int len, int type) |
| 1691 | { | 1691 | { |
| 1692 | int matched = 0; | 1692 | int matched = 0; |
| 1693 | char *ptr; | 1693 | int slen; |
| 1694 | 1694 | ||
| 1695 | switch (type) { | 1695 | switch (type) { |
| 1696 | case MATCH_FULL: | 1696 | case MATCH_FULL: |
| @@ -1706,8 +1706,8 @@ static int ftrace_match(char *str, char *regex, int len, int type) | |||
| 1706 | matched = 1; | 1706 | matched = 1; |
| 1707 | break; | 1707 | break; |
| 1708 | case MATCH_END_ONLY: | 1708 | case MATCH_END_ONLY: |
| 1709 | ptr = strstr(str, regex); | 1709 | slen = strlen(str); |
| 1710 | if (ptr && (ptr[len] == 0)) | 1710 | if (slen >= len && memcmp(str + slen - len, regex, len) == 0) |
| 1711 | matched = 1; | 1711 | matched = 1; |
| 1712 | break; | 1712 | break; |
| 1713 | } | 1713 | } |
diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index 2326b04c95c4..edefe3b2801b 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c | |||
| @@ -2869,7 +2869,7 @@ rb_get_reader_page(struct ring_buffer_per_cpu *cpu_buffer) | |||
| 2869 | * Splice the empty reader page into the list around the head. | 2869 | * Splice the empty reader page into the list around the head. |
| 2870 | */ | 2870 | */ |
| 2871 | reader = rb_set_head_page(cpu_buffer); | 2871 | reader = rb_set_head_page(cpu_buffer); |
| 2872 | cpu_buffer->reader_page->list.next = reader->list.next; | 2872 | cpu_buffer->reader_page->list.next = rb_list_head(reader->list.next); |
| 2873 | cpu_buffer->reader_page->list.prev = reader->list.prev; | 2873 | cpu_buffer->reader_page->list.prev = reader->list.prev; |
| 2874 | 2874 | ||
| 2875 | /* | 2875 | /* |
| @@ -2906,7 +2906,7 @@ rb_get_reader_page(struct ring_buffer_per_cpu *cpu_buffer) | |||
| 2906 | * | 2906 | * |
| 2907 | * Now make the new head point back to the reader page. | 2907 | * Now make the new head point back to the reader page. |
| 2908 | */ | 2908 | */ |
| 2909 | reader->list.next->prev = &cpu_buffer->reader_page->list; | 2909 | rb_list_head(reader->list.next)->prev = &cpu_buffer->reader_page->list; |
| 2910 | rb_inc_page(cpu_buffer, &cpu_buffer->head_page); | 2910 | rb_inc_page(cpu_buffer, &cpu_buffer->head_page); |
| 2911 | 2911 | ||
| 2912 | /* Finally update the reader page to the new head */ | 2912 | /* Finally update the reader page to the new head */ |
diff --git a/kernel/trace/trace_events_filter.c b/kernel/trace/trace_events_filter.c index 50504cb228de..e42af9aad69f 100644 --- a/kernel/trace/trace_events_filter.c +++ b/kernel/trace/trace_events_filter.c | |||
| @@ -211,8 +211,9 @@ static int filter_pred_pchar(struct filter_pred *pred, void *event, | |||
| 211 | { | 211 | { |
| 212 | char **addr = (char **)(event + pred->offset); | 212 | char **addr = (char **)(event + pred->offset); |
| 213 | int cmp, match; | 213 | int cmp, match; |
| 214 | int len = strlen(*addr) + 1; /* including tailing '\0' */ | ||
| 214 | 215 | ||
| 215 | cmp = pred->regex.match(*addr, &pred->regex, pred->regex.field_len); | 216 | cmp = pred->regex.match(*addr, &pred->regex, len); |
| 216 | 217 | ||
| 217 | match = cmp ^ pred->not; | 218 | match = cmp ^ pred->not; |
| 218 | 219 | ||
| @@ -251,7 +252,18 @@ static int filter_pred_none(struct filter_pred *pred, void *event, | |||
| 251 | return 0; | 252 | return 0; |
| 252 | } | 253 | } |
| 253 | 254 | ||
| 254 | /* Basic regex callbacks */ | 255 | /* |
| 256 | * regex_match_foo - Basic regex callbacks | ||
| 257 | * | ||
| 258 | * @str: the string to be searched | ||
| 259 | * @r: the regex structure containing the pattern string | ||
| 260 | * @len: the length of the string to be searched (including '\0') | ||
| 261 | * | ||
| 262 | * Note: | ||
| 263 | * - @str might not be NULL-terminated if it's of type DYN_STRING | ||
| 264 | * or STATIC_STRING | ||
| 265 | */ | ||
| 266 | |||
| 255 | static int regex_match_full(char *str, struct regex *r, int len) | 267 | static int regex_match_full(char *str, struct regex *r, int len) |
| 256 | { | 268 | { |
| 257 | if (strncmp(str, r->pattern, len) == 0) | 269 | if (strncmp(str, r->pattern, len) == 0) |
| @@ -261,23 +273,24 @@ static int regex_match_full(char *str, struct regex *r, int len) | |||
| 261 | 273 | ||
| 262 | static int regex_match_front(char *str, struct regex *r, int len) | 274 | static int regex_match_front(char *str, struct regex *r, int len) |
| 263 | { | 275 | { |
| 264 | if (strncmp(str, r->pattern, len) == 0) | 276 | if (strncmp(str, r->pattern, r->len) == 0) |
| 265 | return 1; | 277 | return 1; |
| 266 | return 0; | 278 | return 0; |
| 267 | } | 279 | } |
| 268 | 280 | ||
| 269 | static int regex_match_middle(char *str, struct regex *r, int len) | 281 | static int regex_match_middle(char *str, struct regex *r, int len) |
| 270 | { | 282 | { |
| 271 | if (strstr(str, r->pattern)) | 283 | if (strnstr(str, r->pattern, len)) |
| 272 | return 1; | 284 | return 1; |
| 273 | return 0; | 285 | return 0; |
| 274 | } | 286 | } |
| 275 | 287 | ||
| 276 | static int regex_match_end(char *str, struct regex *r, int len) | 288 | static int regex_match_end(char *str, struct regex *r, int len) |
| 277 | { | 289 | { |
| 278 | char *ptr = strstr(str, r->pattern); | 290 | int strlen = len - 1; |
| 279 | 291 | ||
| 280 | if (ptr && (ptr[r->len] == 0)) | 292 | if (strlen >= r->len && |
| 293 | memcmp(str + strlen - r->len, r->pattern, r->len) == 0) | ||
| 281 | return 1; | 294 | return 1; |
| 282 | return 0; | 295 | return 0; |
| 283 | } | 296 | } |
| @@ -781,10 +794,8 @@ static int filter_add_pred(struct filter_parse_state *ps, | |||
| 781 | pred->regex.field_len = field->size; | 794 | pred->regex.field_len = field->size; |
| 782 | } else if (field->filter_type == FILTER_DYN_STRING) | 795 | } else if (field->filter_type == FILTER_DYN_STRING) |
| 783 | fn = filter_pred_strloc; | 796 | fn = filter_pred_strloc; |
| 784 | else { | 797 | else |
| 785 | fn = filter_pred_pchar; | 798 | fn = filter_pred_pchar; |
| 786 | pred->regex.field_len = strlen(pred->regex.pattern); | ||
| 787 | } | ||
| 788 | } else { | 799 | } else { |
| 789 | if (field->is_signed) | 800 | if (field->is_signed) |
| 790 | ret = strict_strtoll(pred->regex.pattern, 0, &val); | 801 | ret = strict_strtoll(pred->regex.pattern, 0, &val); |
diff --git a/lib/string.c b/lib/string.c index 9f75b4ec50b8..a1cdcfcc42d0 100644 --- a/lib/string.c +++ b/lib/string.c | |||
| @@ -667,7 +667,7 @@ EXPORT_SYMBOL(memscan); | |||
| 667 | */ | 667 | */ |
| 668 | char *strstr(const char *s1, const char *s2) | 668 | char *strstr(const char *s1, const char *s2) |
| 669 | { | 669 | { |
| 670 | int l1, l2; | 670 | size_t l1, l2; |
| 671 | 671 | ||
| 672 | l2 = strlen(s2); | 672 | l2 = strlen(s2); |
| 673 | if (!l2) | 673 | if (!l2) |
| @@ -684,6 +684,31 @@ char *strstr(const char *s1, const char *s2) | |||
| 684 | EXPORT_SYMBOL(strstr); | 684 | EXPORT_SYMBOL(strstr); |
| 685 | #endif | 685 | #endif |
| 686 | 686 | ||
| 687 | #ifndef __HAVE_ARCH_STRNSTR | ||
| 688 | /** | ||
| 689 | * strnstr - Find the first substring in a length-limited string | ||
| 690 | * @s1: The string to be searched | ||
| 691 | * @s2: The string to search for | ||
| 692 | * @len: the maximum number of characters to search | ||
| 693 | */ | ||
| 694 | char *strnstr(const char *s1, const char *s2, size_t len) | ||
| 695 | { | ||
| 696 | size_t l1 = len, l2; | ||
| 697 | |||
| 698 | l2 = strlen(s2); | ||
| 699 | if (!l2) | ||
| 700 | return (char *)s1; | ||
| 701 | while (l1 >= l2) { | ||
| 702 | l1--; | ||
| 703 | if (!memcmp(s1, s2, l2)) | ||
| 704 | return (char *)s1; | ||
| 705 | s1++; | ||
| 706 | } | ||
| 707 | return NULL; | ||
| 708 | } | ||
| 709 | EXPORT_SYMBOL(strnstr); | ||
| 710 | #endif | ||
| 711 | |||
| 687 | #ifndef __HAVE_ARCH_MEMCHR | 712 | #ifndef __HAVE_ARCH_MEMCHR |
| 688 | /** | 713 | /** |
| 689 | * memchr - Find a character in an area of memory. | 714 | * memchr - Find a character in an area of memory. |
diff --git a/scripts/recordmcount.pl b/scripts/recordmcount.pl index 92f09fe9639e..ea6f6e3adaea 100755 --- a/scripts/recordmcount.pl +++ b/scripts/recordmcount.pl | |||
| @@ -194,7 +194,7 @@ sub check_objcopy | |||
| 194 | } | 194 | } |
| 195 | } | 195 | } |
| 196 | 196 | ||
| 197 | if ($arch eq "x86") { | 197 | if ($arch =~ /(x86(_64)?)|(i386)/) { |
| 198 | if ($bits == 64) { | 198 | if ($bits == 64) { |
| 199 | $arch = "x86_64"; | 199 | $arch = "x86_64"; |
| 200 | } else { | 200 | } else { |
