[apparmor] [PATCH] parser: Quiet search dir valgrind warning and remove suppression

Steve Beattie steve at nxnw.org
Wed Feb 5 20:10:04 UTC 2014


On Wed, Feb 05, 2014 at 02:51:30PM -0500, Tyler Hicks wrote:
> When passing an include directory on the command line to
> apparmor_parser, valgrind emits a warning:
> 
>  Invalid read of size 4
>     at 0x404DA6: add_search_dir(char const*) (parser_include.c:152)
>     by 0x40BB37: process_arg(int, char*) (parser_main.c:457)
>     by 0x403D43: main (parser_main.c:590)
>   Address 0x572207c is 28 bytes inside a block of size 29 alloc'd
>     at 0x4C2A420: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
>     by 0x53E31C9: strdup (strdup.c:42)
>     by 0x404D94: add_search_dir(char const*) (parser_include.c:145)
>     by 0x40BB37: process_arg(int, char*) (parser_main.c:457)
>     by 0x403D43: main (parser_main.c:590)
> 
> This patch quiets the warning by removing strlen() calls on the t char
> array. Instead, it only calls strlen() on the dir char array. t is a
> dupe of dir and strlen(dir) does not trigger the valgrind warning.
> 
> Additionally, this patch adds a bit of defensive programming to the
> while loop to ensure that index into the t array is never negative.
> 
> Finally, the valgrind suppression is removed from valgrind_simple.py.
> 
> Signed-off-by: Tyler Hicks <tyhicks at canonical.com>



> ---
>  parser/parser_include.c       | 12 +++++++++---
>  parser/tst/valgrind_simple.py |  8 --------
>  2 files changed, 9 insertions(+), 11 deletions(-)
> 
> diff --git a/parser/parser_include.c b/parser/parser_include.c
> index 0ad865d..3947f29 100644
> --- a/parser/parser_include.c
> +++ b/parser/parser_include.c
> @@ -133,13 +133,19 @@ void set_base_dir(char *dir)
>  int add_search_dir(const char *dir)
>  {
>  	char *t;
> +	size_t len;
> +
>  	if (npath >= MAX_PATH) {
>  		PERROR(_("Error: Could not add directory %s to search path.\n"),
>  		       dir);
>  		return 0;
>  	}
>  
> -	if (!dir || strlen(dir) <= 0)
> +	if (!dir)
> +		return 1;
> +
> +	len = strlen(dir);
> +	if (len == 0)
>  		return 1;
>  
>  	t = strdup(dir);
> @@ -149,8 +155,8 @@ int add_search_dir(const char *dir)
>  	}
>  
>  	/*strip trailing /'s */
> -	while (t[strlen(t) - 1] == '/')
> -		t[strlen(t) - 1] = 0;
> +	while (len > 0 && t[--len] == '/')
> +		t[len] = 0;

Can you convert the assignment from 0 to '\0'? With that change,
Acked-by: Steve Beattie <steve at nxnw.org>

Thanks!

-- 
Steve Beattie
<sbeattie at ubuntu.com>
http://NxNW.org/~steve/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <https://lists.ubuntu.com/archives/apparmor/attachments/20140205/aab41de2/attachment.pgp>


More information about the AppArmor mailing list