about summary refs log blame commit diff stats
path: root/prof.supp
blob: f894dc7570c5efd50835bd96a6b728e3ae4ccf0c (plain) (tree)
1
2
3
4
5
6
7
8
9
10
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
/*
 * preferences.h
 * vim: expandtab:ts=4:sts=4:sw=4
 *
 * Copyright (C) 2012 - 2019 James Booth <boothj5@gmail.com>
 * Copyright (C) 2019 - 2021 Michael Vetter <jubalh@iodoru.org>
 *
 * This file is part of Profanity.
 *
 * Profanity is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Profanity is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Profanity.  If not, see <https://www.gnu.org/licenses/>.
 *
 * In addition, as a special exception, the copyright holders give permission to
 * link the code of portions of this program with the OpenSSL library under
 * certain conditions as described in each individual source file, and
 * distribute linked combinations including the two.
 *
 * You must obey the GNU General Public License in all respects for all of the
 * code used other than OpenSSL. If you modify file(s) with this exception, you
 * may extend this exception to your version of the file(s), but you are not
 * obligated to do so. If you do not wish to do so, delete this exception
 * statement from your version. If you delete this exception statement from all
 * source files in the program, then also delete it here.
 *
 */

#ifndef CONFIG_PREFERENCES_H
#define CONFIG_PREFERENCES_H

#include "config.h"

#include <glib.h>

#define PREFS_MIN_LOG_SIZE 64
#define PREFS_MAX_LOG_SIZE 1048580

