Commit 71146051 authored by Ingo Molnar's avatar Ingo Molnar

Merge tag 'perf-urgent-for-mingo-20160527' of...

Merge tag 'perf-urgent-for-mingo-20160527' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/urgent

Pull perf/urgent fixes from Arnaldo Carvalho de Melo:

 - Fix kptr_restrict=2 related 'perf record' segfault (Wang Nan)

 - Fix CTF/libbabeltrace handling of chinese COMM strings (Wang Nan)
Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
parents 275ae411 5ea5888b
...@@ -204,6 +204,44 @@ static unsigned long long adjust_signedness(unsigned long long value_int, int si ...@@ -204,6 +204,44 @@ static unsigned long long adjust_signedness(unsigned long long value_int, int si
return (value_int & value_mask) | ~value_mask; return (value_int & value_mask) | ~value_mask;
} }
static int string_set_value(struct bt_ctf_field *field, const char *string)
{
char *buffer = NULL;
size_t len = strlen(string), i, p;
int err;
for (i = p = 0; i < len; i++, p++) {
if (isprint(string[i])) {
if (!buffer)
continue;
buffer[p] = string[i];
} else {
char numstr[5];
snprintf(numstr, sizeof(numstr), "\\x%02x",
(unsigned int)(string[i]) & 0xff);
if (!buffer) {
buffer = zalloc(i + (len - i) * 4 + 2);
if (!buffer) {
pr_err("failed to set unprintable string '%s'\n", string);
return bt_ctf_field_string_set_value(field, "UNPRINTABLE-STRING");
}
if (i > 0)
strncpy(buffer, string, i);
}
strncat(buffer + p, numstr, 4);
p += 3;
}
}
if (!buffer)
return bt_ctf_field_string_set_value(field, string);
err = bt_ctf_field_string_set_value(field, buffer);
free(buffer);
return err;
}
static int add_tracepoint_field_value(struct ctf_writer *cw, static int add_tracepoint_field_value(struct ctf_writer *cw,
struct bt_ctf_event_class *event_class, struct bt_ctf_event_class *event_class,
struct bt_ctf_event *event, struct bt_ctf_event *event,
...@@ -270,8 +308,7 @@ static int add_tracepoint_field_value(struct ctf_writer *cw, ...@@ -270,8 +308,7 @@ static int add_tracepoint_field_value(struct ctf_writer *cw,
} }
if (flags & FIELD_IS_STRING) if (flags & FIELD_IS_STRING)
ret = bt_ctf_field_string_set_value(field, ret = string_set_value(field, data + offset + i * len);
data + offset + i * len);
else { else {
unsigned long long value_int; unsigned long long value_int;
......
...@@ -673,6 +673,8 @@ int perf_event__synthesize_kernel_mmap(struct perf_tool *tool, ...@@ -673,6 +673,8 @@ int perf_event__synthesize_kernel_mmap(struct perf_tool *tool,
int err; int err;
union perf_event *event; union perf_event *event;
if (symbol_conf.kptr_restrict)
return -1;
if (map == NULL) if (map == NULL)
return -1; return -1;
......
...@@ -1933,17 +1933,17 @@ int setup_intlist(struct intlist **list, const char *list_str, ...@@ -1933,17 +1933,17 @@ int setup_intlist(struct intlist **list, const char *list_str,
static bool symbol__read_kptr_restrict(void) static bool symbol__read_kptr_restrict(void)
{ {
bool value = false; bool value = false;
FILE *fp = fopen("/proc/sys/kernel/kptr_restrict", "r");
if (geteuid() != 0) { if (fp != NULL) {
FILE *fp = fopen("/proc/sys/kernel/kptr_restrict", "r"); char line[8];
if (fp != NULL) {
char line[8];
if (fgets(line, sizeof(line), fp) != NULL) if (fgets(line, sizeof(line), fp) != NULL)
value = atoi(line) != 0; value = (geteuid() != 0) ?
(atoi(line) != 0) :
(atoi(line) == 2);
fclose(fp); fclose(fp);
}
} }
return value; return value;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment