Coverage Report

Created: 2026-06-09 06:49

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/dovecot/src/lib/buffer-istream.c
Line
Count
Source
1
/* Copyright (c) 2020 Dovecot authors, see the included COPYING file */
2
3
#include "lib.h"
4
#include "buffer.h"
5
#include "eacces-error.h"
6
#include "istream.h"
7
8
enum buffer_append_result
9
buffer_append_full_istream(buffer_t *buf, struct istream *is, size_t max_read_size,
10
         const char **error_r)
11
0
{
12
0
  const unsigned char *data;
13
0
  size_t size;
14
0
  ssize_t ret;
15
16
0
  while ((ret = i_stream_read_more(is, &data, &size)) > 0) {
17
0
    if (max_read_size == 0)
18
0
      return BUFFER_APPEND_READ_MAX_SIZE;
19
0
    size = I_MIN(max_read_size, size);
20
0
    buffer_append(buf, data, size);
21
0
    i_stream_skip(is, size);
22
0
    max_read_size -= size;
23
0
  }
24
25
0
  if (ret == 0)
26
0
    return BUFFER_APPEND_READ_MORE;
27
28
0
  i_assert(is->eof);
29
30
0
  if (is->stream_errno != 0) {
31
0
    *error_r = t_strdup(i_stream_get_error(is));
32
0
    return BUFFER_APPEND_READ_ERROR;
33
0
  }
34
0
  return BUFFER_APPEND_OK;
35
0
}
36
37
enum buffer_append_result
38
buffer_append_full_file(buffer_t *buf, const char *file, size_t max_read_size,
39
      const char **error_r)
40
0
{
41
0
  struct istream *is = i_stream_create_file(file, IO_BLOCK_SIZE);
42
0
  enum buffer_append_result res =
43
0
    buffer_append_full_istream(buf, is, max_read_size, error_r);
44
0
  if (is->stream_errno == EACCES)
45
0
    *error_r = eacces_error_get("open", file);
46
0
  i_stream_unref(&is);
47
0
  i_assert(res != BUFFER_APPEND_READ_MORE);
48
0
  return res;
49
0
}