[PATCH] HTTP/2: fix flow control with padded DATA frames

Piotr Sikora piotrsikora at google.com
Mon Mar 27 18:21:09 UTC 2017


Hey Valentin,

>> @@ -802,33 +805,32 @@ ngx_http_v2_state_data(ngx_http_v2_conne
>>          }
>>
>>          h2c->state.padding = *pos++;
>> -        h2c->state.length--;
>> -
>> -        if (h2c->state.padding > h2c->state.length) {
>> +
>> +        if (h2c->state.padding >= size) {
>>              ngx_log_error(NGX_LOG_INFO, h2c->connection->log, 0,
>>                            "client sent padded DATA frame "
>>                            "with incorrect length: %uz, padding: %uz",
>> -                          h2c->state.length, h2c->state.padding);
>> +                          size, h2c->state.padding);
>>
>>              return ngx_http_v2_connection_error(h2c, NGX_HTTP_V2_SIZE_ERROR);
>>          }
>>
>> -        h2c->state.length -= h2c->state.padding;
>> +        h2c->state.length -= 1 + h2c->state.padding;
>>      }
>
> IMHO, the previous version of this fragment with explicit h2c->state.length
> decrement right after reading the padding size and "> h2c->state.length"
> condition is more readable.
>
> YMMV.

As was pointed out during internal code review, "h2c->state.padding >=
size" follows wording from RFC7540, i.e.

   If the length of the padding is the length of the
   frame payload or greater, the recipient MUST treat this as a
   connection error (Section 5.4.1) of type PROTOCOL_ERROR.

and matching code makes it easier to avoid off-by-one errors while
mentally translating this logic to the code.

Also, doing "h2c->state.padding > h2c->state.length" check and using
"size" value in the error log feels kind of weird.

Having said that, it's a matter of preference, so please explicitly
ask if you want me to change it back, and I'll send updated patch
shortly.

Best regards,
Piotr Sikora


More information about the nginx-devel mailing list