Ricardo,

Am 06.02.19 um 17:28 schrieb Ricardo Nabinger Sanchez:
> Hello,
> 
> scan-build found a 28-step path where an unitialized value could be used in
> h2s_htx_bck_make_req_headers().
> 
> Here is a shortened version:
> 
> 4378         idx = htx_get_head(htx); // returns the SL that we skip
> 4379         while ((idx = htx_get_next(htx, idx)) != -1) {
> 4380                 blk = htx_get_blk(htx, idx);
> 4381                 type = htx_get_blk_type(blk);
> 4382 
> 4383                 if (type == HTX_BLK_UNUSED)
> 4384                         continue;
> 4385 
> 4386                 if (type != HTX_BLK_HDR)
> // (here, assume condition is true, so control leaves the loop...)
> 4387                         break;
> 4388 
> 4389                 if (unlikely(hdr >= sizeof(list)/sizeof(list[0]) - 1))
> 4390                         goto fail;
> 4391 
> // (... and list will not be initialized.)

Yes, but hdr will not be incremented either. Thus `list` is an array
without holes.

> 4392                 list[hdr].n = htx_get_blk_name(htx, blk);
> 4393                 list[hdr].v = htx_get_blk_value(htx, blk);
> 4394                 hdr++;
> 4395         }

Line 4398 is missing here, it appends a marker (empty string) to mark
the end of the array.

> ...
> 
> 4450                 /* look for the Host header and place it in :authority */
> 4451                 auth = ist2(NULL, 0);
> 4452                 for (hdr = 0; hdr < sizeof(list)/sizeof(list[0]); hdr++) 
> {
> 4453                         if (isteq(list[hdr].n, ist("")))
> // (here, assume the condition is false, so control keeps in this block...)

We established that `list` is an array without holes terminated by an
empty string.

Thus either:
1. The Condition is false, then the value must be initialized
or
2. The Condition is true, then the loop is exited.

Thus I believe this is a false-positive.

Best regards
Tim Düsterhus

Reply via email to