// represents all settings in .profrc
// each enum value is mapped to a group and key in .profrc (see preferences.c)
typedef enum {
    PREF_CLEAR_PERSIST_HISTORY,
    PREF_SPLASH,
    PREF_BEEP,
    PREF_VERCHECK,
    PREF_THEME,
    PREF_WINTITLE_SHOW,
    PREF_WINTITLE_GOODBYE,
    PREF_FLASH,
    PREF_TRAY,
    PREF_TRAY_READ,
    PREF_ADV_NOTIFY_DISCO_OR_VERSION,
    PREF_INTYPE,
    PREF_INTYPE_CONSOLE,
    PREF_HISTORY,
    PREF_CARBONS,
    PREF_RECEIPTS_SEND,
    PREF_RECEIPTS_REQUEST,
    PREF_REVEAL_OS,
    PREF_OCCUPANTS,
    PREF_OCCUPANTS_SIZE,
    PREF_OCCUPANTS_JID,
    PREF_OCCUPANTS_OFFLINE,
    PREF_ROSTER,
    PREF_ROSTER_SIZE,
    PREF_ROSTER_OFFLINE,
    PREF_ROSTER_RESOURCE,
    PREF_ROSTER_PRESENCE,
    PREF_ROSTER_STATUS,
    PREF_ROSTER_EMPTY,
    PREF_ROSTER_BY,
    PREF_ROSTER_ORDER,
    PREF_ROSTER_UNREAD,
    PREF_ROSTER_COUNT,
    PREF_ROSTER_COUNT_ZERO,
    PREF_ROSTER_PRIORITY,
    PREF_ROSTER_WRAP,
    PREF_ROSTER_RESOURCE_JOIN,
    PREF_ROSTER_CONTACTS,
    PREF_ROSTER_UNSUBSCRIBED,
    PREF_ROSTER_ROOMS,
    PREF_ROSTER_ROOMS_POS,
    PREF_ROSTER_ROOMS_BY,
    PREF_ROSTER_ROOMS_ORDER,
    PREF_ROSTER_ROOMS_UNREAD,
    PREF_ROSTER_ROOMS_SERVER,
    PREF_ROSTER_ROOMS_USE_AS_NAME,
    PREF_ROSTER_PRIVATE,
    PREF_MUC_PRIVILEGES,
    PREF_PRESENCE,
    PREF_WRAP,
    PREF_TIME_CONSOLE,
    PREF_TIME_CHAT,
    PREF_TIME_MUC,
    PREF_TIME_CONFIG,
    PREF_TIME_PRIVATE,
    PREF_TIME_XMLCONSOLE,
    PREF_TIME_STATUSBAR,
    PREF_TIME_LASTACTIVITY,
    PREF_STATUSES,
    PREF_STATUSES_CONSOLE,
    PREF_STATUSES_CHAT,
    PREF_STATUSES_MUC,
    PREF_STATES,
    PREF_OUTTYPE,
    PREF_NOTIFY_TYPING,
    PREF_NOTIFY_TYPING_CURRENT,
    PREF_NOTIFY_CHAT,
    PREF_NOTIFY_CHAT_CURRENT,
    PREF_NOTIFY_CHAT_TEXT,
    PREF_NOTIFY_ROOM,
    PREF_NOTIFY_ROOM_MENTION,
    PREF_NOTIFY_ROOM_TRIGGER,
    PREF_NOTIFY_ROOM_CURRENT,
    PREF_NOTIFY_ROOM_TEXT,
    PREF_NOTIFY_INVITE,
    PREF_NOTIFY_SUB,
    PREF_NOTIFY_MENTION_CASE_SENSITIVE,
    PREF_NOTIFY_MENTION_WHOLE_WORD,
    PREF_CHLOG,
    PREF_GRLOG,
    PREF_AUTOAWAY_CHECK,
    PREF_AUTOAWAY_MODE,
    PREF_AUTOAWAY_MESSAGE,
    PREF_AUTOXA_MESSAGE,
    PREF_CONNECT_ACCOUNT,
    PREF_DEFAULT_ACCOUNT,
    PREF_LOG_ROTATE,
    PREF_LOG_SHARED,
    PREF_OTR_LOG,
    PREF_OTR_POLICY,
    PREF_OTR_SENDFILE,
    PREF_RESOURCE_TITLE,
    PREF_RESOURCE_MESSAGE,
    PREF_INPBLOCK_DYNAMIC,
    PREF_ENC_WARN,
    PREF_TITLEBAR_MUC_TITLE_JID,
    PREF_TITLEBAR_MUC_TITLE_NAME,
    PREF_PGP_LOG,
    PREF_PGP_SENDFILE,
    PREF_TLS_CERTPATH,
    PREF_TLS_SHOW,
    PREF_LASTACTIVITY,
    PREF_CONSOLE_MUC,
    PREF_CONSOLE_PRIVATE,
    PREF_CONSOLE_CHAT,
    PREF_COLOR_NICK,
    PREF_COLOR_NICK_OWN,
    PREF_ROSTER_COLOR_NICK,
    PREF_OCCUPANTS_COLOR_NICK,
    PREF_BOOKMARK_INVITE,
    PREF_ROOM_LIST_CACHE,
    PREF_STATUSBAR_SHOW_NAME,
    PREF_STATUSBAR_SHOW_NUMBER,
    PREF_STATUSBAR_SHOW_READ,
    PREF_STATUSBAR_SELF,
    PREF_STATUSBAR_CHAT,
    PREF_STATUSBAR_ROOM,
    PREF_OMEMO_LOG,
    PREF_OMEMO_POLICY,
    PREF_OMEMO_TRUST_MODE,
    PREF_OCCUPANTS_WRAP,
    PREF_CORRECTION_ALLOW,
    PREF_AVATAR_CMD,
    PREF_SLASH_GUARD,
    PREF_MAM,
    PREF_URL_OPEN_CMD,
    PREF_URL_SAVE_CMD,
    PREF_COMPOSE_EDITOR,
    PREF_SILENCE_NON_ROSTER,
    PREF_NOTIFY_ROOM_OFFLINE,
} preference_t;

typedef struct prof_alias_t
{
    gchar* name;
    gchar* value;
} ProfAlias;

typedef struct prof_winplacement_t
{
    int titlebar_pos;
    int mainwin_pos;
    int statusbar_pos;
    int inputwin_pos;
} ProfWinPlacement;

void prefs_load(char* config_file);
void prefs_save(void);
void prefs_close(void);
void prefs_reload(void);

char* prefs_find_login(char* prefix);
void prefs_reset_login_search(void);

char* prefs_autocomplete_boolean_choice(const char* const prefix, gboolean previous, void* context);
void prefs_reset_boolean_choice(void);

char* prefs_autocomplete_room_trigger(const char* const prefix, gboolean previous, void* context);
void prefs_reset_room_trigger_ac(void);

gint prefs_get_gone(void);
void prefs_set_gone(gint value);

void prefs_set_notify_remind(gint period);
gint prefs_get_notify_remind(void);

void prefs_set_max_log_size(gint value);
gint prefs_get_max_log_size(void);
gint prefs_get_priority(void);
void prefs_set_reconnect(gint value);
gint prefs_get_reconnect(void);
void prefs_set_autoping(gint value);
gint prefs_get_autoping(void);
void prefs_set_autoping_timeout(gint value);
gint prefs_get_autoping_timeout(void);
gint prefs_get_inpblock(void);
void prefs_set_inpblock(gint value);

