Skip to content

Commit 7114605

Browse files
author
Ingo Molnar
committed
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: Arnaldo Carvalho de Melo <[email protected]> Signed-off-by: Ingo Molnar <[email protected]>
2 parents 275ae41 + 5ea5888 commit 7114605

File tree

3 files changed

+49
-10
lines changed

3 files changed

+49
-10
lines changed

tools/perf/util/data-convert-bt.c

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,44 @@ static unsigned long long adjust_signedness(unsigned long long value_int, int si
204204
return (value_int & value_mask) | ~value_mask;
205205
}
206206

207+
static int string_set_value(struct bt_ctf_field *field, const char *string)
208+
{
209+
char *buffer = NULL;
210+
size_t len = strlen(string), i, p;
211+
int err;
212+
213+
for (i = p = 0; i < len; i++, p++) {
214+
if (isprint(string[i])) {
215+
if (!buffer)
216+
continue;
217+
buffer[p] = string[i];
218+
} else {
219+
char numstr[5];
220+
221+
snprintf(numstr, sizeof(numstr), "\\x%02x",
222+
(unsigned int)(string[i]) & 0xff);
223+
224+
if (!buffer) {
225+
buffer = zalloc(i + (len - i) * 4 + 2);
226+
if (!buffer) {
227+
pr_err("failed to set unprintable string '%s'\n", string);
228+
return bt_ctf_field_string_set_value(field, "UNPRINTABLE-STRING");
229+
}
230+
if (i > 0)
231+
strncpy(buffer, string, i);
232+
}
233+
strncat(buffer + p, numstr, 4);
234+
p += 3;
235+
}
236+
}
237+
238+
if (!buffer)
239+
return bt_ctf_field_string_set_value(field, string);
240+
err = bt_ctf_field_string_set_value(field, buffer);
241+
free(buffer);
242+
return err;
243+
}
244+
207245
static int add_tracepoint_field_value(struct ctf_writer *cw,
208246
struct bt_ctf_event_class *event_class,
209247
struct bt_ctf_event *event,
@@ -270,8 +308,7 @@ static int add_tracepoint_field_value(struct ctf_writer *cw,
270308
}
271309

272310
if (flags & FIELD_IS_STRING)
273-
ret = bt_ctf_field_string_set_value(field,
274-
data + offset + i * len);
311+
ret = string_set_value(field, data + offset + i * len);
275312
else {
276313
unsigned long long value_int;
277314

tools/perf/util/event.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -673,6 +673,8 @@ int perf_event__synthesize_kernel_mmap(struct perf_tool *tool,
673673
int err;
674674
union perf_event *event;
675675

676+
if (symbol_conf.kptr_restrict)
677+
return -1;
676678
if (map == NULL)
677679
return -1;
678680

tools/perf/util/symbol.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1933,17 +1933,17 @@ int setup_intlist(struct intlist **list, const char *list_str,
19331933
static bool symbol__read_kptr_restrict(void)
19341934
{
19351935
bool value = false;
1936+
FILE *fp = fopen("/proc/sys/kernel/kptr_restrict", "r");
19361937

1937-
if (geteuid() != 0) {
1938-
FILE *fp = fopen("/proc/sys/kernel/kptr_restrict", "r");
1939-
if (fp != NULL) {
1940-
char line[8];
1938+
if (fp != NULL) {
1939+
char line[8];
19411940

1942-
if (fgets(line, sizeof(line), fp) != NULL)
1943-
value = atoi(line) != 0;
1941+
if (fgets(line, sizeof(line), fp) != NULL)
1942+
value = (geteuid() != 0) ?
1943+
(atoi(line) != 0) :
1944+
(atoi(line) == 2);
19441945

1945-
fclose(fp);
1946-
}
1946+
fclose(fp);
19471947
}
19481948

19491949
return value;

0 commit comments

Comments
 (0)