diff mbox

[V2] utilities: kernelscan: fix memory leaks and a segfault

Message ID 1450265256-8947-1-git-send-email-colin.king@canonical.com
State Accepted
Headers show

Commit Message

Colin Ian King Dec. 16, 2015, 11:27 a.m. UTC
From: Colin Ian King <colin.king@canonical.com>

Fix a few memory leaks found using static analysis by
clang scan-build.  Also fix a segfault caused by a
re-allocation on a token buffer that did not reset the
token pointer to a new heap buffer if a realloc() returned
an expanded buffer at a new location.

Signed-off-by: Colin Ian King <colin.king@canonical.com>
---
 src/utilities/kernelscan.c | 20 +++++++++++++++++---
 1 file changed, 17 insertions(+), 3 deletions(-)

Comments

Ivan Hu Dec. 21, 2015, 9:48 a.m. UTC | #1
On 2015年12月16日 19:27, Colin King wrote:
> From: Colin Ian King <colin.king@canonical.com>
>
> Fix a few memory leaks found using static analysis by
> clang scan-build.  Also fix a segfault caused by a
> re-allocation on a token buffer that did not reset the
> token pointer to a new heap buffer if a realloc() returned
> an expanded buffer at a new location.
>
> Signed-off-by: Colin Ian King <colin.king@canonical.com>
> ---
>   src/utilities/kernelscan.c | 20 +++++++++++++++++---
>   1 file changed, 17 insertions(+), 3 deletions(-)
>
> diff --git a/src/utilities/kernelscan.c b/src/utilities/kernelscan.c
> index 4225b88..8674e40 100644
> --- a/src/utilities/kernelscan.c
> +++ b/src/utilities/kernelscan.c
> @@ -172,6 +172,7 @@ static void token_new(token *t)
>   	t->len = 1024;
>   	t->ptr = t->token;
>   	t->type = TOKEN_UNKNOWN;
> +	*(t->ptr) = '\0';
>   }
>   
>   /*
> @@ -191,6 +192,9 @@ static void token_free(token *t)
>   {
>   	free(t->token);
>   	t->token = NULL;
> +	t->ptr = NULL;
> +	t->len = 0;
> +	t->type = TOKEN_UNKNOWN;
>   }
>   
>   /*
> @@ -207,11 +211,14 @@ static void token_append(token *t, int ch)
>   		*(t->ptr) = 0;
>   	} else {
>   		/* No more space, add 1K more space */
> +		ptrdiff_t diff = t->ptr - t->token;
> +
>   		t->len += 1024;
>   		if ((t->token = realloc(t->token, t->len)) == NULL) {
>   			fprintf(stderr, "token_append: Out of memory!\n");
>   			exit(EXIT_FAILURE);
>   		}
> +		t->ptr = t->token + diff;
>   		*(t->ptr) = ch;
>   		t->ptr++;
>   		*(t->ptr) = 0;
> @@ -797,6 +804,7 @@ static int parse_kernel_message(parser *p, token *t)
>   		int ret = get_token(p, t);
>   		if (ret == EOF) {
>   			free(line);
> +			free(str);
>   			return EOF;
>   		}
>   
> @@ -810,8 +818,9 @@ static int parse_kernel_message(parser *p, token *t)
>   				} else {
>   					printf("ADD: %s\n", line);
>   				}
> -				free(line);
>   			}
> +			free(line);
> +			free(str);
>   			return PARSER_OK;
>   		}
>   
> @@ -952,16 +961,20 @@ static int parse_cpp_includes(FILE *fp)
>   		if (t.type == TOKEN_CPP) {
>   			for (;;) {
>   				token_clear(&t);
> -				if (get_token(&p, &t) == EOF)
> +				if (get_token(&p, &t) == EOF) {
> +					token_free(&t);
>   					return EOF;
> +				}
>   				if (strcmp(t.token, "\n") == 0)
>   					break;
>   				if (t.type == TOKEN_WHITE_SPACE) {
>   					continue;
>   				}
>   				if (strcmp(t.token, "include") == 0) {
> -					if (parse_cpp_include(&p, &t) == EOF)
> +					if (parse_cpp_include(&p, &t) == EOF) {
> +						token_free(&t);
>   						return EOF;
> +					}
>   					break;
>   				}
>   				printf("#%s", t.token);
> @@ -972,6 +985,7 @@ static int parse_cpp_includes(FILE *fp)
>   		}
>   		token_clear(&t);
>   	}
> +	token_free(&t);
>   	return EOF;
>   }
>   