void prefs_set_statusbartabs(gint value);
gint prefs_get_statusbartabs(void);
void prefs_set_statusbartablen(gint value);
gint prefs_get_statusbartablen(void);

void prefs_set_occupants_size(gint value);
gint prefs_get_occupants_size(void);
void prefs_set_roster_size(gint value);
gint prefs_get_roster_size(void);

gint prefs_get_autoaway_time(void);
void prefs_set_autoaway_time(gint value);
gint prefs_get_autoxa_time(void);
void prefs_set_autoxa_time(gint value);

gchar** prefs_get_plugins(void);
void prefs_free_plugins(gchar** plugins);
void prefs_add_plugin(const char* const name);
void prefs_remove_plugin(const char* const name);

char* prefs_get_otr_char(void);
gboolean prefs_set_otr_char(char* ch);
char* prefs_get_pgp_char(void);
gboolean prefs_set_pgp_char(char* ch);
char* prefs_get_omemo_char(void);
gboolean prefs_set_omemo_char(char* ch);
// XEP-0373: OpenPGP for XMPP
char* prefs_get_ox_char(void);
gboolean prefs_set_ox_char(char* ch);

char* prefs_get_roster_header_char(void);
void prefs_set_roster_header_char(char* ch);
void prefs_clear_roster_header_char(void);
char* prefs_get_roster_contact_char(void);
void prefs_set_roster_contact_char(char* ch);
void prefs_clear_roster_contact_char(void);
char* prefs_get_roster_resource_char(void);
void prefs_set_roster_resource_char(char* ch);
void prefs_clear_roster_resource_char(void);
char* prefs_get_roster_private_char(void);
void prefs_set_roster_private_char(char* ch);
void prefs_clear_roster_private_char(void);
char* prefs_get_roster_room_char(void);
void prefs_set_roster_room_char(char* ch);
void prefs_clear_roster_room_char(void);
char* prefs_get_roster_room_private_char(void);
void prefs_set_roster_room_private_char(char* ch);
void prefs_clear_roster_room_private_char(void);
char* prefs_get_occupants_char(void);
void prefs_set_occupants_char(char* ch);
void prefs_clear_occupants_charpre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
# profanity suppressions file
#
# I recommend to use valgrind like this:
# G_DEBUG=gc-friendly G_SLICE=always-malloc valgrind --leak-check=full --log-file=out ./profanity
#
# This file is a combination of our own rules and
# * the glib2 suppressions file that usually can be found at /usr/share/glib-2.0/valgrind/glib.supp
# * python suppressions file from http://svn.python.org/projects/python/trunk/Misc/valgrind-python.supp
#

{
  _dl_init
  Memcheck:Leak
  ...
  fun:_dl_init
  ...
}

# glib

{
  glib
  Memcheck:Leak
  ...
  fun:start_thread
  fun:clone
}

## glib 2.60.4 suppressions file:

# GLib Valgrind suppressions file
#
# This provides a list of suppressions for all of GLib (including GIO), for all
# Valgrind tools (memcheck, drd, helgrind, etc.) for the false positives and
# deliberate one-time leaks which GLib causes to be reported when running under
# Valgrind.
#
# When running an application which links to GLib under Valgrind, you can pass
# this suppression file to Valgrind using --suppressions=/path/to/glib-2.0.supp.
#
# http://valgrind.org/docs/manual/manual-core.html#manual-core.suppress
#
# Note that there is currently no way for Valgrind to load this automatically
# (https://bugs.kde.org/show_bug.cgi?id=160905), so the best GLib can currently
# do is to install this file as part of its development package.
#
# This file should be updated if GLib introduces a new deliberate one-time leak,
# or another false race positive in Valgrind: please file bugs at:
#
# https://gitlab.gnome.org/GNOME/glib/issues/new

{
	gnutls-init-calloc
	Memcheck:Leak
	fun:calloc
	...
	fun:gtls_gnutls_init
}

{
	gnutls-init-realloc
	Memcheck:Leak
	fun:realloc
	...
	fun:gtls_gnutls_init
}

{
	g-tls-backend-gnutls-init
	Memcheck:Leak
	fun:g_once_impl
	fun:g_tls_backend_gnutls_init
}

{
	p11-tokens-init
	Memcheck:Leak
	fun:calloc
	...
	fun:create_tokens_inlock
	fun:initialize_module_inlock_reentrant
}

# One-time allocation from libc for getpwnam() results
{
	g-local-vfs-getpwnam
	Memcheck:Leak
	fun:malloc
	...
	fun:getpwnam
	fun:g_local_vfs_parse_name
}

