MySQL 8.0.40
Source Code Documentation
sql_auth_cache.h
Go to the documentation of this file.
1/* Copyright (c) 2000, 2024, Oracle and/or its affiliates.
2
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License, version 2.0,
5 as published by the Free Software Foundation.
6
7 This program is designed to work with certain software (including
8 but not limited to OpenSSL) that is licensed under separate terms,
9 as designated in a particular file or component or in included license
10 documentation. The authors of MySQL hereby grant you an additional
11 permission to link the program and your derivative works with the
12 separately licensed software that they have either included with
13 the program or referenced in the documentation.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License, version 2.0, for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
23#ifndef SQL_USER_CACHE_INCLUDED
24#define SQL_USER_CACHE_INCLUDED
25
26#include <assert.h>
27#include <string.h>
28#include <sys/types.h>
29#include <atomic>
30#include <boost/graph/adjacency_list.hpp>
31#include <boost/graph/graph_selectors.hpp>
32#include <boost/graph/graph_traits.hpp>
33#include <boost/graph/properties.hpp>
34#include <boost/pending/property.hpp>
35#include <list>
36#include <memory>
37#include <string>
38#include <unordered_map>
39
40#include "lex_string.h"
41#include "lf.h"
42#include "m_ctype.h"
43#include "map_helpers.h"
44#include "mf_wcomp.h" // wild_many, wild_one, wild_prefix
45#include "my_alloc.h"
46#include "my_compiler.h"
47#include "my_inttypes.h"
48#include "my_sharedlib.h"
49#include "my_sys.h"
52#include "mysql_com.h" // SCRAMBLE_LENGTH
53#include "mysql_time.h" // MYSQL_TIME
55#include "sql/auth/auth_internal.h" // List_of_authid, Authid
58#include "sql/psi_memory_key.h"
59#include "sql/sql_connect.h" // USER_RESOURCES
60#include "violite.h" // SSL_type
61
62/* Forward declarations */
64class String;
65class THD;
66struct TABLE;
67template <typename Element_type, size_t Prealloc>
70enum class Lex_acl_attrib_udyn;
71
72/* Classes */
73
75 public:
76 /**
77 IP mask type enum.
78 */
80 /**
81 Only IP is specified.
82 */
84 /**
85 IP specified with a mask in a CIDR form.
86 */
88 /**
89 IP specified with a mask in a form of a subnet.
90 */
92 };
93
94 const char *hostname;
96 long ip, ip_mask; // Used with masked ip:s
97 /**
98 IP mask type.
99 */
101
102 /**
103 IP mask parsing in the CIDR format.
104
105 @param[in] ip_arg Buffer containing CIDR mask value.
106 @param[out] val Numeric IP mask value on success.
107
108 @retval false Parsing succeeded.
109 @retval true Parsing failed.
110 */
111 static bool calc_cidr_mask(const char *ip_arg, long *val);
112
113 /**
114 IP mask parsing in the subnet format.
115
116 @param[in] ip_arg Buffer containing subnet mask value.
117 @param[out] val Numeric IP mask value on success.
118
119 @retval false Parsing succeeded.
120 @retval true Parsing failed.
121 */
122 static bool calc_ip_mask(const char *ip_arg, long *val);
123
124 /**
125 IP parsing.
126
127 @param[in] ip_arg Buffer containing IP value.
128 @param[out] val Numeric IP value on success.
129
130 @retval !nullptr Parsing succeeded. Returned value is the pointer following
131 the buffer holding the IP.
132 @retval nullptr Parsing failed. The buffer does not contain valid IP value.
133 */
134 static const char *calc_ip(const char *ip_arg, long *val);
135
136 public:
138 : hostname(nullptr),
140 ip(0),
141 ip_mask(0),
143 const char *get_host() const { return hostname ? hostname : ""; }
144 size_t get_host_len() const { return hostname_length; }
145
147 return (strchr(get_host(), wild_many) || strchr(get_host(), wild_one) ||
148 (ip_mask && (ip_mask != (long)UINT_MAX32)));
149 }
150
152 return (!hostname || (hostname[0] == wild_many && !hostname[1]));
153 }
154
155 void update_hostname(const char *host_arg);
156
157 bool compare_hostname(const char *host_arg, const char *ip_arg);
158};
159
161 public:
162 ACL_ACCESS() : host(), sort(0), access(0) {}
164 ulong sort;
166};
167
168/**
169 @class ACL_compare
170
171 Class that compares ACL_ACCESS objects. Used in std::sort functions.
172*/
174 public:
175 /**
176 Determine sort order of two user accounts.
177
178 ACL_ACCESS with IP specified is sorted before host name.
179
180 @param [in] a First object to compare.
181 @param [in] b Second object to compare.
182
183 @retval true First element goes first.
184 @retval false Second element goes first.
185 */
186 bool operator()(const ACL_ACCESS &a, const ACL_ACCESS &b);
187 bool operator()(const ACL_ACCESS *a, const ACL_ACCESS *b);
188};
189
190/**
191 @class ACL_USER_compare
192
193 Class that compares ACL_USER objects.
194*/
196 public:
197 /**
198 Determine sort order of two user accounts.
199
200 ACL_USER with IP specified is sorted before host name.
201 Non anonymous user is sorted before anonymous user, when properties of both
202 are equal.
203
204 @param [in] a First object to compare.
205 @param [in] b Second object to compare.
206
207 @retval true First element goes first.
208 @retval false Second element goes first.
209 */
210 bool operator()(const ACL_USER &a, const ACL_USER &b);
211 bool operator()(const ACL_USER *a, const ACL_USER *b);
212};
213
214/* ACL_HOST is used if no host is specified */
215
216class ACL_HOST : public ACL_ACCESS {
217 public:
218 char *db;
219};
220
221#define NUM_CREDENTIALS 2
222#define PRIMARY_CRED (NUM_CREDENTIALS - NUM_CREDENTIALS)
223#define SECOND_CRED (PRIMARY_CRED + 1)
224
226 public:
228 m_auth_string = {"", 0};
229 memset(m_salt, 0, SCRAMBLE_LENGTH + 1);
230 m_salt_len = 0;
231 }
232
233 public:
235 /**
236 The salt variable is used as the password hash for
237 native_password_authetication.
238 */
239 uint8 m_salt[SCRAMBLE_LENGTH + 1]; // scrambled password in binary form
240 /**
241 In the old protocol the salt_len indicated what type of autnetication
242 protocol was used: 0 - no password, 4 - 3.20, 8 - 4.0, 20 - 4.1.1
243 */
245};
246
247class ACL_USER : public ACL_ACCESS {
248 public:
250 char *user;
259 /**
260 Specifies whether the user account is locked or unlocked.
261 */
263 /**
264 If this ACL_USER was used as a role id then this flag is true.
265 During RENAME USER this variable is used for determining if it is safe
266 to rename the user or not.
267 */
269
270 /**
271 The number of old passwords to check when setting a new password
272 */
274
275 /**
276 Ignore @ref password_history_length,
277 use the global default @ref global_password_history
278 */
280
281 /**
282 The number of days that would have to pass before a password can be reused.
283 */
285 /**
286 Ignore @ref password_reuse_interval,
287 use the global default @ref global_password_reuse_interval
288 */
290
291 /**
292 The current password needed to be specified while changing it.
293 */
295
296 /**
297 Additional credentials
298 */
300
301 ACL_USER *copy(MEM_ROOT *root);
302 ACL_USER();
303
304 void set_user(MEM_ROOT *mem, const char *user_arg);
305 void set_host(MEM_ROOT *mem, const char *host_arg);
307 size_t get_username_length() const { return user ? strlen(user) : 0; }
309 public:
310 bool is_active() const {
312 }
315 }
319 bool update(THD *thd, bool successful_login, long *ret_days_remaining);
324 m_daynr_locked(0) {}
325
326 protected:
327 /**
328 read from the user config. The number of days to keep the account locked
329 */
331 /**
332 read from the user config. The number of failed login attempts before the
333 account is locked
334 */
336 /**
337 The remaining login tries, valid only if @ref m_failed_login_attempts and
338 @ref m_password_lock_time_days are non-zero
339 */
341 /** The day the account is locked, 0 if not locked */
345};
346
347class ACL_DB : public ACL_ACCESS {
348 public:
349 char *user, *db;
350
351 void set_user(MEM_ROOT *mem, const char *user_arg);
352 void set_host(MEM_ROOT *mem, const char *host_arg);
353};
354
356 const char *user;
358 const char *proxied_user;
360
361 typedef enum {
370
371 public:
372 ACL_PROXY_USER() = default;
373
374 void init(const char *host_arg, const char *user_arg,
375 const char *proxied_host_arg, const char *proxied_user_arg,
376 bool with_grant_arg);
377
378 void init(MEM_ROOT *mem, const char *host_arg, const char *user_arg,
379 const char *proxied_host_arg, const char *proxied_user_arg,
380 bool with_grant_arg);
381
382 void init(TABLE *table, MEM_ROOT *mem);
383
384 bool get_with_grant() { return with_grant; }
385 const char *get_user() { return user; }
386 const char *get_proxied_user() { return proxied_user; }
387 const char *get_proxied_host() { return proxied_host.get_host(); }
388 void set_user(MEM_ROOT *mem, const char *user_arg);
389 void set_host(MEM_ROOT *mem, const char *host_arg);
390
391 bool check_validity(bool check_no_resolve);
392
393 bool matches(const char *host_arg, const char *user_arg, const char *ip_arg,
394 const char *proxied_user_arg, bool any_proxy_user);
395
396 inline static bool auth_element_equals(const char *a, const char *b) {
397 return (a == b || (a != nullptr && b != nullptr && !strcmp(a, b)));
398 }
399
400 bool pk_equals(ACL_PROXY_USER *grant);
401
402 bool granted_on(const char *host_arg, const char *user_arg) {
403 return (
404 ((!user && (!user_arg || !user_arg[0])) ||
405 (user && user_arg && !strcmp(user, user_arg))) &&
406 ((!host.get_host() && (!host_arg || !host_arg[0])) ||
407 (host.get_host() && host_arg && !strcmp(host.get_host(), host_arg))));
408 }
409
410 void print_grant(THD *thd, String *str);
411
412 void set_data(ACL_PROXY_USER *grant) { with_grant = grant->with_grant; }
413
414 static int store_pk(TABLE *table, const LEX_CSTRING &host,
417
418 static int store_with_grant(TABLE *table, bool with_grant);
419
420 static int store_data_record(TABLE *table, const LEX_CSTRING &host,
421 const LEX_CSTRING &user,
424 const char *grantor);
425
426 size_t get_user_length() const { return user ? strlen(user) : 0; }
427
428 size_t get_proxied_user_length() const {
429 return proxied_user ? strlen(proxied_user) : 0;
430 }
431};
432
434 public:
437 char key[1]; // Key will be stored here
438};
439
441 public:
443 std::string column;
445};
446
448 public:
450 char *db;
451 const char *user;
452 char *tname;
454 ulong sort;
455 std::string hash_key;
456 GRANT_NAME(const char *h, const char *d, const char *u, const char *t,
457 Access_bitmask p, bool is_routine);
458 GRANT_NAME(TABLE *form, bool is_routine);
459 virtual ~GRANT_NAME() = default;
460 virtual bool ok() { return privs != 0; }
461 void set_user_details(const char *h, const char *d, const char *u,
462 const char *t, bool is_routine);
463};
464
465class GRANT_TABLE : public GRANT_NAME {
466 public:
471
472 GRANT_TABLE(const char *h, const char *d, const char *u, const char *t,
474 explicit GRANT_TABLE(TABLE *form);
475 bool init(TABLE *col_privs);
476 ~GRANT_TABLE() override;
477 bool ok() override { return privs != 0 || cols != 0; }
478};
479
480/*
481 * A default/no-arg constructor is useful with containers-of-containers
482 * situations in which a two-allocator scoped_allocator_adapter is not enough.
483 * This custom allocator provides a Malloc_allocator with a no-arg constructor
484 * by hard-coding the key_memory_acl_cache constructor argument.
485 * This "solution" lacks beauty, yet is pragmatic.
486 */
487template <class T>
489 public:
491 template <class U>
492 struct rebind {
494 };
495
496 template <class U>
497 Acl_cache_allocator(const Acl_cache_allocator<U> &other [[maybe_unused]])
499
500 template <class U>
502 [[maybe_unused]]) {}
503};
505typedef std::list<ACL_USER *, Acl_user_ptr_allocator> Acl_user_ptr_list;
508
509/* Data Structures */
511extern MEM_ROOT memex;
512const size_t ACL_PREALLOC_SIZE = 10U;
520extern std::unique_ptr<
524extern bool allow_all_hosts;
525extern uint grant_version; /* Version of priv tables */
526extern std::unique_ptr<Acl_restrictions> acl_restrictions;
527// Search for a matching grant. Prefer exact grants before non-exact ones.
528
530
531template <class T>
534 &name_hash,
535 const char *host, const char *ip, const char *db, const char *user,
536 const char *tname, bool exact, bool name_tolower) {
537 T *found = nullptr;
538
539 std::string name = tname;
540 if (name_tolower) my_casedn_str(files_charset_info, &name[0]);
541 std::string key = user;
542 key.push_back('\0');
543 key.append(db);
544 key.push_back('\0');
545 key.append(name);
546 key.push_back('\0');
547
548 auto it_range = name_hash.equal_range(key);
549 for (auto it = it_range.first; it != it_range.second; ++it) {
550 T *grant_name = it->second.get();
551 if (exact) {
552 if (!grant_name->host.get_host() ||
554 grant_name->host.get_host())) ||
555 (ip && !strcmp(ip, grant_name->host.get_host())))
556 return grant_name;
557 } else {
558 if (grant_name->host.compare_hostname(host, ip) &&
559 (!found || found->sort < grant_name->sort))
560 found = grant_name; // Host ok
561 }
562 }
563 return found;
564}
565
566inline GRANT_NAME *routine_hash_search(const char *host, const char *ip,
567 const char *db, const char *user,
568 const char *tname, bool proc,
569 bool exact) {
570 assert(proc ? proc_priv_hash : func_priv_hash);
571 return name_hash_search(proc ? *proc_priv_hash : *func_priv_hash, host, ip,
572 db, user, tname, exact, true);
573}
574
575inline GRANT_TABLE *table_hash_search(const char *host, const char *ip,
576 const char *db, const char *user,
577 const char *tname, bool exact) {
578 assert(column_priv_hash);
579 return name_hash_search(*column_priv_hash, host, ip, db, user, tname, exact,
580 false);
581}
582
583inline GRANT_COLUMN *column_hash_search(GRANT_TABLE *t, const char *cname,
584 size_t length) {
585 return find_or_nullptr(t->hash_columns, std::string(cname, length));
586}
587
588/* Role management */
589
590/** Tag dispatch for custom Role_properties */
591namespace boost {
593BOOST_INSTALL_PROPERTY(vertex, acl_user);
594} // namespace boost
595
596/**
597 Custom vertex properties used in Granted_roles_graph
598 TODO ACL_USER contains too much information. We only need global access,
599 username and hostname. If this was a POD we don't have to hold the same
600 mutex as ACL_USER.
601*/
602typedef boost::property<boost::vertex_acl_user_t, ACL_USER,
603 boost::property<boost::vertex_name_t, std::string>>
605
606typedef boost::property<boost::edge_capacity_t, int> Role_edge_properties;
607
608/** A graph of all users/roles privilege inheritance */
609typedef boost::adjacency_list<boost::setS, // OutEdges
610 boost::vecS, // Vertices
611 boost::bidirectionalS, // Directed graph
612 Role_properties, // Vertex props
615
616/** The data type of a vertex in the Granted_roles_graph */
617typedef boost::graph_traits<Granted_roles_graph>::vertex_descriptor
619
620/** The data type of an edge in the Granted_roles_graph */
621typedef boost::graph_traits<Granted_roles_graph>::edge_descriptor
623
624/** The datatype of the map between authids and graph vertex descriptors */
625typedef std::unordered_map<std::string, Role_vertex_descriptor> Role_index_map;
626
627/** The type used for the number of edges incident to a vertex in the graph.
628 */
629using degree_s_t = boost::graph_traits<Granted_roles_graph>::degree_size_type;
630
631/** The type for the iterator returned by out_edges(). */
633 boost::graph_traits<Granted_roles_graph>::out_edge_iterator;
634
635/** The type for the iterator returned by in_edges(). */
637 boost::graph_traits<Granted_roles_graph>::in_edge_iterator;
638
639/** Container for global, schema, table/view and routine ACL maps */
640class Acl_map {
641 public:
642 Acl_map(Security_context *sctx, uint64 ver);
643 Acl_map(const Acl_map &map) = delete;
644 Acl_map(const Acl_map &&map);
645 ~Acl_map();
646
647 private:
648 Acl_map &operator=(const Acl_map &map);
649
650 public:
651 void *operator new(size_t size);
652 void operator delete(void *p);
656
668
669 private:
670 std::atomic<int32> m_reference_count;
681};
682
684
686 public:
687 Acl_cache();
688 ~Acl_cache();
689
690 /**
691 When ever the role graph is modified we must flatten the privileges again.
692 This is done by increasing the role graph version counter. Next time
693 a security context is created for an authorization id (aid) a request is
694 also sent to the acl_cache to checkout a flattened acl_map for this
695 particular aid. If a previous acl_map exists the version of this map is
696 compared to the role graph version. If they don't match a new acl_map
697 is calculated and inserted into the cache.
698 */
699 void increase_version();
700 /**
701 Returns a pointer to an acl map to the caller and increase the reference
702 count on the object, iff the object version is the same as the global
703 graph version.
704 If no acl map exists which correspond to the current authorization id of
705 the security context, a new acl map is calculated, inserted into the cache
706 and returned to the user.
707 A new object will also be created if the role graph version counter is
708 different than the acl map object's version.
709
710 @param sctx The target Security_context
711 @param uid The target authid
712 @param active_roles A list of active roles
713
714 @return A pointer to an Acl_map
715 @retval !NULL Success
716 @retval NULL A fatal OOM error happened.
717 */
719 List_of_auth_id_refs &active_roles);
720 /**
721 When the security context is done with the acl map it calls the cache
722 to decrease the reference count on that object.
723 @param map acl map
724 */
726 /**
727 Removes all acl map objects with a references count of zero.
728 */
729 void flush_cache();
730 /**
731 Return a lower boundary to the current version count.
732 */
733 uint64 version();
734 /**
735 Return a snapshot of the number of items in the cache
736 */
737 int32 size();
738
739 private:
740 /**
741 Creates a new acl map for the authorization id of the security context.
742
743 @param version The version of the new map
744 @param sctx The associated security context
745 */
747 /** Role graph version counter */
748 std::atomic<uint64> m_role_graph_version;
751};
752
754
755/**
756 Enum for specifying lock type over Acl cache
757*/
758
760
761/**
762 Lock guard for ACL Cache.
763 Destructor automatically releases the lock.
764*/
765
767 public:
769
770 /**
771 Acl_cache_lock_guard destructor.
772
773 Release lock(s) if taken
774 */
776
777 bool lock(bool raise_error = true);
778 void unlock();
779
780 private:
781 bool already_locked();
782
783 private:
784 /** Handle to THD object */
786 /** Lock mode */
788 /** Lock status */
790};
791
792/**
793 Cache to store the Restrictions of every auth_id.
794 This cache is not thread safe.
795 Callers must acquire acl_cache_write_lock before to amend the cache.
796 Callers should acquire acl_cache_read_lock to probe the cache.
797
798 Acl_restrictions is not part of ACL_USER because as of now latter is POD
799 type class. We use copy-POD for ACL_USER that makes the explicit memory
800 management of its members hard.
801*/
803 public:
805
810
811 void remove_restrictions(const ACL_USER *acl_user);
812 void upsert_restrictions(const ACL_USER *acl_user,
813 const Restrictions &restriction);
814
815 Restrictions find_restrictions(const ACL_USER *acl_user) const;
816 size_t size() const;
817
818 private:
820};
821
822#endif /* SQL_USER_CACHE_INCLUDED */
uint32_t Access_bitmask
Definition: auth_acls.h:34
std::pair< LEX_CSTRING, LEX_CSTRING > Auth_id_ref
user, host tuple which reference either acl_cache or g_default_roles
Definition: auth_common.h:80
std::vector< Auth_id_ref > List_of_auth_id_refs
Definition: auth_common.h:81
std::map< std::string, Access_bitmask > SP_access_map
Definition: auth_internal.h:65
std::map< std::string, Access_bitmask > Db_access_map
Definition: auth_internal.h:66
std::map< std::string, bool > Dynamic_privileges
Definition: auth_internal.h:277
std::unordered_set< std::string > Grant_acl_set
Definition: auth_internal.h:90
Definition: sql_auth_cache.h:160
Access_bitmask access
Definition: sql_auth_cache.h:165
ACL_HOST_AND_IP host
Definition: sql_auth_cache.h:163
ACL_ACCESS()
Definition: sql_auth_cache.h:162
ulong sort
Definition: sql_auth_cache.h:164
Definition: sql_auth_cache.h:347
char * user
Definition: sql_auth_cache.h:349
char * db
Definition: sql_auth_cache.h:349
void set_user(MEM_ROOT *mem, const char *user_arg)
Definition: sql_auth_cache.cc:679
void set_host(MEM_ROOT *mem, const char *host_arg)
Definition: sql_auth_cache.cc:683
Definition: sql_auth_cache.h:74
bool check_allow_all_hosts()
Definition: sql_auth_cache.h:151
bool has_wildcard()
Definition: sql_auth_cache.h:146
static bool calc_cidr_mask(const char *ip_arg, long *val)
IP mask parsing in the CIDR format.
Definition: sql_auth_cache.cc:224
long ip_mask
Definition: sql_auth_cache.h:96
size_t get_host_len() const
Definition: sql_auth_cache.h:144
enum_ip_mask_type
IP mask type enum.
Definition: sql_auth_cache.h:79
@ ip_mask_type_cidr
IP specified with a mask in a CIDR form.
Definition: sql_auth_cache.h:87
@ ip_mask_type_subnet
IP specified with a mask in a form of a subnet.
Definition: sql_auth_cache.h:91
@ ip_mask_type_implicit
Only IP is specified.
Definition: sql_auth_cache.h:83
static const char * calc_ip(const char *ip_arg, long *val)
IP parsing.
Definition: sql_auth_cache.cc:247
long ip
Definition: sql_auth_cache.h:96
static bool calc_ip_mask(const char *ip_arg, long *val)
IP mask parsing in the subnet format.
Definition: sql_auth_cache.cc:235
size_t hostname_length
Definition: sql_auth_cache.h:95
void update_hostname(const char *host_arg)
Update the hostname.
Definition: sql_auth_cache.cc:268
ACL_HOST_AND_IP()
Definition: sql_auth_cache.h:137
const char * get_host() const
Definition: sql_auth_cache.h:143
enum_ip_mask_type ip_mask_type
IP mask type.
Definition: sql_auth_cache.h:100
const char * hostname
Definition: sql_auth_cache.h:94
bool compare_hostname(const char *host_arg, const char *ip_arg)
Definition: sql_auth_cache.cc:320
Definition: sql_auth_cache.h:216
char * db
Definition: sql_auth_cache.h:218
Definition: sql_auth_cache.h:355
ACL_HOST_AND_IP proxied_host
Definition: sql_auth_cache.h:357
static int store_data_record(TABLE *table, const LEX_CSTRING &host, const LEX_CSTRING &user, const LEX_CSTRING &proxied_host, const LEX_CSTRING &proxied_user, bool with_grant, const char *grantor)
Definition: sql_auth_cache.cc:653
bool get_with_grant()
Definition: sql_auth_cache.h:384
const char * get_proxied_host()
Definition: sql_auth_cache.h:387
void print_grant(THD *thd, String *str)
Definition: sql_auth_cache.cc:606
bool matches(const char *host_arg, const char *user_arg, const char *ip_arg, const char *proxied_user_arg, bool any_proxy_user)
Definition: sql_auth_cache.cc:557
const char * get_user()
Definition: sql_auth_cache.h:385
void set_host(MEM_ROOT *mem, const char *host_arg)
Definition: sql_auth_cache.cc:675
size_t get_proxied_user_length() const
Definition: sql_auth_cache.h:428
size_t get_user_length() const
Definition: sql_auth_cache.h:426
void init(const char *host_arg, const char *user_arg, const char *proxied_host_arg, const char *proxied_user_arg, bool with_grant_arg)
Definition: sql_auth_cache.cc:508
static int store_pk(TABLE *table, const LEX_CSTRING &host, const LEX_CSTRING &user, const LEX_CSTRING &proxied_host, const LEX_CSTRING &proxied_user)
Definition: sql_auth_cache.cc:617
bool pk_equals(ACL_PROXY_USER *grant)
Definition: sql_auth_cache.cc:583
bool check_validity(bool check_no_resolve)
Definition: sql_auth_cache.cc:544
static bool auth_element_equals(const char *a, const char *b)
Definition: sql_auth_cache.h:396
void set_user(MEM_ROOT *mem, const char *user_arg)
Definition: sql_auth_cache.cc:671
static int store_with_grant(TABLE *table, bool with_grant)
Definition: sql_auth_cache.cc:643
void set_data(ACL_PROXY_USER *grant)
Definition: sql_auth_cache.h:412
old_acl_proxy_users
Definition: sql_auth_cache.h:361
@ MYSQL_PROXIES_PRIV_PROXIED_HOST
Definition: sql_auth_cache.h:364
@ MYSQL_PROXIES_PRIV_HOST
Definition: sql_auth_cache.h:362
@ MYSQL_PROXIES_PRIV_WITH_GRANT
Definition: sql_auth_cache.h:366
@ MYSQL_PROXIES_PRIV_GRANTOR
Definition: sql_auth_cache.h:367
@ MYSQL_PROXIES_PRIV_PROXIED_USER
Definition: sql_auth_cache.h:365
@ MYSQL_PROXIES_PRIV_TIMESTAMP
Definition: sql_auth_cache.h:368
@ MYSQL_PROXIES_PRIV_USER
Definition: sql_auth_cache.h:363
const char * proxied_user
Definition: sql_auth_cache.h:358
const char * get_proxied_user()
Definition: sql_auth_cache.h:386
ACL_PROXY_USER()=default
const char * user
Definition: sql_auth_cache.h:356
bool granted_on(const char *host_arg, const char *user_arg)
Definition: sql_auth_cache.h:402
bool with_grant
Definition: sql_auth_cache.h:359
Definition: sql_auth_cache.h:308
Password_locked_state()
Definition: sql_auth_cache.h:320
void set_parameters(uint password_lock_time_days, uint failed_login_attempts)
Definition: sql_auth_cache.cc:372
int m_password_lock_time_days
read from the user config.
Definition: sql_auth_cache.h:330
uint get_failed_login_attempts() const
Definition: sql_auth_cache.h:316
bool is_active() const
Definition: sql_auth_cache.h:310
uint m_remaining_login_attempts
The remaining login tries, valid only if m_failed_login_attempts and m_password_lock_time_days are no...
Definition: sql_auth_cache.h:340
long m_daynr_locked
The day the account is locked, 0 if not locked.
Definition: sql_auth_cache.h:342
uint m_failed_login_attempts
read from the user config.
Definition: sql_auth_cache.h:335
int get_password_lock_time_days() const
Definition: sql_auth_cache.h:313
bool update(THD *thd, bool successful_login, long *ret_days_remaining)
Updates the password locked state based on the time of day fetched from the THD.
Definition: sql_auth_cache.cc:390
Class that compares ACL_USER objects.
Definition: sql_auth_cache.h:195
bool operator()(const ACL_USER &a, const ACL_USER &b)
Determine sort order of two user accounts.
Definition: sql_auth_cache.cc:3756
Definition: sql_auth_cache.h:247
bool account_locked
Specifies whether the user account is locked or unlocked.
Definition: sql_auth_cache.h:262
Acl_credential credentials[NUM_CREDENTIALS]
Additional credentials.
Definition: sql_auth_cache.h:299
void set_mfa(MEM_ROOT *mem, I_multi_factor_auth *m)
Definition: sql_auth_cache.cc:490
MYSQL_TIME password_last_changed
Definition: sql_auth_cache.h:256
bool use_default_password_reuse_interval
Ignore password_reuse_interval, use the global default global_password_reuse_interval.
Definition: sql_auth_cache.h:289
uint password_lifetime
Definition: sql_auth_cache.h:257
Lex_acl_attrib_udyn password_require_current
The current password needed to be specified while changing it.
Definition: sql_auth_cache.h:294
bool can_authenticate
Definition: sql_auth_cache.h:255
bool is_role
If this ACL_USER was used as a role id then this flag is true.
Definition: sql_auth_cache.h:268
void set_host(MEM_ROOT *mem, const char *host_arg)
Definition: sql_auth_cache.cc:486
LEX_CSTRING plugin
Definition: sql_auth_cache.h:253
bool use_default_password_history
Ignore password_history_length, use the global default global_password_history.
Definition: sql_auth_cache.h:279
ACL_USER()
Definition: sql_auth_cache.cc:334
enum SSL_type ssl_type
Definition: sql_auth_cache.h:251
const char * x509_subject
Definition: sql_auth_cache.h:252
const char * ssl_cipher
Definition: sql_auth_cache.h:252
size_t get_username_length() const
Definition: sql_auth_cache.h:307
uint32 password_reuse_interval
The number of days that would have to pass before a password can be reused.
Definition: sql_auth_cache.h:284
I_multi_factor_auth * m_mfa
Definition: sql_auth_cache.h:344
bool password_expired
Definition: sql_auth_cache.h:254
USER_RESOURCES user_resource
Definition: sql_auth_cache.h:249
void set_user(MEM_ROOT *mem, const char *user_arg)
Definition: sql_auth_cache.cc:482
class ACL_USER::Password_locked_state password_locked_state
char * user
Definition: sql_auth_cache.h:250
const char * x509_issuer
Definition: sql_auth_cache.h:252
bool use_default_password_lifetime
Definition: sql_auth_cache.h:258
uint32 password_history_length
The number of old passwords to check when setting a new password.
Definition: sql_auth_cache.h:273
ACL_USER * copy(MEM_ROOT *root)
Definition: sql_auth_cache.cc:448
Class that compares ACL_ACCESS objects.
Definition: sql_auth_cache.h:173
bool operator()(const ACL_ACCESS &a, const ACL_ACCESS &b)
Determine sort order of two user accounts.
Definition: sql_auth_cache.cc:3726
Definition: sql_auth_cache.h:488
Acl_cache_allocator(const Acl_cache_allocator< U > &other)
Definition: sql_auth_cache.h:497
Acl_cache_allocator & operator=(const Acl_cache_allocator< U > &other)
Definition: sql_auth_cache.h:501
Acl_cache_allocator()
Definition: sql_auth_cache.h:490
Lock guard for ACL Cache.
Definition: sql_auth_cache.h:766
Acl_cache_lock_guard(THD *thd, Acl_cache_lock_mode mode)
Acl_cache_lock_guard constructor.
Definition: sql_auth_cache.cc:3518
Acl_cache_lock_mode m_mode
Lock mode.
Definition: sql_auth_cache.h:787
bool lock(bool raise_error=true)
Explicitly take lock on Acl_cache_lock_cache object.
Definition: sql_auth_cache.cc:3534
void unlock()
Explicitly unlock all acquired locks.
Definition: sql_auth_cache.cc:3564
~Acl_cache_lock_guard()
Acl_cache_lock_guard destructor.
Definition: sql_auth_cache.h:775
bool already_locked()
Check whether lock is already obtained or not.
Definition: sql_auth_cache.cc:3596
bool m_locked
Lock status.
Definition: sql_auth_cache.h:789
THD * m_thd
Handle to THD object.
Definition: sql_auth_cache.h:785
Definition: sql_auth_cache.h:685
int32 size()
Return a snapshot of the number of items in the cache.
Definition: sql_auth_cache.cc:3318
void increase_version()
When ever the role graph is modified we must flatten the privileges again.
Definition: sql_auth_cache.cc:3310
uint64 version()
Return a lower boundary to the current version count.
Definition: sql_auth_cache.cc:3316
~Acl_cache()
Definition: sql_auth_cache.cc:3232
Acl_map * create_acl_map(uint64 version, Security_context *sctx)
Creates a new acl map for the authorization id of the security context.
Definition: sql_auth_cache.cc:3419
mysql_mutex_t m_cache_flush_mutex
Definition: sql_auth_cache.h:750
void flush_cache()
Removes all acl map objects with a references count of zero.
Definition: sql_auth_cache.cc:3398
std::atomic< uint64 > m_role_graph_version
Role graph version counter.
Definition: sql_auth_cache.h:748
Acl_cache_internal m_cache
Definition: sql_auth_cache.h:749
Acl_cache()
Definition: sql_auth_cache.cc:3219
Acl_map * checkout_acl_map(Security_context *sctx, Auth_id_ref &uid, List_of_auth_id_refs &active_roles)
Returns a pointer to an acl map to the caller and increase the reference count on the object,...
Definition: sql_auth_cache.cc:3320
void return_acl_map(Acl_map *map)
When the security context is done with the acl map it calls the cache to decrease the reference count...
Definition: sql_auth_cache.cc:3369
Definition: sql_auth_cache.h:225
uint8 m_salt[SCRAMBLE_LENGTH+1]
The salt variable is used as the password hash for native_password_authetication.
Definition: sql_auth_cache.h:239
uint8 m_salt_len
In the old protocol the salt_len indicated what type of autnetication protocol was used: 0 - no passw...
Definition: sql_auth_cache.h:244
LEX_CSTRING m_auth_string
Definition: sql_auth_cache.h:234
Acl_credential()
Definition: sql_auth_cache.h:227
Container for global, schema, table/view and routine ACL maps.
Definition: sql_auth_cache.h:640
Grant_acl_set * grant_acls()
Definition: sql_auth_cache.cc:3294
void increase_reference_count()
Definition: sql_auth_cache.cc:3306
std::atomic< int32 > m_reference_count
Definition: sql_auth_cache.h:670
Dynamic_privileges * dynamic_privileges()
Definition: sql_auth_cache.cc:3300
Restrictions & restrictions()
Definition: sql_auth_cache.cc:3304
Acl_map(Security_context *sctx, uint64 ver)
Definition: sql_auth_cache.cc:3237
Acl_map & operator=(const Acl_map &map)
Definition: sql_auth_cache.cc:3284
void decrease_reference_count()
Definition: sql_auth_cache.cc:3308
Acl_map(const Acl_map &map)=delete
~Acl_map()
Definition: sql_auth_cache.cc:3264
Db_access_map * db_acls()
Definition: sql_auth_cache.cc:3288
SP_access_map m_sp_acls
Definition: sql_auth_cache.h:676
Table_access_map m_table_acls
Definition: sql_auth_cache.h:674
Access_bitmask m_global_acl
Definition: sql_auth_cache.h:675
uint32 reference_count()
Definition: sql_auth_cache.h:667
Db_access_map * db_wild_acls()
Definition: sql_auth_cache.cc:3290
Access_bitmask global_acl()
Definition: sql_auth_cache.cc:3286
Db_access_map m_db_acls
Definition: sql_auth_cache.h:672
uint64 m_version
Definition: sql_auth_cache.h:671
Db_access_map m_db_wild_acls
Definition: sql_auth_cache.h:673
Table_access_map * table_acls()
Definition: sql_auth_cache.cc:3292
SP_access_map * sp_acls()
Definition: sql_auth_cache.cc:3296
Dynamic_privileges m_dynamic_privileges
Definition: sql_auth_cache.h:679
SP_access_map * func_acls()
Definition: sql_auth_cache.cc:3298
Restrictions m_restrictions
Definition: sql_auth_cache.h:680
SP_access_map m_func_acls
Definition: sql_auth_cache.h:677
Grant_acl_set m_with_admin_acls
Definition: sql_auth_cache.h:678
uint64 version()
Definition: sql_auth_cache.h:666
Cache to store the Restrictions of every auth_id.
Definition: sql_auth_cache.h:802
Acl_restrictions(Acl_restrictions &&)=delete
malloc_unordered_map< std::string, Restrictions > m_restrictions_map
Definition: sql_auth_cache.h:819
Acl_restrictions(const Acl_restrictions &)=delete
Acl_restrictions & operator=(Acl_restrictions &&)=delete
void upsert_restrictions(const ACL_USER *acl_user, const Restrictions &restriction)
Update, insert or remove the Restrictions for the ACL_USER.
Definition: sql_auth_cache.cc:3813
Restrictions find_restrictions(const ACL_USER *acl_user) const
Find the Restrictions of the ACL_USER.
Definition: sql_auth_cache.cc:3840
size_t size() const
Definition: sql_auth_cache.cc:3854
void remove_restrictions(const ACL_USER *acl_user)
Remove the Restrictions of the ACL_USER.
Definition: sql_auth_cache.cc:3793
Acl_restrictions & operator=(const Acl_restrictions &)=delete
Acl_restrictions()
Construstor.
Definition: sql_auth_cache.cc:3786
Definition: sql_auth_cache.h:440
Access_bitmask rights
Definition: sql_auth_cache.h:442
GRANT_COLUMN(String &c, Access_bitmask y)
Definition: sql_auth_cache.cc:913
std::string column
Definition: sql_auth_cache.h:443
Definition: sql_auth_cache.h:447
void set_user_details(const char *h, const char *d, const char *u, const char *t, bool is_routine)
Definition: sql_auth_cache.cc:916
std::string hash_key
Definition: sql_auth_cache.h:455
char * tname
Definition: sql_auth_cache.h:452
const char * user
Definition: sql_auth_cache.h:451
Access_bitmask privs
Definition: sql_auth_cache.h:453
ACL_HOST_AND_IP host
Definition: sql_auth_cache.h:449
char * db
Definition: sql_auth_cache.h:450
virtual ~GRANT_NAME()=default
ulong sort
Definition: sql_auth_cache.h:454
GRANT_NAME(const char *h, const char *d, const char *u, const char *t, Access_bitmask p, bool is_routine)
Definition: sql_auth_cache.cc:940
virtual bool ok()
Definition: sql_auth_cache.h:460
Definition: sql_auth_cache.h:465
collation_unordered_multimap< std::string, unique_ptr_destroy_only< GRANT_COLUMN > > hash_columns
Definition: sql_auth_cache.h:470
GRANT_TABLE(const char *h, const char *d, const char *u, const char *t, Access_bitmask p, Access_bitmask c)
Definition: sql_auth_cache.cc:946
bool init(TABLE *col_privs)
Definition: sql_auth_cache.cc:1004
~GRANT_TABLE() override
bool ok() override
Definition: sql_auth_cache.h:477
Access_bitmask cols
Definition: sql_auth_cache.h:467
An interface to access information about Multi factor authentication methods.
Definition: sql_mfa.h:45
Malloc_allocator is a C++ STL memory allocator based on my_malloc/my_free.
Definition: malloc_allocator.h:63
A typesafe replacement for DYNAMIC_ARRAY.
Definition: prealloced_array.h:71
Container of all restrictions for a given user.
Definition: partial_revokes.h:155
A set of THD members describing the current authenticated user.
Definition: sql_security_ctx.h:55
Using this class is fraught with peril, and you need to be very careful when doing so.
Definition: sql_string.h:168
For each client connection we create a separate thread with THD serving as a thread/connection descri...
Definition: sql_lexer_thd.h:34
Definition: auth_internal.h:68
Definition: sql_auth_cache.h:433
uint16 length
Definition: sql_auth_cache.h:436
char key[1]
Definition: sql_auth_cache.h:437
Access_bitmask access
Definition: sql_auth_cache.h:435
std::unordered_map, but with my_malloc and collation-aware comparison.
Definition: map_helpers.h:210
std::unordered_multimap, but with my_malloc and collation-aware comparison.
Definition: map_helpers.h:226
std::unordered_map, but with my_malloc, so that you can track the memory used using PSI memory keys.
Definition: map_helpers.h:148
std::unordered_multimap, but with my_malloc, so that you can track the memory used using PSI memory k...
Definition: map_helpers.h:189
const char * p
Definition: ctype-mb.cc:1237
Fido Client Authentication nullptr
Definition: fido_client_plugin.cc:222
A better implementation of the UNIX ctype(3) library.
MYSQL_PLUGIN_IMPORT CHARSET_INFO * system_charset_info
Definition: mysqld.cc:1545
#define my_strcasecmp(s, a, b)
Definition: m_ctype.h:718
#define my_casedn_str(s, a)
Definition: m_ctype.h:770
static auto find_or_nullptr(const Container &container, const Key &key)
Some useful helpers for associative arrays with MySQL-specific semantics.
Definition: map_helpers.h:54
const char wild_many
Character constant for wildcard representing zero or more characters (SQL style).
Definition: mf_wcomp.h:43
const char wild_one
Character constant for wildcard representing any one character (SQL style).
Definition: mf_wcomp.h:37
This file follows Google coding style, except for the name MEM_ROOT (which is kept for historical rea...
std::unique_ptr< T, Destroy_only< T > > unique_ptr_destroy_only
std::unique_ptr, but only destroying.
Definition: my_alloc.h:489
Header for compiler-dependent features.
Some integer typedefs for easier portability.
uint8_t uint8
Definition: my_inttypes.h:63
int32_t int32
Definition: my_inttypes.h:66
uint64_t uint64
Definition: my_inttypes.h:69
uint16_t uint16
Definition: my_inttypes.h:65
uint32_t uint32
Definition: my_inttypes.h:67
#define UINT_MAX32
Definition: my_inttypes.h:79
Functions related to handling of plugins and other dynamically loaded libraries.
#define MYSQL_PLUGIN_IMPORT
Definition: my_sharedlib.h:71
Common header for many mysys elements.
Common definition between mysql server & client.
#define SCRAMBLE_LENGTH
Length of random string sent by server on handshake; this is also length of obfuscated password,...
Definition: mysql_com.h:128
ABI for instrumented mutexes.
Time declarations shared between the server and client API: you should not add anything to this heade...
char * user
Definition: mysqladmin.cc:60
const char * host
Definition: mysqladmin.cc:59
std::string str(const mysqlrouter::ConfigGenerator::Options::Endpoint &ep)
Definition: config_generator.cc:1052
Tag dispatch for custom Role_properties.
Definition: sql_auth_cache.h:591
BOOST_INSTALL_PROPERTY(vertex, acl_user)
vertex_acl_user_t
Definition: sql_auth_cache.h:592
@ vertex_acl_user
Definition: sql_auth_cache.h:592
const std::string password_lock_time_days("password_lock_time_days")
underkeys of password locking
const std::string failed_login_attempts("failed_login_attempts")
underkeys of password locking
bool length(const dd::Spatial_reference_system *srs, const Geometry *g1, double *length, bool *null) noexcept
Computes the length of linestrings and multilinestrings.
Definition: length.cc:76
mode
Definition: file_handle.h:60
std::map< Key, Value, Compare, ut::allocator< std::pair< const Key, Value > > > map
Specialization of map which uses ut_allocator.
Definition: ut0new.h:2893
std::conditional_t< !std::is_array< T >::value, std::unique_ptr< T, detail::Deleter< T > >, std::conditional_t< detail::is_unbounded_array_v< T >, std::unique_ptr< T, detail::Array_deleter< std::remove_extent_t< T > > >, void > > unique_ptr
The following is a common type that is returned by all the ut::make_unique (non-aligned) specializati...
Definition: ut0new.h:2439
PSI_memory_key key_memory_acl_cache
Definition: psi_memory_key.cc:96
required string key
Definition: replication_asynchronous_connection_failover.proto:60
Lex_acl_attrib_udyn
This is generic enum.
Definition: table.h:2544
uint grant_version
Definition: sql_auth_cache.cc:163
std::unique_ptr< malloc_unordered_multimap< std::string, unique_ptr_destroy_only< GRANT_TABLE > > > column_priv_hash
Definition: sql_auth_cache.cc:140
Prealloced_array< ACL_DB, ACL_PREALLOC_SIZE > * acl_dbs
Definition: sql_auth_cache.cc:132
std::unique_ptr< malloc_unordered_multimap< std::string, unique_ptr_destroy_only< GRANT_NAME > > > proc_priv_hash
Definition: sql_auth_cache.cc:143
Acl_user_ptr_list * cached_acl_users_for_name(const char *name)
Fetch the list of ACL_USERs which share name or have no name.
Definition: sql_auth_cache.cc:1149
Acl_cache_allocator< ACL_USER * > Acl_user_ptr_allocator
Definition: sql_auth_cache.h:504
boost::adjacency_list< boost::setS, boost::vecS, boost::bidirectionalS, Role_properties, Role_edge_properties > Granted_roles_graph
A graph of all users/roles privilege inheritance.
Definition: sql_auth_cache.h:614
T * name_hash_search(const malloc_unordered_multimap< std::string, unique_ptr_destroy_only< T > > &name_hash, const char *host, const char *ip, const char *db, const char *user, const char *tname, bool exact, bool name_tolower)
Definition: sql_auth_cache.h:532
Acl_cache_lock_mode
Enum for specifying lock type over Acl cache.
Definition: sql_auth_cache.h:759
MYSQL_PLUGIN_IMPORT CHARSET_INFO * files_charset_info
Definition: mysqld.cc:1545
MEM_ROOT global_acl_memory
Definition: sql_auth_cache.cc:128
Prealloced_array< ACL_USER, ACL_PREALLOC_SIZE > * acl_users
Definition: sql_auth_cache.cc:130
bool allow_all_hosts
Definition: sql_auth_cache.cc:162
boost::property< boost::vertex_acl_user_t, ACL_USER, boost::property< boost::vertex_name_t, std::string > > Role_properties
Custom vertex properties used in Granted_roles_graph TODO ACL_USER contains too much information.
Definition: sql_auth_cache.h:604
boost::graph_traits< Granted_roles_graph >::in_edge_iterator in_edge_itr_t
The type for the iterator returned by in_edges().
Definition: sql_auth_cache.h:637
Acl_cache * get_global_acl_cache()
Definition: sql_auth_cache.cc:106
std::unique_ptr< malloc_unordered_multimap< std::string, unique_ptr_destroy_only< GRANT_NAME > > > func_priv_hash
Definition: sql_auth_cache.h:522
boost::graph_traits< Granted_roles_graph >::out_edge_iterator out_edge_itr_t
The type for the iterator returned by out_edges().
Definition: sql_auth_cache.h:633
std::unique_ptr< Acl_restrictions > acl_restrictions
Definition: sql_auth_cache.cc:147
Prealloced_array< ACL_HOST_AND_IP, ACL_PREALLOC_SIZE > * acl_wild_hosts
Definition: sql_auth_cache.cc:133
void rebuild_cached_acl_users_for_name(void)
Build the lists of ACL_USERs which share name or have no name.
Definition: sql_auth_cache.cc:1099
#define NUM_CREDENTIALS
Definition: sql_auth_cache.h:221
boost::property< boost::edge_capacity_t, int > Role_edge_properties
Definition: sql_auth_cache.h:606
MEM_ROOT memex
Definition: sql_auth_cache.cc:129
boost::graph_traits< Granted_roles_graph >::vertex_descriptor Role_vertex_descriptor
The data type of a vertex in the Granted_roles_graph.
Definition: sql_auth_cache.h:618
boost::graph_traits< Granted_roles_graph >::edge_descriptor Role_edge_descriptor
The data type of an edge in the Granted_roles_graph.
Definition: sql_auth_cache.h:622
GRANT_TABLE * table_hash_search(const char *host, const char *ip, const char *db, const char *user, const char *tname, bool exact)
Definition: sql_auth_cache.h:575
std::list< ACL_USER *, Acl_user_ptr_allocator > Acl_user_ptr_list
Definition: sql_auth_cache.h:505
std::unordered_map< std::string, Role_vertex_descriptor > Role_index_map
The datatype of the map between authids and graph vertex descriptors.
Definition: sql_auth_cache.h:625
boost::graph_traits< Granted_roles_graph >::degree_size_type degree_s_t
The type used for the number of edges incident to a vertex in the graph.
Definition: sql_auth_cache.h:629
GRANT_NAME * routine_hash_search(const char *host, const char *ip, const char *db, const char *user, const char *tname, bool proc, bool exact)
Definition: sql_auth_cache.h:566
collation_unordered_map< std::string, ACL_USER * > * acl_check_hosts
Definition: sql_auth_cache.cc:146
const size_t ACL_PREALLOC_SIZE
Definition: sql_auth_cache.h:512
Prealloced_array< ACL_PROXY_USER, ACL_PREALLOC_SIZE > * acl_proxy_users
Definition: sql_auth_cache.cc:131
GRANT_COLUMN * column_hash_search(GRANT_TABLE *t, const char *cname, size_t length)
Definition: sql_auth_cache.h:583
LF_HASH Acl_cache_internal
Definition: sql_auth_cache.h:683
static MEM_ROOT mem
Definition: sql_servers.cc:99
case opt name
Definition: sslopt-case.h:33
Definition: sql_auth_cache.h:492
Acl_cache_allocator< U > other
Definition: sql_auth_cache.h:493
Definition: m_ctype.h:385
Definition: lf.h:185
The MEM_ROOT is a simple arena, where allocations are carved out of larger blocks.
Definition: my_alloc.h:83
Definition: mysql_lex_string.h:40
Definition: mysql_time.h:82
Definition: table.h:1399
An instrumented mutex structure.
Definition: mysql_mutex_bits.h:50
Definition: sql_connect.h:41
unsigned int uint
Definition: uca9-dump.cc:75
Vio Lite.
SSL_type
Definition: violite.h:305