mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-19 18:24:14 +08:00
c53b4bb02b
Adding check on failed attempt to parse the address and skip the line parsing early in that case. The address can be replaced with '(null)' string in case user don't have enough permissions, like: $ cat /proc/kallsyms (null) A irq_stack_union (null) A __per_cpu_start ... Signed-off-by: Jiri Olsa <jolsa@kernel.org> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: David Ahern <dsahern@gmail.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Link: http://lkml.kernel.org/r/20180215122635.24029-2-jolsa@kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
71 lines
1.2 KiB
C
71 lines
1.2 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
#include <ctype.h>
|
|
#include "symbol/kallsyms.h"
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
u8 kallsyms2elf_type(char type)
|
|
{
|
|
type = tolower(type);
|
|
return (type == 't' || type == 'w') ? STT_FUNC : STT_OBJECT;
|
|
}
|
|
|
|
int kallsyms__parse(const char *filename, void *arg,
|
|
int (*process_symbol)(void *arg, const char *name,
|
|
char type, u64 start))
|
|
{
|
|
char *line = NULL;
|
|
size_t n;
|
|
int err = -1;
|
|
FILE *file = fopen(filename, "r");
|
|
|
|
if (file == NULL)
|
|
goto out_failure;
|
|
|
|
err = 0;
|
|
|
|
while (!feof(file)) {
|
|
u64 start;
|
|
int line_len, len;
|
|
char symbol_type;
|
|
char *symbol_name;
|
|
|
|
line_len = getline(&line, &n, file);
|
|
if (line_len < 0 || !line)
|
|
break;
|
|
|
|
line[--line_len] = '\0'; /* \n */
|
|
|
|
len = hex2u64(line, &start);
|
|
|
|
/* Skip the line if we failed to parse the address. */
|
|
if (!len)
|
|
continue;
|
|
|
|
len++;
|
|
if (len + 2 >= line_len)
|
|
continue;
|
|
|
|
symbol_type = line[len];
|
|
len += 2;
|
|
symbol_name = line + len;
|
|
len = line_len - len;
|
|
|
|
if (len >= KSYM_NAME_LEN) {
|
|
err = -1;
|
|
break;
|
|
}
|
|
|
|
err = process_symbol(arg, symbol_name, symbol_type, start);
|
|
if (err)
|
|
break;
|
|
}
|
|
|
|
free(line);
|
|
fclose(file);
|
|
return err;
|
|
|
|
out_failure:
|
|
return -1;
|
|
}
|