{
	glib-init-malloc
	Memcheck:Leak
	fun:malloc
	...
	fun:g_quark_init
	...
	fun:glib_init_ctor
}

{
	glib-init-calloc
	Memcheck:Leak
	fun:calloc
	...
	fun:g_quark_init
	...
	fun:glib_init_ctor
}

{
	gobject-init-malloc
	Memcheck:Leak
	fun:malloc
	...
	fun:gobject_init_ctor
}

{
	gobject-init-realloc
	Memcheck:Leak
	fun:realloc
	...
	fun:gobject_init_ctor
}

{
	gobject-init-calloc
	Memcheck:Leak
	fun:calloc
	...
	fun:gobject_init_ctor
}

{
	g-type-register-dynamic
	Memcheck:Leak
	fun:malloc
	...
	fun:g_type_register_dynamic
}

{
	g-type-register-static
	Memcheck:Leak
	fun:malloc
	...
	fun:g_type_register_static
}

{
	g-type-register-static-realloc
	Memcheck:Leak
	fun:realloc
	...
	fun:g_type_register_static
}

{
	g-type-register-static-calloc
	Memcheck:Leak
	fun:calloc
	...
	fun:g_type_register_static
}

{
	g-type-add-interface-dynamic
	Memcheck:Leak
	fun:malloc
	...
	fun:g_type_add_interface_dynamic
}

{
	g-type-add-interface-static
	Memcheck:Leak
	fun:malloc
	...
	fun:g_type_add_interface_static
}

{
	g-test-rand-init
	Memcheck:Leak
	fun:calloc
	...
	fun:g_rand_new_with_seed_array
	fun:test_run_seed
	...
	fun:g_test_run
}

{
	g-test-rand-init2
	Memcheck:Leak
	fun:calloc
	...
	fun:g_rand_new_with_seed_array
	...
	fun:get_global_random
	...
	fun:g_test_init
}

{
	g-quark-table-new
	Memcheck:Leak
	fun:g_hash_table_new
	...
	fun:quark_new
}

{
	g-quark-table-resize
	Memcheck:Leak
	fun:g_hash_table_resize
	...
	fun:quark_new
}

{
	g-type-interface-init
	Memcheck:Leak
	fun:malloc
	...
	fun:type_iface_vtable_base_init_Wm
}

{
	g-type-class-init-calloc
	Memcheck:Leak
	fun:calloc
	...
	fun:g_type_create_instance
	...
	fun:type_class_init_Wm
}

{
	g-type-class-init
	Memcheck:Leak
	fun:g_type_create_instance
	...
	fun:type_class_init_Wm
}

{
	g-io-module-default-singleton-malloc
	Memcheck:Leak
	fun:malloc
	...
	fun:g_type_create_instance
	...
	fun:_g_io_module_get_default
}

{
	g-io-module-default-singleton-calloc
	Memcheck:Leak
	fun:calloc
	...
	fun:g_type_create_instance
	...
	fun:_g_io_module_get_default
}

# This one seems to show up sometimes with g_type_create_instance() at the top
# of the stack, as well.
{
	g-io-module-default-singleton
	Memcheck:Leak
	fun:g_type_create_instance
	...
	fun:_g_io_module_get_default
}

{
	g-io-module-default-singleton-module
	Memcheck:Leak
	fun:calloc
	...
	fun:g_module_open
	...
	fun:_g_io_module_get_default
}

{
	g-io-module-default-singleton-name
	Memcheck:Leak
	fun:malloc
	...
	fun:g_strdup
	...
	fun:_g_io_module_get_default*
}

{
	g-get-language-names-malloc
	Memcheck:Leak
	fun:malloc
	...
	fun:g_get_language_names
}

{
	g-get-language-names-calloc
	Memcheck:Leak
	fun:calloc
	...
	fun:g_get_language_names
}

{
	g-static-mutex
	Memcheck:Leak
	fun:malloc
	...
	fun:g_static_mutex_get_mutex_impl
}

{
	g-system-thread-init
	Memcheck:Leak
	fun:calloc
	...
	fun:g_system_thread_new
}

{
	g-io-module-default-proxy-resolver-gnome
	Memcheck:Leak
	fun:calloc
	...
	fun:g_proxy_resolver_gnome_init
	...
	fun:_g_io_module_get_default
}

# One-time getaddrinfo() configuration loading
{
	g-threaded-resolver-getaddrinfo-config
	Memcheck:Leak
	fun:malloc
	...
	fun:__resolv_conf_allocate
	...
	fun:getaddrinfo
	fun:do_lookup_by_name
}

