| 382 | } |
| 383 | |
| 384 | static void inflate_request(const char *prog_name, int out, int buffer_input, ssize_t req_len) |
| 385 | { |
| 386 | git_zstream stream; |
| 387 | unsigned char *full_request = NULL; |
| 388 | unsigned char in_buf[8192]; |
| 389 | unsigned char out_buf[8192]; |
| 390 | unsigned long cnt = 0; |
| 391 | int req_len_defined = req_len >= 0; |
| 392 | size_t req_remaining_len = req_len; |
| 393 | |
| 394 | memset(&stream, 0, sizeof(stream)); |
| 395 | git_inflate_init_gzip_only(&stream); |
| 396 | |
| 397 | while (1) { |
| 398 | ssize_t n; |
| 399 | |
| 400 | if (buffer_input) { |
| 401 | if (full_request) |
| 402 | n = 0; /* nothing left to read */ |
| 403 | else |
| 404 | n = read_request(0, &full_request, req_len); |
| 405 | stream.next_in = full_request; |
| 406 | } else { |
| 407 | ssize_t buffer_len; |
| 408 | if (req_len_defined && req_remaining_len <= sizeof(in_buf)) |
| 409 | buffer_len = req_remaining_len; |
| 410 | else |
| 411 | buffer_len = sizeof(in_buf); |
| 412 | n = xread(0, in_buf, buffer_len); |
| 413 | stream.next_in = in_buf; |
| 414 | if (req_len_defined && n > 0) |
| 415 | req_remaining_len -= n; |
| 416 | } |
| 417 | |
| 418 | if (n <= 0) |
| 419 | die("request ended in the middle of the gzip stream"); |
| 420 | stream.avail_in = n; |
| 421 | |
| 422 | while (0 < stream.avail_in) { |
| 423 | int ret; |
| 424 | |
| 425 | stream.next_out = out_buf; |
| 426 | stream.avail_out = sizeof(out_buf); |
| 427 | |
| 428 | ret = git_inflate(&stream, Z_NO_FLUSH); |
| 429 | if (ret != Z_OK && ret != Z_STREAM_END) |
| 430 | die("zlib error inflating request, result %d", ret); |
| 431 | |
| 432 | n = stream.total_out - cnt; |
| 433 | write_to_child(out, out_buf, stream.total_out - cnt, prog_name); |
| 434 | cnt = stream.total_out; |
| 435 | |
| 436 | if (ret == Z_STREAM_END) |
| 437 | goto done; |
| 438 | } |
| 439 | } |
| 440 | |
| 441 | done: |
no test coverage detected