Skip to content

Commit

Permalink
Merge tag 'perf-urgent-for-mingo-20160527' of git://git.kernel.org/pu…
Browse files Browse the repository at this point in the history
…b/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: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
  • Loading branch information
Ingo Molnar committed May 29, 2016
2 parents 275ae41 + 5ea5888 commit 7114605
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 10 deletions.
41 changes: 39 additions & 2 deletions tools/perf/util/data-convert-bt.c
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,44 @@ static unsigned long long adjust_signedness(unsigned long long value_int, int si
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,
struct bt_ctf_event_class *event_class,
struct bt_ctf_event *event,
Expand Down Expand Up @@ -270,8 +308,7 @@ static int add_tracepoint_field_value(struct ctf_writer *cw,
}

if (flags & FIELD_IS_STRING)
ret = bt_ctf_field_string_set_value(field,
data + offset + i * len);
ret = string_set_value(field, data + offset + i * len);
else {
unsigned long long value_int;

Expand Down
2 changes: 2 additions & 0 deletions tools/perf/util/event.c
Original file line number Diff line number Diff line change
Expand Up @@ -673,6 +673,8 @@ int perf_event__synthesize_kernel_mmap(struct perf_tool *tool,
int err;
union perf_event *event;

if (symbol_conf.kptr_restrict)
return -1;
if (map == NULL)
return -1;

Expand Down
16 changes: 8 additions & 8 deletions tools/perf/util/symbol.c
Original file line number Diff line number Diff line change
Expand Up @@ -1933,17 +1933,17 @@ int setup_intlist(struct intlist **list, const char *list_str,
static bool symbol__read_kptr_restrict(void)
{
bool value = false;
FILE *fp = fopen("/proc/sys/kernel/kptr_restrict", "r");

if (geteuid() != 0) {
FILE *fp = fopen("/proc/sys/kernel/kptr_restrict", "r");
if (fp != NULL) {
char line[8];
if (fp != NULL) {
char line[8];

if (fgets(line, sizeof(line), fp) != NULL)
value = atoi(line) != 0;
if (fgets(line, sizeof(line), fp) != NULL)
value = (geteuid() != 0) ?
(atoi(line) != 0) :
(atoi(line) == 2);

fclose(fp);
}
fclose(fp);
}

return value;
Expand Down

0 comments on commit 7114605

Please sign in to comment.