On 12/05/2014 04:22 PM, Tyler Hicks wrote:
> snprintf_buffer() needed to be modified in order to properly return error
> conditions up the stack, instead of exiting, but it's added complexity
> didn't seem worth keeping it around.
> 
> This patch gets rid of that helper function and adds proper error
> handling around the new calls to snprintf().
> 
> Signed-off-by: Tyler Hicks <[email protected]>

meh, I actually like removing the duplicate code, but can see the argument
against varargs ... so I suppose I am not opposed

Acked-by: John Johansen <[email protected]>

> ---
>  parser/features.c | 45 +++++++++++++++++++++++----------------------
>  1 file changed, 23 insertions(+), 22 deletions(-)
> 
> diff --git a/parser/features.c b/parser/features.c
> index 1464ac5..5f43c44 100644
> --- a/parser/features.c
> +++ b/parser/features.c
> @@ -42,24 +42,6 @@ struct aa_features {
>       char string[STRING_SIZE];
>  };
>  
> -static char *snprintf_buffer(char *buf, char *pos, ssize_t size,
> -                          const char *fmt, ...)
> -{
> -     va_list args;
> -     int i, remaining = size - (pos - buf);
> -
> -     va_start(args, fmt);
> -     i = vsnprintf(pos, remaining, fmt, args);
> -     va_end(args);
> -
> -     if (i >= size) {
> -             PERROR(_("Feature buffer full."));
> -             exit(1);
> -     }
> -
> -     return pos + i;
> -}
> -
>  struct features_struct {
>       char *buffer;
>       int size;
> @@ -70,22 +52,32 @@ static int features_dir_cb(DIR *dir, const char *name, 
> struct stat *st,
>                          void *data)
>  {
>       struct features_struct *fst = (struct features_struct *) data;
> +     int remaining, len;
>  
>       /* skip dot files and files with no name */
>       if (*name == '.' || !strlen(name))
>               return 0;
>  
> -     fst->pos = snprintf_buffer(fst->buffer, fst->pos, fst->size, "%s {", 
> name);
> +     remaining = fst->size - (fst->pos - fst->buffer);
> +     len = snprintf(fst->pos, remaining, "%s {", name);
> +     if (len == -1) {
> +             errno = EIO;
> +             return -1;
> +     } else if (len >= remaining) {
> +             errno = ENOBUFS;
> +             return -1;
> +     } else
> +             fst->pos += len;
>  
>       if (S_ISREG(st->st_mode)) {
>               autoclose int file = -1;
> -             int len;
> -             int remaining = fst->size - (fst->pos - fst->buffer);
> +
>               if (!(file = openat(dirfd(dir), name, O_RDONLY))) {
>                       PDEBUG("Could not open '%s'", name);
>                       return -1;
>               }
>               PDEBUG("Opened features \"%s\"\n", name);
> +             remaining = fst->size - (fst->pos - fst->buffer);
>               if (st->st_size > remaining) {
>                       PDEBUG("Feature buffer full.");
>                       return -1;
> @@ -108,7 +100,16 @@ static int features_dir_cb(DIR *dir, const char *name, 
> struct stat *st,
>                       return -1;
>       }
>  
> -     fst->pos = snprintf_buffer(fst->buffer, fst->pos, fst->size, "}\n");
> +     remaining = fst->size - (fst->pos - fst->buffer);
> +     len = snprintf(fst->pos, remaining, "}\n");
> +     if (len == -1) {
> +             errno = EIO;
> +             return -1;
> +     } else if (len >= remaining) {
> +             errno = ENOBUFS;
> +             return -1;
> +     } else
> +             fst->pos += len;
>  
>       return 0;
>  }
> 



-- 
AppArmor mailing list
[email protected]
Modify settings or unsubscribe at: 
https://lists.ubuntu.com/mailman/listinfo/apparmor

Reply via email to