# memcheck checks that the third argument to ioctl() is a valid pointer, but
# some ioctls use that argument as an integer
{
   ioctl-with-non-pointer-param
   Memcheck:Param
   ioctl(generic)
   fun:ioctl
   fun:btrfs_reflink_with_progress
}

{
	g-private-get
	drd:ConflictingAccess
	fun:g_private_get
}
{
	g-private-get-helgrind
	Helgrind:Race
	fun:g_private_get
}


{
	g-private-set
	drd:ConflictingAccess
	fun:g_private_set
}
{
	g-private-set-helgrind
	Helgrind:Race
	fun:g_private_set
}

{
	g-type-construct-free
	drd:ConflictingAccess
	fun:g_type_free_instance
}
{
	g-type-construct-free-helgrind
	Helgrind:Race
	fun:g_type_free_instance
}

{
	g-variant-unref
	drd:ConflictingAccess
	fun:g_variant_unref
}
{
	g-variant-unref-helgrind
	Helgrind:Race
	fun:g_variant_unref
}

{
	g-unix-signals-main
	drd:ConflictingAccess
	fun:_g_main_create_unix_signal_watch
}
{
	g-unix-signals-dispatch
	drd:ConflictingAccess
	...
	fun:dispatch_unix_signals*
}
{
	g-unix-signals-dispatch-helgrind
	Helgrind:Race
	...
	fun:dispatch_unix_signals*
}
{
	g-unix-signals-other
	drd:ConflictingAccess
	fun:g_unix_signal_watch*
}
{
	g-unix-signals-other-helgrind
	Helgrind:Race
	fun:g_unix_signal_watch*
}
{
	g-unix-signals-handler
	drd:ConflictingAccess
	fun:g_unix_signal_handler*
}
{
	g-unix-signals-handler-helgrind
	Helgrind:Race
	fun:g_unix_signal_handler*
}
{
	g-unix-signals-worker
	drd:ConflictingAccess
	fun:glib_worker_main
}
{
	g-unix-signals-worker-helgrind
	Helgrind:Race
	fun:glib_worker_main
}

{
	g-wakeup-acknowledge
	drd:ConflictingAccess
	fun:read
	fun:g_wakeup_acknowledge
}

{
	g-type-fundamental
	drd:ConflictingAccess
	fun:g_type_fundamental
}
{
	g-type-fundamental-helgrind
	Helgrind:Race
	fun:g_type_fundamental
}
{
	g-type-class-peek-static
	drd:ConflictingAccess
	fun:g_type_class_peek_static
}
{
	g-type-class-peek-static-helgrind
	Helgrind:Race
	fun:g_type_class_peek_static
}
{
	g-type-is-a
	drd:ConflictingAccess
	...
	fun:g_type_is_a
}
{
	g-type-is-a-helgrind
	Helgrind:Race
	...
	fun:g_type_is_a
}

{
	g-inet-address-get-type
	drd:ConflictingAccess
	fun:g_inet_address_get_type
}
{
	g-inet-address-get-type-helgrind
	Helgrind:Race
	fun:g_inet_address_get_type
}

# From: https://github.com/fredericgermain/valgrind/blob/master/glibc-2.X-drd.supp
{
	drd-libc-stdio
	drd:ConflictingAccess
	obj:*/lib*/libc-*
}
{
	drd-libc-recv
	drd:ConflictingAccess
	fun:recv
}
{
	drd-libc-send
	drd:ConflictingAccess
	fun:send
}

# GSources do an opportunistic ref count check
{
	g-source-set-ready-time
	drd:ConflictingAccess
	fun:g_source_set_ready_time
}
{
	g-source-set-ready-time-helgrind
	Helgrind:Race
	fun:g_source_set_ready_time
}

{
	g-source-iter-next
	Helgrind:Race
	fun:g_source_iter_next
	fun:g_main_context_*
	fun:g_main_context_iterate
}

{
	g-object-instance-private
	drd:ConflictingAccess
	fun:*_get_instance_private
}
{
	g-object-instance-private-helgrind
	Helgrind:Race
	fun:*_get_instance_private
}

# GLib legitimately calls pthread_cond_signal without a mutex held
{
	g-task-thread-complete
	drd:CondErr
	...
	fun:g_cond_signal
	fun:g_task_thread_complete
}
{
	g-task-thread-complete
	Helgrind:Misc
	...
	fun:g_cond_signal
	fun:g_task_thread_complete
}

