Viktor Dukhovni:
> On Fri, Mar 19, 2021 at 11:18:27AM -0400, Jaroslav Skarvada wrote:
> 
> > 14. postfix-3.5.8/src/util/dict_inline.c:124: uninit_use_in_call: Using 
> > uninitialized value "value" when calling "dict_file_to_b64".
> > 17. postfix-3.5.8/src/util/dict_inline.c:125: overwrite_var: Overwriting 
> > "err" in "err = free_me = dict_file_get_error(dict)" leaks the storage that 
> > "err" points to.
> > #   123|   
> > #   124|->      if ((base64_buf = dict_file_to_b64(dict, value)) == 0) {
> > #   125|->          err = free_me = dict_file_get_error(dict);
> > #   126|            break;
> > #   127|        }
> > 
> > I think it could call dict_file_to_b64 with uninitialized value.
> 
> Yes, when inline tables in the main.cf file are malformed in a
> particular way, this may not be handled correctly.  Patch below.

Can someone provide an input that demonstrates there is a problem?

The 'value' variable is initialized only when 'err' is zero. Otherwise,
the loop will be exited before the 'value' variable would be used.

Also, the claim that 'err' loses a reference to allocated memory is
irrelevant, because such memory is tracked with the 'free_me' variable,
and once it is set, 'free_me' is not overwritten.

I'll simplify the code a bit to make it easier to analyze.

> --- a/src/util/dict_inline.c
> +++ b/src/util/dict_inline.c
> @@ -113,9 +113,11 @@ DICT   *dict_inline_open(const char *name, int 
> open_flags, int dict_flags)
>      dict = dict_open3(DICT_TYPE_HT, name, open_flags, dict_flags);
>      dict_type_override(dict, DICT_TYPE_INLINE);
>      while ((nameval = mystrtokq(&cp, CHARS_COMMA_SP, CHARS_BRACE)) != 0) {
> -     if ((nameval[0] != CHARS_BRACE[0]
> -          || (err = free_me = extpar(&nameval, CHARS_BRACE, 
> EXTPAR_FLAG_STRIP)) == 0)
> -         && (err = split_qnameval(nameval, &vname, &value)) != 0)
> +     if (nameval[0] != CHARS_BRACE[0])
> +         err = free_me = extpar(&nameval, CHARS_BRACE, EXTPAR_FLAG_STRIP);
> +     if (!err)
> +         err = split_qnameval(nameval, &vname, &value);
> +     if (err)
>           break;
>  
>       if ((dict->flags & DICT_FLAG_SRC_RHS_IS_FILE) != 0) {

I think that the patch should use 'nameval[0]  == CHARS_BRACE[0]'

        Wietse

Reply via email to