Coverage Report

Created: 2026-10-28 07:22

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/dovecot/src/lib-sasl/sasl-server.c
Line
Count
Source
1
/* Copyright (c) Dovecot authors, see top-level COPYING file */
2
3
#include "lib.h"
4
#include "llist.h"
5
6
#include "sasl-server-private.h"
7
8
struct event_category event_category_sasl_server = {
9
  .name = "sasl-server"
10
};
11
12
/*
13
 * Instance
14
 */
15
16
struct sasl_server_instance *
17
sasl_server_instance_create(struct sasl_server *server,
18
          const struct sasl_server_settings *set)
19
7.09k
{
20
7.09k
  struct sasl_server_instance *sinst;
21
7.09k
  pool_t pool;
22
23
7.09k
  pool = pool_alloconly_create(
24
7.09k
    MEMPOOL_GROWING"sasl_server_instance", 2048);
25
7.09k
  sinst = p_new(pool, struct sasl_server_instance, 1);
26
7.09k
  sinst->pool = pool;
27
7.09k
  sinst->refcount = 1;
28
7.09k
  sinst->server = server;
29
30
7.09k
  sinst->set = *set;
31
7.09k
  if (set->realms != NULL)
32
0
    sinst->set.realms = p_strarray_dup(pool, set->realms);
33
34
7.09k
  if (set->event_parent == NULL)
35
7.09k
    sinst->event = event_create(server->event);
36
0
  else {
37
0
    sinst->event = event_create(set->event_parent);
38
0
    event_add_category(sinst->event, &event_category_sasl_server);
39
0
    event_set_append_log_prefix(sinst->event, "sasl: ");
40
0
  }
41
42
7.09k
  DLLIST_PREPEND(&server->instances, sinst);
43
44
7.09k
  return sinst;
45
7.09k
}
46
47
void sasl_server_instance_ref(struct sasl_server_instance *sinst)
48
0
{
49
0
  i_assert(sinst->refcount > 0);
50
0
  sinst->refcount++;
51
0
}
52
53
void sasl_server_instance_unref(struct sasl_server_instance **_sinst)
54
7.09k
{
55
7.09k
  struct sasl_server_instance *sinst = *_sinst;
56
57
7.09k
  if (sinst == NULL)
58
0
    return;
59
7.09k
  *_sinst = NULL;
60
61
7.09k
  i_assert(sinst->refcount > 0);
62
7.09k
  if (--sinst->refcount > 0)
63
0
    return;
64
65
7.09k
  struct sasl_server *server = sinst->server;
66
67
7.09k
  i_assert(sinst->requests == 0);
68
69
7.09k
  sasl_server_instance_mech_registry_free(sinst);
70
71
7.09k
  DLLIST_REMOVE(&server->instances, sinst);
72
73
7.09k
  event_unref(&sinst->event);
74
7.09k
  pool_unref(&sinst->pool);
75
7.09k
}
76
77
/*
78
 * Server
79
 */
80
81
struct sasl_server *
82
sasl_server_init(struct event *event_parent,
83
     const struct sasl_server_request_funcs *funcs)
84
7.09k
{
85
7.09k
  struct sasl_server *server;
86
7.09k
  pool_t pool;
87
88
7.09k
  pool = pool_alloconly_create(MEMPOOL_GROWING"sasl_server", 2048);
89
7.09k
  server = p_new(pool, struct sasl_server, 1);
90
7.09k
  server->pool = pool;
91
92
7.09k
  server->funcs = funcs;
93
94
7.09k
  server->event = event_create(event_parent);
95
7.09k
  event_add_category(server->event, &event_category_sasl_server);
96
7.09k
  event_set_append_log_prefix(server->event, "sasl: ");
97
98
7.09k
  return server;
99
7.09k
}
100
101
void sasl_server_deinit(struct sasl_server **_server)
102
7.09k
{
103
7.09k
  struct sasl_server *server = *_server;
104
105
7.09k
  if (server == NULL)
106
0
    return;
107
7.09k
  *_server = NULL;
108
109
7.09k
  i_assert(server->instances == NULL);
110
7.09k
  i_assert(server->requests == 0);
111
112
7.09k
  sasl_server_mech_registry_free(server);
113
114
7.09k
  event_unref(&server->event);
115
7.09k
  pool_unref(&server->pool);
116
7.09k
}