# False positive, but I can't explain how (FIXME)
{
	g-task-cond
	Helgrind:Misc
	...
	fun:g_cond_clear
	fun:g_task_finalize
}

# Real race, but is_cancelled() is an opportunistic function anyway
{
	g-cancellable-is-cancelled
	Helgrind:Race
	fun:g_cancellable_is_cancelled
}

# False positive
{
	g-main-context-cond
	Helgrind:Misc
	...
	fun:g_cond_clear
	fun:g_main_context_unref
}

# False positives
{
	g-source-unlocked
	Helgrind:Race
	fun:g_source_*_unlocked
}
{
	g-source-internal
	Helgrind:Race
	fun:g_source_*_internal
}

# False positive
{
	g_object_real_dispose
	Helgrind:Race
	fun:g_object_real_dispose
}

# False positive
{
	g_object_new_valist
	Helgrind:Race
	...
	fun:g_object_new_valist
}

# g_set_user_dirs() deliberately leaks the previous cached g_get_user_*() values.
{
	g_set_user_dirs_str
	Memcheck:Leak
	fun:malloc
	...
	fun:set_str_if_different
	fun:g_set_user_dirs
}

# g_set_user_dirs() deliberately leaks the previous cached g_get_user_*() values.
{
	g_set_user_dirs_strv
	Memcheck:Leak
	fun:malloc
	...
	fun:set_strv_if_different
	fun:g_set_user_dirs
}

# g_get_system_data_dirs() caches a one-time allocation
{
	g_get_system_data_dirs
	Memcheck:Leak
	fun:malloc
	...
	fun:g_build_system_data_dirs
	fun:g_get_system_data_dirs
}

# g_get_user_data_dir() caches a one-time allocation
{
	g_get_user_data_dir
	Memcheck:Leak
	fun:realloc
	...
	fun:g_build_user_data_dir
	fun:g_get_user_data_dir
}

# gdesktopappinfo.c caches a one-time allocation global table of @desktop_file_dirs.
{
	desktop_file_dirs_malloc
	Memcheck:Leak
	fun:malloc
	...
	fun:desktop_file_dirs_lock
}

# gdesktopappinfo.c caches a one-time allocation global table of @desktop_file_dirs.
{
	desktop_file_dirs_realloc
	Memcheck:Leak
	fun:realloc
	...
	fun:desktop_file_dirs_lock
}

# gdesktopappinfo.c caches a one-time allocation global table of @desktop_file_dirs.
{
	desktop_file_dir_unindexed_setup_search
	Memcheck:Leak
	fun:malloc
	...
	fun:desktop_file_dir_unindexed_setup_search
	fun:desktop_file_dir_unindexed_setup_search
}

# g_io_extension_point_register() caches a one-time allocation global table of @extension_points.
{
	g_io_extension_point_register
	Memcheck:Leak
	fun:calloc
	...
	fun:g_io_extension_point_register
}

# g_strerror() caches a one-time allocation global table of @errors.
{
	g_strerror
	Memcheck:Leak
	fun:malloc
	...
	fun:g_locale_to_utf8
	fun:g_strerror
}

# g_socket_connection_factory_register_type() caches a one-time allocation global table of @connection_types.
{
	g_socket_connection_factory_register_type
	Memcheck:Leak
	fun:calloc
	...
	fun:g_socket_connection_factory_register_type
}

# g_dbus_error_quark() never unregisters itself as a GDBusError domain, as it’s always available
{
	g_dbus_error_quark
	Memcheck:Leak
	fun:calloc
	...
	fun:g_dbus_error_register_error_domain
	fun:g_dbus_error_quark
}

# Thread-private data allocated once per thread
{
	g_private_set_alloc0
	Memcheck:Leak
	fun:malloc
	...
	fun:g_private_set_alloc0
}

# Thread-private GMainContext stack
{
	g_main_context_push_thread_default
	Memcheck:Leak
	fun:malloc
	...
	fun:g_queue_new
	fun:g_main_context_push_thread_default
}

# One-time allocations for #GFileInfo attribute cache
{
	g_file_info_attribute_cache
	Memcheck:Leak
	fun:malloc
	...
	fun:ensure_attribute_hash
	...
	fun:g_file_*
}
{
	g_file_info_attribute_cache2
	Memcheck:Leak
	fun:calloc
	...
	fun:ensure_attribute_hash
	...
	fun:g_file_*
}
{
	g_file_info_attribute_cache3
	Memcheck:Leak
	fun:malloc
	...
	fun:lookup_namespace
	...
	fun:g_file_*
}
{
	g_file_info_attribute_cache4
	Memcheck:Leak
	fun:calloc
	...
	fun:lookup_namespace
	...
	fun:g_file_*
}