Acked-by: Ivan Hu <ivan.hu@canonical.com>
Alex Hung Dec. 22, 2015, 6:22 a.m. UTC | #2
On 12/21/2015 05:48 PM, ivanhu wrote:
>
>
> On 2015年12月16日 19:27, Colin King wrote:
>> From: Colin Ian King <colin.king@canonical.com>
>>
>> Fix a few memory leaks found using static analysis by
>> clang scan-build.  Also fix a segfault caused by a
>> re-allocation on a token buffer that did not reset the
>> token pointer to a new heap buffer if a realloc() returned
>> an expanded buffer at a new location.
>>
>> Signed-off-by: Colin Ian King <colin.king@canonical.com>
>> ---
>>   src/utilities/kernelscan.c | 20 +++++++++++++++++---
>>   1 file changed, 17 insertions(+), 3 deletions(-)
>>
>> diff --git a/src/utilities/kernelscan.c b/src/utilities/kernelscan.c
>> index 4225b88..8674e40 100644
>> --- a/src/utilities/kernelscan.c
>> +++ b/src/utilities/kernelscan.c
>> @@ -172,6 +172,7 @@ static void token_new(token *t)
>>       t->len = 1024;
>>       t->ptr = t->token;
>>       t->type = TOKEN_UNKNOWN;
>> +    *(t->ptr) = '\0';
>>   }
>>   /*
>> @@ -191,6 +192,9 @@ static void token_free(token *t)
>>   {
>>       free(t->token);
>>       t->token = NULL;
>> +    t->ptr = NULL;
>> +    t->len = 0;
>> +    t->type = TOKEN_UNKNOWN;
>>   }
>>   /*
>> @@ -207,11 +211,14 @@ static void token_append(token *t, int ch)
>>           *(t->ptr) = 0;
>>       } else {
>>           /* No more space, add 1K more space */
>> +        ptrdiff_t diff = t->ptr - t->token;
>> +
>>           t->len += 1024;
>>           if ((t->token = realloc(t->token, t->len)) == NULL) {
>>               fprintf(stderr, "token_append: Out of memory!\n");
>>               exit(EXIT_FAILURE);
>>           }
>> +        t->ptr = t->token + diff;
>>           *(t->ptr) = ch;
>>           t->ptr++;
>>           *(t->ptr) = 0;
>> @@ -797,6 +804,7 @@ static int parse_kernel_message(parser *p, token *t)
>>           int ret = get_token(p, t);
>>           if (ret == EOF) {
>>               free(line);
>> +            free(str);
>>               return EOF;
>>           }
>> @@ -810,8 +818,9 @@ static int parse_kernel_message(parser *p, token *t)
>>                   } else {
>>                       printf("ADD: %s\n", line);
>>                   }
>> -                free(line);
>>               }
>> +            free(line);
>> +            free(str);
>>               return PARSER_OK;
>>           }
>> @@ -952,16 +961,20 @@ static int parse_cpp_includes(FILE *fp)
>>           if (t.type == TOKEN_CPP) {
>>               for (;;) {
>>                   token_clear(&t);
>> -                if (get_token(&p, &t) == EOF)
>> +                if (get_token(&p, &t) == EOF) {
>> +                    token_free(&t);
>>                       return EOF;
>> +                }
>>                   if (strcmp(t.token, "\n") == 0)
>>                       break;
>>                   if (t.type == TOKEN_WHITE_SPACE) {
>>                       continue;
>>                   }
>>                   if (strcmp(t.token, "include") == 0) {
>> -                    if (parse_cpp_include(&p, &t) == EOF)
>> +                    if (parse_cpp_include(&p, &t) == EOF) {
>> +                        token_free(&t);
>>                           return EOF;
>> +                    }
>>                       break;
>>                   }
>>                   printf("#%s", t.token);
>> @@ -972,6 +985,7 @@ static int parse_cpp_includes(FILE *fp)
>>           }
>>           token_clear(&t);
>>       }
>> +    token_free(&t);
>>       return EOF;
>>   }
>
> Acked-by: Ivan Hu <ivan.hu@canonical.com>
>


Acked-by: Alex Hung <alex.hung@canonical.com>
diff mbox

Patch

diff --git a/src/utilities/kernelscan.c b/src/utilities/kernelscan.c
index 4225b88..8674e40 100644
--- a/src/utilities/kernelscan.c
+++ b/src/utilities/kernelscan.c
@@ -172,6 +172,7 @@  static void token_new(token *t)
 	t->len = 1024;
 	t->ptr = t->token;
 	t->type = TOKEN_UNKNOWN;
+	*(t->ptr) = '\0';
 }
 
 /*
@@ -191,6 +192,9 @@  static void token_free(token *t)
 {
 	free(t->token);
 	t->token = NULL;
+	t->ptr = NULL;
+	t->len = 0;
+	t->type = TOKEN_UNKNOWN;
 }
 
 /*
@@ -207,11 +211,14 @@  static void token_append(token *t, int ch)
 		*(t->ptr) = 0;
 	} else {
 		/* No more space, add 1K more space */
+		ptrdiff_t diff = t->ptr - t->token;
+
 		t->len += 1024;
 		if ((t->token = realloc(t->token, t->len)) == NULL) {
 			fprintf(stderr, "token_append: Out of memory!\n");
 			exit(EXIT_FAILURE);
 		}
+		t->ptr = t->token + diff;
 		*(t->ptr) = ch;
 		t->ptr++;
 		*(t->ptr) = 0;
@@ -797,6 +804,7 @@  static int parse_kernel_message(parser *p, token *t)
 		int ret = get_token(p, t);
 		if (ret == EOF) {
 			free(line);
+			free(str);
 			return EOF;
 		}
 
@@ -810,8 +818,9 @@  static int parse_kernel_message(parser *p, token *t)
 				} else {
 					printf("ADD: %s\n", line);
 				}
-				free(line);
 			}
+			free(line);
+			free(str);
 			return PARSER_OK;
 		}
 
@@ -952,16 +961,20 @@  static int parse_cpp_includes(FILE *fp)
 		if (t.type == TOKEN_CPP) {
 			for (;;) {
 				token_clear(&t);
-				if (get_token(&p, &t) == EOF)
+				if (get_token(&p, &t) == EOF) {
+					token_free(&t);
 					return EOF;
+				}
 				if (strcmp(t.token, "\n") == 0)
 					break;
 				if (t.type == TOKEN_WHITE_SPACE) {
 					continue;
 				}
 				if (strcmp(t.token, "include") == 0) {
-					if (parse_cpp_include(&p, &t) == EOF)
+					if (parse_cpp_include(&p, &t) == EOF) {
+						token_free(&t);
 						return EOF;
+					}
 					break;
 				}
 				printf("#%s", t.token);
@@ -972,6 +985,7 @@  static int parse_cpp_includes(FILE *fp)
 		}
 		token_clear(&t);
 	}
+	token_free(&t);
 	return EOF;
 }