mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-24 23:52:40 +00:00
tools lib traceevent: Introduce extend_token()
The __read_token() function has some duplicated code to handle internal buffer overflow. Factor them out to new extend_token(). According to the man pages of realloc/free(3), they can handle NULL pointer input so that it can be ended up to compact the code. Also handle error path correctly. Signed-off-by: Namhyung Kim <namhyung.kim@lge.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Ingo Molnar <mingo@kernel.org> Cc: Arnaldo Carvalho de Melo <acme@infradead.org> Cc: Borislav Petkov <bp@alien8.de> Cc: David Ahern <dsahern@gmail.com> Link: http://lkml.kernel.org/r/1333940074-19052-4-git-send-email-namhyung.kim@lge.com [rostedt@goodmis.org: added some extra whitespace] Signed-off-by: Steven Rostedt <rostedt@goodmis.org> Signed-off-by: Namhyung Kim <namhyung@kernel.org>
This commit is contained in:
parent
0fc45ef520
commit
deba3fb26f
1 changed files with 26 additions and 28 deletions
|
@ -781,6 +781,25 @@ int pevent_peek_char(void)
|
||||||
return __peek_char();
|
return __peek_char();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int extend_token(char **tok, char *buf, int size)
|
||||||
|
{
|
||||||
|
char *newtok = realloc(*tok, size);
|
||||||
|
|
||||||
|
if (!newtok) {
|
||||||
|
free(*tok);
|
||||||
|
*tok = NULL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!*tok)
|
||||||
|
strcpy(newtok, buf);
|
||||||
|
else
|
||||||
|
strcat(newtok, buf);
|
||||||
|
*tok = newtok;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static enum event_type force_token(const char *str, char **tok);
|
static enum event_type force_token(const char *str, char **tok);
|
||||||
|
|
||||||
static enum event_type __read_token(char **tok)
|
static enum event_type __read_token(char **tok)
|
||||||
|
@ -865,17 +884,10 @@ static enum event_type __read_token(char **tok)
|
||||||
do {
|
do {
|
||||||
if (i == (BUFSIZ - 1)) {
|
if (i == (BUFSIZ - 1)) {
|
||||||
buf[i] = 0;
|
buf[i] = 0;
|
||||||
if (*tok) {
|
|
||||||
*tok = realloc(*tok, tok_size + BUFSIZ);
|
|
||||||
if (!*tok)
|
|
||||||
return EVENT_NONE;
|
|
||||||
strcat(*tok, buf);
|
|
||||||
} else
|
|
||||||
*tok = strdup(buf);
|
|
||||||
|
|
||||||
if (!*tok)
|
|
||||||
return EVENT_NONE;
|
|
||||||
tok_size += BUFSIZ;
|
tok_size += BUFSIZ;
|
||||||
|
|
||||||
|
if (extend_token(tok, buf, tok_size) < 0)
|
||||||
|
return EVENT_NONE;
|
||||||
i = 0;
|
i = 0;
|
||||||
}
|
}
|
||||||
last_ch = ch;
|
last_ch = ch;
|
||||||
|
@ -914,17 +926,10 @@ static enum event_type __read_token(char **tok)
|
||||||
while (get_type(__peek_char()) == type) {
|
while (get_type(__peek_char()) == type) {
|
||||||
if (i == (BUFSIZ - 1)) {
|
if (i == (BUFSIZ - 1)) {
|
||||||
buf[i] = 0;
|
buf[i] = 0;
|
||||||
if (*tok) {
|
|
||||||
*tok = realloc(*tok, tok_size + BUFSIZ);
|
|
||||||
if (!*tok)
|
|
||||||
return EVENT_NONE;
|
|
||||||
strcat(*tok, buf);
|
|
||||||
} else
|
|
||||||
*tok = strdup(buf);
|
|
||||||
|
|
||||||
if (!*tok)
|
|
||||||
return EVENT_NONE;
|
|
||||||
tok_size += BUFSIZ;
|
tok_size += BUFSIZ;
|
||||||
|
|
||||||
|
if (extend_token(tok, buf, tok_size) < 0)
|
||||||
|
return EVENT_NONE;
|
||||||
i = 0;
|
i = 0;
|
||||||
}
|
}
|
||||||
ch = __read_char();
|
ch = __read_char();
|
||||||
|
@ -933,14 +938,7 @@ static enum event_type __read_token(char **tok)
|
||||||
|
|
||||||
out:
|
out:
|
||||||
buf[i] = 0;
|
buf[i] = 0;
|
||||||
if (*tok) {
|
if (extend_token(tok, buf, tok_size + i + 1) < 0)
|
||||||
*tok = realloc(*tok, tok_size + i);
|
|
||||||
if (!*tok)
|
|
||||||
return EVENT_NONE;
|
|
||||||
strcat(*tok, buf);
|
|
||||||
} else
|
|
||||||
*tok = strdup(buf);
|
|
||||||
if (!*tok)
|
|
||||||
return EVENT_NONE;
|
return EVENT_NONE;
|
||||||
|
|
||||||
if (type == EVENT_ITEM) {
|
if (type == EVENT_ITEM) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue