|  | @@ -375,22 +375,26 @@ static grpc_error *update_incoming_window(grpc_exec_ctx *exec_ctx,
 | 
	
		
			
				|  |  |      return err;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  if (incoming_frame_size > s->incoming_window) {
 | 
	
		
			
				|  |  | -    char *msg;
 | 
	
		
			
				|  |  | -    gpr_asprintf(&msg, "frame of size %d overflows incoming window of %" PRId64,
 | 
	
		
			
				|  |  | -                 t->incoming_frame_size, s->incoming_window);
 | 
	
		
			
				|  |  | -    grpc_error *err = GRPC_ERROR_CREATE(msg);
 | 
	
		
			
				|  |  | -    gpr_free(msg);
 | 
	
		
			
				|  |  | -    return err;
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |    GRPC_CHTTP2_FLOW_DEBIT_TRANSPORT("parse", t, incoming_window,
 | 
	
		
			
				|  |  |                                     incoming_frame_size);
 | 
	
		
			
				|  |  | -  GRPC_CHTTP2_FLOW_DEBIT_STREAM("parse", t, s, incoming_window,
 | 
	
		
			
				|  |  | -                                incoming_frame_size);
 | 
	
		
			
				|  |  | -  s->received_bytes += incoming_frame_size;
 | 
	
		
			
				|  |  | -  s->max_recv_bytes -=
 | 
	
		
			
				|  |  | -      (uint32_t)GPR_MIN(s->max_recv_bytes, incoming_frame_size);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  if (s != NULL) {
 | 
	
		
			
				|  |  | +    if (incoming_frame_size > s->incoming_window) {
 | 
	
		
			
				|  |  | +      char *msg;
 | 
	
		
			
				|  |  | +      gpr_asprintf(&msg,
 | 
	
		
			
				|  |  | +                   "frame of size %d overflows incoming window of %" PRId64,
 | 
	
		
			
				|  |  | +                   t->incoming_frame_size, s->incoming_window);
 | 
	
		
			
				|  |  | +      grpc_error *err = GRPC_ERROR_CREATE(msg);
 | 
	
		
			
				|  |  | +      gpr_free(msg);
 | 
	
		
			
				|  |  | +      return err;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    GRPC_CHTTP2_FLOW_DEBIT_STREAM("parse", t, s, incoming_window,
 | 
	
		
			
				|  |  | +                                  incoming_frame_size);
 | 
	
		
			
				|  |  | +    s->received_bytes += incoming_frame_size;
 | 
	
		
			
				|  |  | +    s->max_recv_bytes -=
 | 
	
		
			
				|  |  | +        (uint32_t)GPR_MIN(s->max_recv_bytes, incoming_frame_size);
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    return GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |  }
 | 
	
	
		
			
				|  | @@ -400,20 +404,22 @@ static grpc_error *init_data_frame_parser(grpc_exec_ctx *exec_ctx,
 | 
	
		
			
				|  |  |    grpc_chttp2_stream *s =
 | 
	
		
			
				|  |  |        grpc_chttp2_parsing_lookup_stream(t, t->incoming_stream_id);
 | 
	
		
			
				|  |  |    grpc_error *err = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  | +  err = update_incoming_window(exec_ctx, t, s);
 | 
	
		
			
				|  |  | +  if (err != GRPC_ERROR_NONE) {
 | 
	
		
			
				|  |  | +    goto error_handler;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  |    if (s == NULL) {
 | 
	
		
			
				|  |  |      return init_skip_frame_parser(exec_ctx, t, 0);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    s->stats.incoming.framing_bytes += 9;
 | 
	
		
			
				|  |  | -  if (s->read_closed) {
 | 
	
		
			
				|  |  | +  if (err == GRPC_ERROR_NONE && s->read_closed) {
 | 
	
		
			
				|  |  |      return init_skip_frame_parser(exec_ctx, t, 0);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -  if (err == GRPC_ERROR_NONE) {
 | 
	
		
			
				|  |  | -    err = update_incoming_window(exec_ctx, t, s);
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  |    if (err == GRPC_ERROR_NONE) {
 | 
	
		
			
				|  |  |      err = grpc_chttp2_data_parser_begin_frame(&s->data_parser,
 | 
	
		
			
				|  |  |                                                t->incoming_frame_flags, s->id);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | +error_handler:
 | 
	
		
			
				|  |  |    if (err == GRPC_ERROR_NONE) {
 | 
	
		
			
				|  |  |      t->incoming_stream = s;
 | 
	
		
			
				|  |  |      t->parser = grpc_chttp2_data_parser_parse;
 | 
	
	
		
			
				|  | @@ -421,7 +427,9 @@ static grpc_error *init_data_frame_parser(grpc_exec_ctx *exec_ctx,
 | 
	
		
			
				|  |  |      return GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  |    } else if (grpc_error_get_int(err, GRPC_ERROR_INT_STREAM_ID, NULL)) {
 | 
	
		
			
				|  |  |      /* handle stream errors by closing the stream */
 | 
	
		
			
				|  |  | -    grpc_chttp2_mark_stream_closed(exec_ctx, t, s, true, false, err);
 | 
	
		
			
				|  |  | +    if (s != NULL) {
 | 
	
		
			
				|  |  | +      grpc_chttp2_mark_stream_closed(exec_ctx, t, s, true, false, err);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |      gpr_slice_buffer_add(
 | 
	
		
			
				|  |  |          &t->qbuf, grpc_chttp2_rst_stream_create(t->incoming_stream_id,
 | 
	
		
			
				|  |  |                                                  GRPC_CHTTP2_PROTOCOL_ERROR,
 |