## python suppressions file:
#
# This is a valgrind suppression file that should be used when using valgrind.
#
#  Here's an example of running valgrind:
#
#	cd python/dist/src
#	valgrind --tool=memcheck --suppressions=Misc/valgrind-python.supp \
#		./python -E -tt ./Lib/test/regrtest.py -u bsddb,network
#
# You must edit Objects/obmalloc.c and uncomment Py_USING_MEMORY_DEBUGGER
# to use the preferred suppressions with Py_ADDRESS_IN_RANGE.
#
# If you do not want to recompile Python, you can uncomment
# suppressions for PyObject_Free and PyObject_Realloc.
#
# See Misc/README.valgrind for more information.

# all tool names: Addrcheck,Memcheck,cachegrind,helgrind,massif
{
   ADDRESS_IN_RANGE/Invalid read of size 4
   Memcheck:Addr4
   fun:Py_ADDRESS_IN_RANGE
}

{
   ADDRESS_IN_RANGE/Invalid read of size 4
   Memcheck:Value4
   fun:Py_ADDRESS_IN_RANGE
}

{
   ADDRESS_IN_RANGE/Invalid read of size 8 (x86_64 aka amd64)
   Memcheck:Value8
   fun:Py_ADDRESS_IN_RANGE
}

{
   ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value
   Memcheck:Cond
   fun:Py_ADDRESS_IN_RANGE
}

#
# Leaks (including possible leaks)
#    Hmmm, I wonder if this masks some real leaks.  I think it does.
#    Will need to fix that.
#

{
   Suppress leaking the GIL.  Happens once per process, see comment in ceval.c.
   Memcheck:Leak
   fun:malloc
   fun:PyThread_allocate_lock
   fun:PyEval_InitThreads
}

{
   Suppress leaking the GIL after a fork.
   Memcheck:Leak
   fun:malloc
   fun:PyThread_allocate_lock
   fun:PyEval_ReInitThreads
}

{
   Suppress leaking the autoTLSkey.  This looks like it shouldn't leak though.
   Memcheck:Leak
   fun:malloc
   fun:PyThread_create_key
   fun:_PyGILState_Init
   fun:Py_InitializeEx
   fun:Py_Main
}

{
   Hmmm, is this a real leak or like the GIL?
   Memcheck:Leak
   fun:malloc
   fun:PyThread_ReInitTLS
}

{
   Handle PyMalloc confusing valgrind (possibly leaked)
   Memcheck:Leak
   fun:realloc
   fun:_PyObject_GC_Resize
   fun:COMMENT_THIS_LINE_TO_DISABLE_LEAK_WARNING
}

{
   Handle PyMalloc confusing valgrind (possibly leaked)
   Memcheck:Leak
   fun:malloc
   fun:_PyObject_GC_New
   fun:COMMENT_THIS_LINE_TO_DISABLE_LEAK_WARNING
}

{
   Handle PyMalloc confusing valgrind (possibly leaked)
   Memcheck:Leak
   fun:malloc
   fun:_PyObject_GC_NewVar
   fun:COMMENT_THIS_LINE_TO_DISABLE_LEAK_WARNING
}

#
# Non-python specific leaks
#

{
   Handle pthread issue (possibly leaked)
   Memcheck:Leak
   fun:calloc
   fun:allocate_dtv
   fun:_dl_allocate_tls_storage
   fun:_dl_allocate_tls
}

{
   Handle pthread issue (possibly leaked)
   Memcheck:Leak
   fun:memalign
   fun:_dl_allocate_tls_storage
   fun:_dl_allocate_tls
}

###{
###   ADDRESS_IN_RANGE/Invalid read of size 4
###   Memcheck:Addr4
###   fun:PyObject_Free
###}
###
###{
###   ADDRESS_IN_RANGE/Invalid read of size 4
###   Memcheck:Value4
###   fun:PyObject_Free
###}
###
###{
###   ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value
###   Memcheck:Cond
###   fun:PyObject_Free
###}

###{
###   ADDRESS_IN_RANGE/Invalid read of size 4
###   Memcheck:Addr4
###   fun:PyObject_Realloc
###}
###
###{
###   ADDRESS_IN_RANGE/Invalid read of size 4
###   Memcheck:Value4
###   fun:PyObject_Realloc
###}
###
###{
###   ADDRESS_IN_RANGE/Conditional jump or move depends on uninitialised value
###   Memcheck:Cond
###   fun:PyObject_Realloc
###}

