[apparmor] [PATCH v2 43/42] libapparmor: Protect _aa_autofree users from freeing bad pointers

John Johansen john.johansen at canonical.com
Tue Mar 24 21:27:05 UTC 2015


On 03/24/2015 11:05 AM, Tyler Hicks wrote:
> Creates a libapparmor function, _aa_asprintf(), which sets the *strp to
> NULL on error. This is needed for all of the users of the _aa_autofree
> cleanup attribute because the value of *strp is undefined when
> asprintf() fails and that could result in _aa_autofree() being passed a
> pointer value that it should not free.
> 
> Signed-off-by: Tyler Hicks <tyhicks at canonical.com>

Acked-by: John Johansen <john.johansen at canonical.com>

> ---
>  libraries/libapparmor/include/sys/apparmor_private.h |  2 ++
>  libraries/libapparmor/src/private.c                  | 15 +++++++++++++++
>  libraries/libapparmor/src/private.h                  |  2 ++
>  parser/lib.h                                         |  2 ++
>  4 files changed, 21 insertions(+)
> 
> diff --git a/libraries/libapparmor/include/sys/apparmor_private.h b/libraries/libapparmor/include/sys/apparmor_private.h
> index 5cf4c25..14055df 100644
> --- a/libraries/libapparmor/include/sys/apparmor_private.h
> +++ b/libraries/libapparmor/include/sys/apparmor_private.h
> @@ -29,6 +29,8 @@ void _aa_autofree(void *p);
>  void _aa_autoclose(int *fd);
>  void _aa_autofclose(FILE **f);
>  
> +int _aa_asprintf(char **strp, const char *fmt, ...);
> +
>  int _aa_dirat_for_each(DIR *dir, const char *name, void *data,
>  		       int (* cb)(DIR *, const char *, struct stat *, void *));
>  
> diff --git a/libraries/libapparmor/src/private.c b/libraries/libapparmor/src/private.c
> index f0ff941..c99a57d 100644
> --- a/libraries/libapparmor/src/private.c
> +++ b/libraries/libapparmor/src/private.c
> @@ -142,6 +142,21 @@ void _aa_autofclose(FILE **f)
>  	}
>  }
>  
> +int _aa_asprintf(char **strp, const char *fmt, ...)
> +{
> +	va_list args;
> +	int rc;
> +
> +	va_start(args, fmt);
> +	rc = vasprintf(strp, fmt, args);
> +	va_end(args);
> +
> +	if (rc == -1)
> +		*strp = NULL;
> +
> +	return rc;
> +}
> +
>  /**
>   * _aa_dirat_for_each: iterate over a directory calling cb for each entry
>   * @dir: already opened directory (MAY BE NULL)
> diff --git a/libraries/libapparmor/src/private.h b/libraries/libapparmor/src/private.h
> index 7921e2b..09a5620 100644
> --- a/libraries/libapparmor/src/private.h
> +++ b/libraries/libapparmor/src/private.h
> @@ -25,6 +25,8 @@
>  #define autofclose __attribute((cleanup(_aa_autofclose)))
>  #define unused __attribute__ ((unused))
>  
> +#define asprintf _aa_asprintf
> +
>  #if ENABLE_DEBUG_OUTPUT
>  
>  #define PERROR(fmt, args...)	print_error(true, "libapparmor", fmt, ## args)
> diff --git a/parser/lib.h b/parser/lib.h
> index a182439..a980a5a 100644
> --- a/parser/lib.h
> +++ b/parser/lib.h
> @@ -7,6 +7,8 @@
>  #define autoclose __attribute((cleanup(_aa_autoclose)))
>  #define autofclose __attribute((cleanup(_aa_autofclose)))
>  
> +#define asprintf _aa_asprintf
> +
>  int dirat_for_each(DIR *dir, const char *name, void *data,
>  		   int (* cb)(DIR *, const char *, struct stat *, void *));
>  
> 




More information about the AppArmor mailing list