###
### All the suppressions below are for errors that occur within libraries
### that Python uses.  The problems to not appear to be related to Python's
### use of the libraries.
###

{
   Generic ubuntu ld problems
   Memcheck:Addr8
   obj:/lib/ld-2.4.so
   obj:/lib/ld-2.4.so
   obj:/lib/ld-2.4.so
   obj:/lib/ld-2.4.so
}

{
   Generic gentoo ld problems
   Memcheck:Cond
   obj:/lib/ld-2.3.4.so
   obj:/lib/ld-2.3.4.so
   obj:/lib/ld-2.3.4.so
   obj:/lib/ld-2.3.4.so
}

{
   DBM problems, see test_dbm
   Memcheck:Param
   write(buf)
   fun:write
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   fun:dbm_close
}

{
   DBM problems, see test_dbm
   Memcheck:Value8
   fun:memmove
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   fun:dbm_store
   fun:dbm_ass_sub
}

{
   DBM problems, see test_dbm
   Memcheck:Cond
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   fun:dbm_store
   fun:dbm_ass_sub
}

{
   DBM problems, see test_dbm
   Memcheck:Cond
   fun:memmove
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   obj:/usr/lib/libdb1.so.2
   fun:dbm_store
   fun:dbm_ass_sub
}

{
   GDBM problems, see test_gdbm
   Memcheck:Param
   write(buf)
   fun:write
   fun:gdbm_open

}

{
   ZLIB problems, see test_gzip
   Memcheck:Cond
   obj:/lib/libz.so.1.2.3
   obj:/lib/libz.so.1.2.3
   fun:deflate
}

{
   Avoid problems w/readline doing a putenv and leaking on exit
   Memcheck:Leak
   fun:malloc
   fun:xmalloc
   fun:sh_set_lines_and_columns
   fun:_rl_get_screen_size
   fun:_rl_init_terminal_io
   obj:/lib/libreadline.so.4.3
   fun:rl_initialize
}

###
### These occur from somewhere within the SSL, when running
###  test_socket_sll.  They are too general to leave on by default.
###
###{
###   somewhere in SSL stuff
###   Memcheck:Cond
###   fun:memset
###}
###{
###   somewhere in SSL stuff
###   Memcheck:Value4
###   fun:memset
###}
###
###{
###   somewhere in SSL stuff
###   Memcheck:Cond
###   fun:MD5_Update
###}
###
###{
###   somewhere in SSL stuff
###   Memcheck:Value4
###   fun:MD5_Update
###}

#
# All of these problems come from using test_socket_ssl
#
{
   from test_socket_ssl
   Memcheck:Cond
   fun:BN_bin2bn
}

{
   from test_socket_ssl
   Memcheck:Cond
   fun:BN_num_bits_word
}

{
   from test_socket_ssl
   Memcheck:Value4
   fun:BN_num_bits_word
}

{
   from test_socket_ssl
   Memcheck:Cond
   fun:BN_mod_exp_mont_word
}

{
   from test_socket_ssl
   Memcheck:Cond
   fun:BN_mod_exp_mont
}

{
   from test_socket_ssl
   Memcheck:Param
   write(buf)
   fun:write
   obj:/usr/lib/libcrypto.so.0.9.7
}

{
   from test_socket_ssl
   Memcheck:Cond
   fun:RSA_verify
}

{
   from test_socket_ssl
   Memcheck:Value4
   fun:RSA_verify
}

{
   from test_socket_ssl
   Memcheck:Value4
   fun:DES_set_key_unchecked
}

{
   from test_socket_ssl
   Memcheck:Value4
   fun:DES_encrypt2
}

{
   from test_socket_ssl
   Memcheck:Cond
   obj:/usr/lib/libssl.so.0.9.7
}

{
   from test_socket_ssl
   Memcheck:Value4
   obj:/usr/lib/libssl.so.0.9.7
}

{
   from test_socket_ssl
   Memcheck:Cond
   fun:BUF_MEM_grow_clean
}

{
   from test_socket_ssl
   Memcheck:Cond
   fun:memcpy
   fun:ssl3_read_bytes
}

{
   from test_socket_ssl
   Memcheck:Cond
   fun:SHA1_Update
}

{
   from test_socket_ssl
   Memcheck:Value4
   fun:SHA1_Update
}


# gcrypt initialization
{
  gcry_rngcsprng_randomize
  Memcheck:Leak
  fun:malloc
  ...
  fun:omemo_crypto_init
  ...
}