summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorthestig@chromium.org <thestig@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-12-15 08:38:40 +0000
committerthestig@chromium.org <thestig@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-12-15 08:38:40 +0000
commitcc9d02709f82d0da8d846f1fc0886c562fd0c091 (patch)
treedf70791e6bd93c4385a1b9578c2e23fee084e5f0
parent26a645902ab659f2365e4cbd4a739e2ba8a9ce94 (diff)
downloadchromium_src-cc9d02709f82d0da8d846f1fc0886c562fd0c091.zip
chromium_src-cc9d02709f82d0da8d846f1fc0886c562fd0c091.tar.gz
chromium_src-cc9d02709f82d0da8d846f1fc0886c562fd0c091.tar.bz2
Valgrind: Add test script and suppression files for Valgrinding win32 executables in Wine on Linux.
These files are from winezeug.googlecode.com @ r884. TBR=dank BUG=none TEST=none Review URL: http://codereview.chromium.org/500012 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@34538 0039d316-1c4b-4281-b951-d872f2087c98
-rwxr-xr-xtools/wine_valgrind/chrome_tests.sh414
-rw-r--r--tools/wine_valgrind/chromium-valgrind-suppressions92
-rw-r--r--tools/wine_valgrind/valgrind-suppressions1076
3 files changed, 1582 insertions, 0 deletions
diff --git a/tools/wine_valgrind/chrome_tests.sh b/tools/wine_valgrind/chrome_tests.sh
new file mode 100755
index 0000000..5b6f330
--- /dev/null
+++ b/tools/wine_valgrind/chrome_tests.sh
@@ -0,0 +1,414 @@
+#!/bin/sh
+# chromium-runtests.sh [testsuite]
+# Script to run a respectable subset of Chromium's test suite
+# (excepting parts that run the browser itself, and excepting layout tests).
+# Run from parent of src directory.
+# By default, runs all test suites. If you specify one testsuite
+# (e.g. base_unittests), it only runs that one.
+#
+# Chromium's test suite uses gtest, so each executable obeys the options
+# documented in the wiki at http://code.google.com/p/googletest
+# In particular, you can run a single test with --gtest_filter=Foo.Bar,
+# and get a full list of tests in each exe with --gtest_list_tests.
+#
+# Before running the tests, regardless of operating system:
+# 1) Make sure your system has at least one printer installed,
+# or printing_unittests and unit_tests' PrintJobTest.SimplePrint
+# will fail. A fake printer is fine, nothing will be printed.
+# 2) Install the test cert as described at
+# http://bugs.winehq.org/show_bug.cgi?id=20370
+# or net_unittests' HTTPSRequestTest.*, SSLClientSocketTest.*
+# and others may fail.
+#
+# Chrome doesn't start without the --no-sandbox
+# option in wine, so skip test suites that invoke it directly until I
+# figure out how to jam that in there.
+
+usage() {
+ cat <<_EOF_
+Usage: sh chromium-runtests.sh [--options] [suite ...]
+Runs chromium tests on Windows or Wine.
+Options:
+ --individual - run tests individually
+ --groups - run tests grouped by their major gtest name
+ --gtest_filter X - only run the tests matching X
+ --target X - test with Debug or Release binaries, default to Debug
+ --just-crashes - run only tests epected to crash
+ --just-fails - run only tests epected to fail
+ --just-flaky - run only tests epected to fail sometimes
+ --just-hangs - run only tests epected to hang
+ --list-failures - show list of expected failures
+ --logfiles - log to one file per test, in logs subdir, rather than stdout
+ --loops N - run tests N times
+ -n - dry run, only show what will be done
+ --suppression_dir - directory containing the suppression files
+ --timeout N - let each executable run for N seconds (default varies)
+ --used-suppressions - extract histogram of used valgrind suppressions from current contents of logs directory
+ --valgrind - run the tests under valgrind
+ --vnc N - run the tests inside a vnc server running on display N
+ --winedebug chan - e.g. --windebug +relay,+seh
+Currently supported suites:
+app_unittests base_unittests courgette_unittests googleurl_unittests
+ipc_tests media_unittests net_unittests printing_unittests sbox_unittests
+sbox_validation_tests setup_unittests tcmalloc_unittests unit_tests
+Default is to run all suites. It takes about five minutes to run them all
+together, 22 minutes to run them all individually.
+_EOF_
+ exit 1
+}
+
+# Tests, grouped by how long they take to run
+# Skip ones that require chrome itself for the moment
+SUITES_1="googleurl_unittests printing_unittests sbox_validation_tests setup_unittests"
+#SUITES_10="app_unittests courgette_unittests ipc_tests reliability_tests sbox_integration_tests sbox_unittests tab_switching_test tcmalloc_unittests url_fetch_test"
+SUITES_10="app_unittests courgette_unittests ipc_tests sbox_unittests tcmalloc_unittests"
+#SUITES_100="automated_ui_tests installer_util_unittests media_unittests nacl_ui_tests net_perftests net_unittests plugin_tests sync_unit_tests"
+SUITES_100="media_unittests net_unittests"
+#SUITES_1000="base_unittests interactive_ui_tests memory_test page_cycler_tests perf_tests test_shell_tests unit_tests"
+SUITES_1000="base_unittests unit_tests"
+#SUITES_10000="ui_tests startup_tests"
+
+THE_VALGRIND_CMD="/usr/local/valgrind-10903/bin/valgrind \
+--gen-suppressions=all \
+--leak-check=full \
+--num-callers=25 \
+--show-possible=no \
+--smc-check=all \
+--trace-children=yes \
+--track-origins=yes \
+-v \
+--workaround-gcc296-bugs=yes \
+"
+
+reduce_verbosity() {
+ # Filter out valgrind's extra -v output except for the 'used_suppression' lines
+ # Also remove extra carriage returns
+ awk '!/^--/ || /^--.*used_suppression:/' | tr -d '\015'
+}
+
+# Filter out known failures
+# Avoid tests that hung, failed, or crashed on windows in Dan's reference run,
+# or which fail in a way we don't care about on Wine,
+# or which hang or crash on wine in a way that keeps other tests from running.
+# Also lists url of bug report, if any.
+# Format with
+# sh chromium-runtests.sh --list-failures | sort | awk '{printf("%-21s %-20s %-52s %s\n", $1, $2, $3, $4);}'
+
+list_known_failures() {
+cat <<_EOF_
+app_unittests crash-valgrind IconUtilTest.TestCreateSkBitmapFromHICON http://bugs.winehq.org/show_bug.cgi?id=20634, not a bug, need to figure out how to handle DIB faults
+base_unittests hang EtwTraceControllerTest.EnableDisable http://bugs.winehq.org/show_bug.cgi?id=20946, advapi32.ControlTrace() not yet implemented
+base_unittests crash EtwTraceConsumer*Test.* http://bugs.winehq.org/show_bug.cgi?id=20946, advapi32.OpenTrace() unimplemented
+base_unittests crash EtwTraceProvider*Test.* http://bugs.winehq.org/show_bug.cgi?id=20946, advapi32.RegisterTraceGuids() unimplemented
+base_unittests dontcare BaseWinUtilTest.FormatMessageW
+base_unittests dontcare FileUtilTest.CountFilesCreatedAfter
+base_unittests dontcare FileUtilTest.GetFileCreationLocalTime
+base_unittests dontcare PEImageTest.EnumeratesPE Alexandre triaged
+base_unittests dontcare-winfail TimeTicks.HighResNow fails if run individually on windows
+base_unittests dontcare WMIUtilTest.*
+base_unittests fail HMACTest.HMACObjectReuse http://bugs.winehq.org/show_bug.cgi?id=20340
+base_unittests fail HMACTest.HmacSafeBrowsingResponseTest http://bugs.winehq.org/show_bug.cgi?id=20340
+base_unittests fail HMACTest.RFC2202TestCases http://bugs.winehq.org/show_bug.cgi?id=20340
+base_unittests fail_wine_vmware RSAPrivateKeyUnitTest.ShortIntegers
+base_unittests flaky-dontcare StatsTableTest.MultipleProcesses http://bugs.winehq.org/show_bug.cgi?id=20606
+base_unittests hang-dontcare DirectoryWatcherTest.*
+base_unittests hang-valgrind JSONReaderTest.Reading # not really a hang, takes 400 seconds
+base_unittests hang-valgrind RSAPrivateKeyUnitTest.InitRandomTest # not really a hang, takes 300 seconds
+base_unittests hang-valgrind TimerTest.RepeatingTimer*
+base_unittests hang-valgrind TimeTicks.WinRollover # not really a hang, takes 1000 seconds
+ipc_tests flaky IPCChannelTest.ChannelTest http://bugs.winehq.org/show_bug.cgi?id=20628
+ipc_tests flaky IPCChannelTest.SendMessageInChannelConnected http://bugs.winehq.org/show_bug.cgi?id=20628
+ipc_tests hang IPCSyncChannelTest.* http://bugs.winehq.org/show_bug.cgi?id=20390
+media_unittests crash FFmpegGlueTest.OpenClose
+media_unittests crash FFmpegGlueTest.Read
+media_unittests crash FFmpegGlueTest.Seek
+media_unittests crash FFmpegGlueTest.Write
+media_unittests fail_wine_vmware WinAudioTest.PCMWaveStreamTripleBuffer
+media_unittests hang-valgrind WinAudioTest.PCMWaveSlowSource
+net_unittests fail SSLClientSocketTest.Read_Interrupted http://bugs.winehq.org/show_bug.cgi?id=20748
+sbox_unittests fail JobTest.ProcessInJob
+sbox_unittests fail JobTest.TestCreation
+sbox_unittests fail JobTest.TestDetach
+sbox_unittests fail JobTest.TestExceptions
+sbox_unittests fail RestrictedTokenTest.AddAllSidToRestrictingSids
+sbox_unittests fail RestrictedTokenTest.AddMultipleRestrictingSids
+sbox_unittests fail RestrictedTokenTest.AddRestrictingSid
+sbox_unittests fail RestrictedTokenTest.AddRestrictingSidCurrentUser
+sbox_unittests fail RestrictedTokenTest.AddRestrictingSidLogonSession
+sbox_unittests fail RestrictedTokenTest.DefaultDacl
+sbox_unittests fail RestrictedTokenTest.DeleteAllPrivileges
+sbox_unittests fail RestrictedTokenTest.DeleteAllPrivilegesException
+sbox_unittests fail RestrictedTokenTest.DeletePrivilege
+sbox_unittests fail RestrictedTokenTest.DenyOwnerSid
+sbox_unittests fail RestrictedTokenTest.DenySid
+sbox_unittests fail RestrictedTokenTest.DenySids
+sbox_unittests fail RestrictedTokenTest.DenySidsException
+sbox_unittests fail RestrictedTokenTest.ResultToken
+sbox_unittests fail ServiceResolverTest.PatchesServices
+sbox_unittests flaky IPCTest.ClientFastServer
+sbox_validation_tests fail ValidationSuite.*
+unit_tests crash BlacklistManagerTest.* http://crbug.com/27726
+unit_tests crash SafeBrowsingProtocolParsingTest.TestGetHashWithMac http://bugs.winehq.org/show_bug.cgi?id=20340
+unit_tests crash-valgrind DnsMasterTest.MassiveConcurrentLookupTest
+unit_tests crash-valgrind NullModelTableViewTest.* http://bugs.winehq.org/show_bug.cgi?id=20553
+unit_tests crash-valgrind RenderViewTest.OnPrintPageAsBitmap http://bugs.winehq.org/show_bug.cgi?id=20657 (for wine oom)
+unit_tests crash-valgrind TableViewTest.* http://bugs.winehq.org/show_bug.cgi?id=20553
+unit_tests dontcare-hangwin UtilityProcessHostTest.ExtensionUnpacker
+unit_tests dontcare SpellCheckTest.SpellCheckText
+unit_tests fail EncryptorTest.EncryptionDecryption http://bugs.winehq.org/show_bug.cgi?id=20495
+unit_tests fail EncryptorTest.String16EncryptionDecryption http://bugs.winehq.org/show_bug.cgi?id=20495
+unit_tests hang-valgrind ExtensionAPIClientTest.* Not really a hang, just takes 30 minutes
+unit_tests fail ImporterTest.IEImporter http://bugs.winehq.org/show_bug.cgi?id=20625
+unit_tests fail RenderViewTest.InsertCharacters http://bugs.winehq.org/show_bug.cgi?id=20624
+unit_tests fail SafeBrowsingProtocolParsingTest.TestVerifyChunkMac http://bugs.winehq.org/show_bug.cgi?id=20340
+unit_tests fail SafeBrowsingProtocolParsingTest.TestVerifyUpdateMac http://bugs.winehq.org/show_bug.cgi?id=20340
+unit_tests fail_wine_vmware RenderProcessTest.TestTransportDIBAllocation
+_EOF_
+}
+
+# Times are in seconds, and are twice as high as slowest observed runtime so far in valgrind,
+# rounded to the nearest power of two multiple of 100 seconds.
+# TODO: make the returned value lower if --valgrind is not given
+get_expected_runtime() {
+ case "$timeout_manual" in
+ [0-9]*) echo $timeout_manual; return;;
+ esac
+
+ case $1 in
+ app_unittests) echo 200;;
+ base_unittests) echo 1000;;
+ courgette_unittests) echo 1000;;
+ googleurl_unittests) echo 200;;
+ ipc_tests) echo 400;;
+ media_unittests) echo 400;;
+ net_unittests) echo 2000;;
+ printing_unittests) echo 100;;
+ sbox_unittests) echo 100;;
+ sbox_validation_tests) echo 100;;
+ setup_unittests) echo 100;;
+ tcmalloc_unittests) echo 1000;;
+ unit_tests) echo 4000;;
+ *) echo "unknown test $1" >&2 ; exec false;;
+ esac
+}
+
+# Run $2... but kill it if it takes longer than $1 seconds
+alarm() { time perl -e 'alarm shift; exec @ARGV' "$@"; }
+
+init_runtime() {
+ CHROME_ALLOCATOR=winheap
+ export CHROME_ALLOCATOR
+
+ if test "$WINDIR" = ""
+ then
+ WINE=${WINE:-$HOME/wine-git/wine}
+ export WINE
+ WINESERVER=${WINESERVER:-$HOME/wine-git/server/wineserver}
+ WINEPREFIX=${WINEPREFIX:-$HOME/.wine-chromium-tests}
+ export WINEPREFIX
+ WINE_HEAP_REDZONE=16
+ export WINE_HEAP_REDZONE
+
+ if netstat -tlnp | grep :1337
+ then
+ echo Please kill the server listening on port 1337, or reboot. The net tests need this port.
+ exit 1
+ fi
+ if test ! -f /usr/share/ca-certificates/root_ca_cert.crt
+ then
+ echo "You need to do"
+ echo "sudo cp src/net/data/ssl/certificates/root_ca_cert.crt /usr/share/ca-certificates/"
+ echo "sudo vi /etc/ca-certificates.conf (and add the line root_ca_cert.crt)"
+ echo "sudo update-ca-certificates"
+ echo "else ssl tests will fail."
+ echo "(Alternately, modify this script to run Juan's importer, http://bugs.winehq.org/show_bug.cgi?id=20370#c4 )"
+ exit 1
+ fi
+
+ if test -n "$VNC"
+ then
+ export DISPLAY=":$VNC"
+ vncserver -kill "$DISPLAY" || true
+ vncserver "$DISPLAY" -ac -depth 24 -geometry 1024x768
+ fi
+ $dry_run rm -rf $WINEPREFIX
+ $dry_run test -f winetricks || wget http://kegel.com/wine/winetricks
+ $dry_run sh winetricks nocrashdialog corefonts gecko > /dev/null
+ $dry_run sleep 1
+ $dry_run $WINE winemine &
+ fi
+}
+
+shutdown_runtime() {
+ if test "$WINDIR" = ""
+ then
+ $dry_run $WINESERVER -k
+ if test -n "$VNC"
+ then
+ vncserver -kill "$DISPLAY"
+ fi
+ fi
+}
+
+# Looks up tests from our list of known bad tests. If $2 is not '.', picks tests expected to fail in a particular way.
+get_test_filter()
+{
+ mysuite=$1
+ myfilter=$2
+ list_known_failures | tee tmp.1 |
+ awk '$1 == "'$mysuite'" && /'$myfilter'/ {print $3}' |tee tmp.2 |
+ tr '\012' : |tee tmp.3 |
+ sed 's/:$/\n/'
+}
+
+# Output the logical and of the two gtest filters $1 and $2.
+# Handle the case where $1 is empty.
+and_gtest_filters()
+{
+ # FIXME: handle more complex cases
+ case "$1" in
+ "") ;;
+ *) echo -n "$1": ;;
+ esac
+ echo $2
+}
+
+# Expands a gtest filter spec to a plain old list of tests separated by whitespace
+expand_test_list()
+{
+ mysuite=$1 # e.g. base_unittests
+ myfilter=$2 # existing gtest_filter specification with wildcard
+ # List just the tests matching $myfilter, separated by colons
+ $WINE ./$mysuite.exe --gtest_filter=$myfilter --gtest_list_tests |
+ tr -d '\015' |
+ grep -v FLAKY |
+ perl -e 'while (<STDIN>) { chomp; if (/^[A-Z]/) { $testname=$_; } elsif (/./) { s/\s*//; print "$testname$_\n"} }'
+}
+
+# Parse arguments
+
+announce=true
+do_individual=no
+dry_run=
+extra_gtest_filter=
+fail_filter="."
+loops=1
+logfiles=
+SUITES=
+suppression_dirs=
+TARGET=Debug
+timeout_manual=
+VALGRIND_CMD=
+VNC=
+want_fails=no
+winedebug=
+
+while test "$1" != ""
+do
+ case $1 in
+ --individual) do_individual=yes;;
+ --groups) do_individual=groups;;
+ --gtest_filter) extra_gtest_filter=$2; shift;;
+ --just-crashes) fail_filter="crash"; want_fails=yes;;
+ --just-fails) fail_filter="fail"; want_fails=yes;;
+ --just-flaky) fail_filter="flaky"; want_fails=yes;;
+ --just-hangs) fail_filter="hang"; want_fails=yes;;
+ --list-failures) list_known_failures; exit 0;;
+ --list-failures-html) list_known_failures | sed 's,http://\(.*\),<a href="http://\1">\1</a>,;s/$/<br>/' ; exit 0;;
+ --loops) loops=$2; shift;;
+ -n) dry_run=true; announce=echo ;;
+ --suppression_dir) suppression_dirs="$suppression_dirs $2"; shift;;
+ --target) TARGET=$2; shift;;
+ --timeout) timeout_manual=$2; shift;;
+ --used-suppressions) cd logs; grep used_suppression *.log | sed 's/-1.*--[0-9]*-- used_suppression//'; exit 0;;
+ --valgrind) VALGRIND_CMD="$THE_VALGRIND_CMD";;
+ --vnc) VNC=$2; shift;;
+ --winedebug) winedebug=$2; shift;;
+ --logfiles) logfiles=yes;;
+ -*) usage; exit 1;;
+ *) SUITES="$SUITES $1" ;;
+ esac
+ shift
+done
+
+if test "$SUITES" = ""
+then
+ SUITES="$SUITES_1 $SUITES_10 $SUITES_100 $SUITES_1000"
+fi
+
+if test "$VALGRIND_CMD" != ""
+then
+ if test "$suppression_dirs" = ""
+ then
+ # Default value for winezeug.
+ suppression_dirs="../../../ ../../../../../valgrind"
+ # Also try the script dir.
+ suppression_dirs="$suppression_dirs $(dirname $0)"
+ fi
+ # Check suppression_dirs for suppression files to create suppression_options
+ suppression_options=
+ for dir in $suppression_dirs
+ do
+ for f in valgrind-suppressions chromium-valgrind-suppressions
+ do
+ if test -f "$dir/$f"
+ then
+ suppression_options="$suppression_options --suppressions=$dir/$f"
+ fi
+ done
+ done
+ VALGRIND_CMD="$VALGRIND_CMD $suppression_options"
+fi
+
+set -e
+
+trap shutdown_runtime 0
+init_runtime
+export WINEDEBUG=$winedebug
+
+set -x
+
+mkdir -p logs
+cd "src/chrome/$TARGET"
+
+i=1
+while test $i -le $loops
+do
+ for suite in $SUITES
+ do
+ expected_to_fail="`get_test_filter $suite $fail_filter`"
+ case $want_fails in
+ no) filterspec=`and_gtest_filters "${extra_gtest_filter}" -${expected_to_fail}` ;;
+ yes) filterspec=`and_gtest_filters "${extra_gtest_filter}" ${expected_to_fail}` ;;
+ esac
+ LOGCMD=
+
+ case $do_individual in
+ no)
+ $announce $VALGRIND_CMD $WINE ./$suite.exe --gtest_filter=$filterspec
+ test "$logfiles" = yes && LOGCMD="> ../../../logs/$suite-$i.log"
+ $dry_run alarm `get_expected_runtime $suite` \
+ $VALGRIND_CMD $WINE ./$suite.exe --gtest_filter=$filterspec 2>&1 | eval reduce_verbosity $LOGCMD || true
+ ;;
+ yes)
+ for test in `expand_test_list $suite $filterspec`
+ do
+ $announce $VALGRIND_CMD $WINE ./$suite.exe --gtest_filter="$test"
+ test "$logfiles" = yes && LOGCMD="> ../../../logs/$suite-$test-$i.log"
+ $dry_run alarm `get_expected_runtime $suite` \
+ $VALGRIND_CMD $WINE ./$suite.exe --gtest_filter="$test" 2>&1 | eval reduce_verbosity $LOGCMD || true
+ done
+ ;;
+ groups)
+ for test in `expand_test_list $suite $filterspec | sed 's/\..*//' | sort -u`
+ do
+ $announce $VALGRIND_CMD $WINE ./$suite.exe --gtest_filter="$test.*-${expected_to_fail}"
+ test "$logfiles" = yes && LOGCMD="> ../../../logs/$suite-$test-$i.log"
+ $dry_run alarm `get_expected_runtime $suite` \
+ $VALGRIND_CMD $WINE ./$suite.exe --gtest_filter="$test.*-${expected_to_fail}" 2>&1 | eval reduce_verbosity $LOGCMD || true
+ done
+ ;;
+ esac
+ done
+ i=`expr $i + 1`
+done
diff --git a/tools/wine_valgrind/chromium-valgrind-suppressions b/tools/wine_valgrind/chromium-valgrind-suppressions
new file mode 100644
index 0000000..ed60b83
--- /dev/null
+++ b/tools/wine_valgrind/chromium-valgrind-suppressions
@@ -0,0 +1,92 @@
+# Chromium-specific suppressions
+{
+ dont_valgrind_python_1
+ Memcheck:Cond
+ ...
+ obj:*python*
+}
+{
+ dont_valgrind_python_2
+ Memcheck:Value4
+ ...
+ obj:*python*
+}
+{
+ dont_valgrind_python_3
+ Memcheck:Addr4
+ ...
+ obj:*python*
+}
+{
+ wine_bug_20551_as_seen_by_chromium
+ Memcheck:Leak
+ ...
+ fun:RtlAllocateHeap
+ ...
+ fun:GlobalAlloc
+ ...
+ fun:Clipboard::WriteObjects
+}
+{
+ suppress_chromium_crasher
+ Memcheck:Addr1
+ ...
+ fun:*Test_Crasher*
+}
+{
+ ignore_mozilla_errors
+ Memcheck:Cond
+ obj:*/ImporterTest/profile/mozcrt19.dll
+}
+{
+ wine_bug_20692_a
+ Memcheck:Leak
+ ...
+ fun:CryptImportKey
+ fun:CRYPT_ImportRsaPublicKeyInfoEx
+ fun:CryptImportPublicKeyInfoEx
+ fun:CryptImportPublicKeyInfo
+ fun:base::SignatureVerifier::VerifyInit
+}
+{
+ wine_bug_20692_b
+ Memcheck:Leak
+ ...
+ fun:CryptGenKey
+ fun:base::RSAPrivateKey::Create
+}
+{
+ # Boy, oh, boy do we need a better way to deal with this.
+ # See https://bugs.kde.org/show_bug.cgi?id=190660
+ valgrind_bug_190660
+ Memcheck:Addr4
+ fun:strlen
+}
+{
+ # Boy, oh, boy do we need a better way to deal with this.
+ # See https://bugs.kde.org/show_bug.cgi?id=190660
+ valgrind_bug_190660
+ Memcheck:Addr4
+ fun:strcmp
+}
+{
+ # Boy, oh, boy do we need a better way to deal with this.
+ # See https://bugs.kde.org/show_bug.cgi?id=190660
+ valgrind_bug_190660
+ Memcheck:Addr4
+ fun:strchr
+}
+{
+ # Boy, oh, boy do we need a better way to deal with this.
+ # See https://bugs.kde.org/show_bug.cgi?id=190660
+ valgrind_bug_190660
+ Memcheck:Addr4
+ fun:strcat
+}
+{
+ # Boy, oh, boy do we need a better way to deal with this.
+ # See https://bugs.kde.org/show_bug.cgi?id=190660
+ valgrind_bug_190660
+ Memcheck:Addr4
+ fun:strncpy
+}
diff --git a/tools/wine_valgrind/valgrind-suppressions b/tools/wine_valgrind/valgrind-suppressions
new file mode 100644
index 0000000..078128d8
--- /dev/null
+++ b/tools/wine_valgrind/valgrind-suppressions
@@ -0,0 +1,1076 @@
+# These three happen if valgrind doesn't notice and handle speculative
+# implementations of strchr/strlen/strcat properly.
+{
+ visual_c_ignore_strchr
+ Memcheck:Cond
+ fun:strchr
+}
+{
+ visual_c_ignore_strlen
+ Memcheck:Cond
+ fun:strlen
+}
+{
+ visual_c_ignore_strcat
+ Memcheck:Cond
+ fun:strcat
+}
+# These two are because ioctl often involves structs with holes.
+# We need to either add one of these per ioctl, or
+# just make it apply for *any* call to NtFsControlFile.
+{
+ wine_struct_hole_FILE_PIPE_WAIT_FOR_BUFFER
+ Memcheck:Param
+ writev(vector[1])
+ obj:*
+ fun:wine_server_call
+ fun:server_ioctl_file
+ fun:NtFsControlFile
+ fun:WaitNamedPipeW
+}
+{
+ wine_struct_hole_FILE_PIPE_WAIT_FOR_BUFFER_NONOPTIMIZED
+ Memcheck:Param
+ writev(vector[1])
+ obj:*
+ fun:send_request
+ fun:wine_server_call
+ fun:server_ioctl_file
+ fun:NtFsControlFile
+ fun:WaitNamedPipeW
+}
+{
+ # See http://www.winehq.org/pipermail/wine-devel/2008-November/070539.html
+ # We might want to add an annotationto WriteConsoleInputW
+ # for the hole someday.
+ wine_struct_hole_WriteConsoleInput
+ Memcheck:Param
+ writev(vector[...])
+ fun:writev
+ fun:send_request
+ fun:wine_server_call
+ fun:wine_server_call_err
+ fun:WriteConsoleInputW
+}
+# We sure got a lot of these in the logs when I first started.
+# I suppressed them to avoid dispair.
+{
+ todo_wine_arrgh_wcstombs
+ Memcheck:Value4
+ fun:wine_cp_wcstombs
+}
+# Now on to system bugs that aren't Wine's fault.
+{
+ suppress_nss_leak
+ Memcheck:Leak
+ fun:malloc
+ obj:*
+ fun:__nss_database_lookup
+}
+{
+ bogus_addr4_ldso_27
+ Memcheck:Addr4
+ obj:/lib*/ld-2.7.so
+}
+{
+ bogus_addr4_ldso_261
+ Memcheck:Addr4
+ obj:/lib*/ld-2.6.1.so
+}
+{
+ bogus_addr4_ldso_25
+ Memcheck:Addr4
+ obj:/lib*/ld-2.5.so
+}
+{
+ bogus_addr4_ldso_236
+ Memcheck:Addr4
+ obj:/lib*/ld-2.3.6.so
+}
+{
+ bogus_cond_ldso_27
+ Memcheck:Cond
+ obj:/lib*/ld-2.7.so
+}
+{
+ bogus_cond_ldso_261
+ Memcheck:Cond
+ obj:/lib*/ld-2.6.1.so
+}
+{
+ bogus_cond_ldso_25
+ Memcheck:Cond
+ obj:/lib*/ld-2.5.so
+}
+{
+ bogus_cond_ldso_236
+ Memcheck:Cond
+ obj:/lib*/ld-2.3.6.so
+}
+{
+ bogus_cond_libglcore_16912
+ Memcheck:Cond
+ obj:/usr/lib*/libGLcore.so.169.12
+}
+{
+ bogus_value4_libglcore_16912
+ Memcheck:Value4
+ obj:/usr/lib*/libGLcore.so.169.12
+}
+{
+ bogus_addr2_libglcore_16912
+ Memcheck:Addr2
+ obj:/usr/lib*/libGLcore.so.169.12
+}
+{
+ suppress_ioctl_libglcore_18044
+ Memcheck:Param
+ ioctl(generic)
+ fun:ioctl
+ obj:/usr/lib32/libGLcore.so.180.44
+}
+{
+ suppress_cond_libglcore_18044
+ Memcheck:Cond
+ obj:/usr/lib32/libGLcore.so.180.44
+}
+{
+ bogus_addr4_libgl_109631
+ Memcheck:Addr4
+ obj:/usr/lib*/libGL.so.1.0.9631
+}
+{
+ bogus_addr4_libgl_109639
+ Memcheck:Addr4
+ obj:/usr/lib*/libGL.so.1.0.9639
+}
+{
+ suppress_leak_libgl_109631
+ Memcheck:Leak
+ fun:malloc
+ obj:/usr/lib*/libGL.so.1.0.9631
+}
+{
+ suppress_leak_libgl_18044
+ Memcheck:Leak
+ fun:malloc
+ obj:/usr/lib32/libGL.so.180.44
+}
+{
+ suppress_leak_wglGetProcAddress
+ Memcheck:Leak
+ fun:malloc
+ obj:/usr/lib/libGL*
+ ...
+ fun:glXChooseVisual
+ fun:has_opengl
+ fun:X11DRV_wglGetProcAddress
+ fun:wglGetProcAddress
+}
+{
+ bogus_X11_1
+ Memcheck:Param
+ write(buf)
+ obj:*
+ obj:/usr/lib*/libX11.so.6.2.0
+}
+{
+ bogus_X11_2
+ Memcheck:Param
+ write(buf)
+ obj:*
+ obj:*
+ obj:/usr/lib*/libX11.so.6.2.0
+}
+{
+ bogus_Xcursor
+ Memcheck:Cond
+ obj:/usr/lib*/libXcursor.so.1.0.2
+}
+{
+ suppress_i915_ioctl
+ Memcheck:Param
+ ioctl(generic)
+ obj:*
+ obj:/usr/lib*/dri/i915_dri.so
+}
+{
+ suppress_i915_cond
+ Memcheck:Cond
+ obj:/usr/lib*/dri/i915_dri.so
+}
+{
+ suppress_i915_value
+ Memcheck:Value4
+ obj:/usr/lib*/dri/i915_dri.so
+}
+{
+ suppress_i915_leak1
+ Memcheck:Leak
+ fun:malloc
+ obj:/usr/lib*/dri/i915_dri.so
+}
+{
+ suppress_i915_leak2
+ Memcheck:Leak
+ fun:memalign
+ fun:*
+ obj:/usr/lib*/dri/i915_dri.so
+}
+{
+ suppress_libasound_overlap
+ Memcheck:Overlap
+ fun:memcpy
+ obj:/usr/lib*/libasound.so.2.0.0
+}
+{
+ suppress_libasound_connect
+ Memcheck:Param
+ socketcall.connect(serv_addr..sun_path)
+ obj:*
+ obj:/usr/lib*/libasound.so.2.0.0
+}
+{
+ suppress_libasound_connect2
+ Memcheck:Cond
+ fun:snd_pcm_direct_client_connect
+ obj:/usr/lib*/libasound.so.2.0.0
+}
+{
+ suppress_libasound_bind
+ Memcheck:Param
+ socketcall.bind(my_addr..sun_path)
+ obj:*
+ obj:/usr/lib*/libasound.so.2.0.0
+}
+{
+ suppress_libasound_ioctl
+ Memcheck:Param
+ ioctl(arg)
+ obj:*
+ obj:/usr/lib*/libasound.so.2.0.0
+}
+{
+ suppress_libasound_ioctl2
+ Memcheck:Param
+ ioctl(arg)
+ obj:*
+ fun:ioctl
+ obj:/usr/lib*/libasound.so.2.0.0
+}
+{
+ suppress_libasound_semctl
+ Memcheck:Param
+ semctl(IPC_SET, arg.buf)
+ obj:*
+ obj:/usr/lib*/libasound.so.2.0.0
+}
+{
+ todo_suppress_libasound_leak
+ Memcheck:Leak
+ ...
+ obj:/usr/lib*/libasound.so.2.0.0
+}
+{
+ todo_suppress_libfontconfig_leak
+ Memcheck:Leak
+ fun:malloc
+ obj:/usr/lib*/libfontconfig.so.1.*
+}
+# thread_detach() should clean this up??
+{
+ todo_wine_dlls_winex11drv__x11drv_init_thread_data_main
+ Memcheck:Leak
+ ...
+ fun:RtlAllocateHeap
+ fun:x11drv_init_thread_data
+}
+# Supposedly there's a call back to X11DRV_DestroyIM at thread destruction time...?
+# and thread_detach() should also clean it up??
+{
+ todo_wine_dlls_winex11drv__x11drv_init_thread_data_xim
+ Memcheck:Leak
+ fun:malloc
+ fun:_XimOpenIM
+ fun:_XimRegisterIMInstantiateCallback
+ fun:XRegisterIMInstantiateCallback
+ fun:X11DRV_SetupXIM
+ fun:x11drv_init_thread_data
+ fun:x11drv_thread_data
+ fun:X11DRV_SetWindowPos
+}
+{
+ todo_wine_dlls_winex11drv__X11DRV_XRandR_Init
+ Memcheck:Leak
+ fun:*alloc
+ fun:XInitExtension
+ fun:XextAddDisplay
+ obj:*/libXrandr*
+ fun:XRRQueryExtension
+ fun:X11DRV_XRandR_Init
+}
+{
+ todo_wine_dlls_winex11drv__X11DRV_XRender_Init
+ Memcheck:Leak
+ fun:*alloc
+ fun:XInitExtension
+ fun:XRenderFindDisplay
+ fun:XRenderQueryExtension
+ fun:X11DRV_XRender_Init
+}
+{
+ todo_wine_dlls_winex11drv__xinerama_init
+ Memcheck:Leak
+ fun:*alloc
+ fun:XInitExtension
+ fun:XextAddDisplay
+ ...
+ fun:XPanoramiXQueryExtension
+ fun:XineramaQueryExtension
+ ...
+ fun:xinerama_init
+}
+{
+ todo_wine_dlls_winex11drv__XkbUseExtension
+ Memcheck:Leak
+ fun:*alloc
+ fun:XInitExtension
+ fun:XkbUseExtension
+ fun:XOpenDisplay
+}
+{
+ todo_wine_dlls_winex11drv__X11DRV_XComposite_Init
+ Memcheck:Leak
+ fun:*alloc
+ fun:XInitExtension
+ fun:XCompositeFindDisplay
+ fun:XCompositeQueryExtension
+}
+{
+ todo_wine_dlls_winex11drv__X11DRV_XF86VM_Init
+ Memcheck:Leak
+ fun:*alloc
+ fun:XInitExtension
+ fun:XextAddDisplay
+ fun:*
+ fun:XF86VidModeQueryExtension
+ fun:X11DRV_XF86VM_Init
+}
+{
+ todo_wine_dlls_winex11drv_XOpenDisplay
+ Memcheck:Leak
+ fun:malloc
+ ...
+ fun:xcb_connect
+ fun:_XConnectXCB
+ fun:XOpenDisplay
+}
+{
+ todo_wine_dlls_winex11drv_XOpenDisplay_2
+ Memcheck:Leak
+ fun:malloc
+ ...
+ fun:xcb_get_extension_data
+ fun:xcb_prefetch_maximum_request_length
+ fun:xcb_get_maximum_request_length
+ fun:XOpenDisplay
+ fun:DllMain
+}
+{
+ todo_suppress_alloc_module_leak
+ Memcheck:Leak
+ ...
+ fun:RtlAllocateHeap
+ fun:RtlCreateUnicodeString
+ fun:alloc_module
+}
+{
+ todo_suppress_dlopen_leak
+ Memcheck:Leak
+ fun:*alloc
+ ...
+ fun:dlopen
+}
+{
+ todo_suppress_dlopen_leak2
+ Memcheck:Leak
+ fun:*alloc
+ ...
+ fun:dl_open_worker
+ fun:_dl_catch_error
+ fun:_dl_open
+ fun:dlopen_doit
+ fun:_dl_catch_error
+}
+{
+ suppress_dlopen_addr4
+ Memcheck:Addr4
+ ...
+ fun:__libc_dlopen_mode
+}
+{
+ todo_suppress_load_library_leak
+ Memcheck:Leak
+ ...
+ fun:RtlAllocateHeap
+ fun:RtlAnsiStringToUnicodeString
+ fun:RtlCreateUnicodeStringFromAsciiz
+ fun:get_load_order
+}
+{
+ todo_suppress_wine_init_load_order_leak
+ Memcheck:Leak
+ ...
+ fun:RtlAllocateHeap
+ fun:RtlAnsiStringToUnicodeString
+ fun:RtlCreateUnicodeStringFromAsciiz
+ fun:init_load_order
+}
+# ntdll/loader.c explicitly avoids freeing when .exe's exit at the moment
+{
+ todo_suppress_wine_alloc_module_leak
+ Memcheck:Leak
+ ...
+ fun:RtlAllocateHeap
+ fun:RtlCreateUnicodeString
+ fun:alloc_module
+}
+{
+ todo_suppress_explorer_leak
+ Memcheck:Leak
+ ...
+ fun:RtlAllocateHeap
+ fun:load_driver
+ fun:loaderdrv_CreateDesktopWindow
+ fun:WIN_CreateWindowEx
+ fun:CreateWindowExW
+ fun:manage_desktop
+ fun:WinMain
+ fun:main
+}
+{
+ todo_suppress_exception_addr4
+ Memcheck:Addr4
+ fun:__wine_call_from_32_regs
+ obj:/home/dank/wine-git/dlls/ntdll/ntdll.dll.so
+ obj:/home/dank/wine-git/dlls/ntdll/ntdll.dll.so
+ fun:raise_exception
+}
+{
+ todo_ignore_bogus_writes_in_req_handler
+ Memcheck:Param
+ writev(vector[1])
+ obj:*
+ fun:call_req_handler
+}
+# See comment in dlls/kernel32/tests/thread.c at end of threadFunc1
+{
+ suppress_wine_verify_lstrlenA_deadbeef_zero
+ Memcheck:Addr1
+ fun:strlen
+ fun:lstrlenA
+ fun:threadFunc1
+ obj:/home/dank/wine-git/dlls/ntdll/ntdll.dll.so
+ fun:call_thread_func
+}
+# test_UnpackDDElParam intentionally passes a bad pointer
+{
+ suppress_wine_user32_dde_tests
+ Memcheck:Addr2
+ fun:GlobalLock
+ fun:UnpackDDElParam
+ fun:test_UnpackDDElParam
+ fun:func_dde
+ fun:run_test
+ fun:main
+}
+{
+ suppress_gmtime
+ Memcheck:Cond
+ obj:*
+ obj:*
+ fun:gmtime
+ fun:FileTimeToDosDateTime
+}
+{
+ suppress_gmtime_r
+ Memcheck:Cond
+ obj:*
+ obj:*
+ fun:gmtime_r
+ fun:FileTimeToDosDateTime
+}
+{
+ suppress_if_name2index_glibc_27
+ Memcheck:Param
+ ioctl(SIOCGIFINDEX)
+ obj:/lib*/ld-2.7.so
+ fun:getInterfaceIndexByName
+}
+{
+ suppress_if_nameindex_glibc_23
+ Memcheck:Param
+ socketcall.sendto(msg)
+ obj:/lib*/ld-2.3.*.so
+ fun:if_nameindex
+}
+{
+ # See also http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=553016
+ # and http://bbs.archlinux.org/viewtopic.php?pid=273718
+ suppress_glibc_dl_relocate_object
+ Memcheck:Cond
+ fun:_dl_relocate_object
+}
+{
+ # With ubuntu 9.04:
+ # Uninitialised value was created by a stack allocation
+ # at __libc_res_nsend (res_send.c:343)
+ glibc_bug_libc_res_nsend
+ Memcheck:Cond
+ fun:__libc_res_nsend
+}
+# Naming convention for Wine suppressions:
+# If we think it's solid:
+# suppress_wine_dirname__functionname[_moreifneeded]
+# If we aren't sure, change suppress to todo
+{
+ # intentionally frees an invalid pointer.
+ # It would be nice if that were in a different
+ # function, so we could suppress it specifically,
+ # and not other possible warnings in the heap tests.
+ suppress_wine_dlls_kernel32_tests__test_heap_invalid_free
+ Memcheck:Free
+ fun:notify_free
+ fun:RtlFreeHeap
+ fun:HeapFree
+ fun:GlobalFree
+ fun:test_heap
+ fun:func_heap
+ fun:run_test
+ fun:main
+}
+{
+ # Lots of little invalid things going on in this test
+ suppress_wine_dlls_kernel32_tests_test_heap
+ Memcheck:Addr2
+ ...
+ fun:test_heap
+ fun:func_heap
+ fun:run_test
+ fun:main
+}
+{
+ suppress_wine_dlls_kernel32_tests__CreateThread_basic_badaccess
+ Memcheck:Addr1
+ fun:strlen
+ fun:lstrlenA
+ fun:test_CreateThread_basic
+}
+{
+ suppress_wine_dlls_kernel32_IsBadReadPtr
+ Memcheck:Addr1
+ fun:IsBadReadPtr
+}
+{
+ suppress_wine_dlls_kernel32__IsBadWritePtr
+ Memcheck:Addr1
+ fun:IsBadWritePtr
+}
+{
+ suppress_wine_dlls_kernel32_tests__doCrash
+ Memcheck:Addr1
+ fun:doCrash
+}
+# This one is for a jump to zero done intentionally by the crypt32 tests
+# compiled with -O2, it looks like this?
+{
+ suppress_wine_dlls_crypt32_tests__test_data_msg_O2
+ Memcheck:Addr4
+ fun:__wine_call_from_32_regs
+ fun:CryptMsgUpdate
+ fun:test_data_msg
+}
+# compiled with -O0, it looks like this?
+{
+ suppress_wine_dlls_crypt32_tests__test_data_msg_O0
+ Memcheck:Jump
+ obj:*
+ fun:CryptMsgUpdate
+ fun:test_data_msg_update
+ fun:test_data_msg
+}
+# These two functions test error returned by file read/write with null buffers
+{
+ suppress_wine_kernel32_tests__test_read_write_nullwrite
+ Memcheck:Param
+ write(buf)
+ obj:/lib*/ld-*.so
+ fun:WriteFile
+ fun:test_read_write
+ fun:func_file
+ fun:run_test
+ fun:main
+}
+{
+ suppress_wine_kernel32_tests__test_read_write_nullread
+ Memcheck:Param
+ read(buf)
+ obj:/lib*/ld-*.so
+ fun:ReadFile
+ fun:test_read_write
+ fun:func_file
+ fun:run_test
+ fun:main
+}
+
+# test_SetThreadContext:
+# The code in question looks like this:
+#/* simulate a call to set_test_val(10) */
+#stack = (int *)ctx.Esp;
+#stack[-1] = 10;
+#stack[-2] = ctx.Eip;
+# So we actually are writing to the stack, just not using 'proper'
+# access to the stack.
+{
+ suppress_wine_kernel32_tests__test_SetThreadContext
+ Memcheck:Addr4
+ fun:test_SetThreadContext
+ fun:func_thread
+ fun:run_test
+ fun:main
+}
+{
+ ignore_rsaenh_test_expected_bad_access
+ Memcheck:Addr4
+ fun:CryptReleaseContext
+ fun:clean_up_base_environment
+}
+
+# Back to system suppressions that aren't wine's fault
+# gecko is #1 in the list of offending upstream libraries...
+{
+ todo_gecko_warnings_r_us
+ Memcheck:Addr4
+ obj:*wine_gecko*
+}
+{
+ todo_gecko_warnings_r_us2
+ Memcheck:Cond
+ obj:*wine_gecko*
+}
+# followed by openssl
+{
+ todo_openssl_warnings_r_us1a
+ Memcheck:Addr4
+ obj:/usr/lib*/libcrypto.so*
+}
+{
+ todo_openssl_warnings_r_us1b
+ Memcheck:Value4
+ obj:/usr/lib*/*libcrypto.so*
+}
+{
+ todo_openssl_warnings_r_us1c
+ Memcheck:Cond
+ obj:/usr/lib*/*libcrypto.so*
+}
+{
+ todo_openssl_warnings_r_us2a
+ Memcheck:Addr4
+ obj:*
+ obj:/usr/lib*/*libcrypto.so*
+}
+{
+ todo_openssl_warnings_r_us2b
+ Memcheck:Value4
+ obj:*
+ obj:/usr/lib*/*libcrypto.so*
+}
+{
+ todo_openssl_warnings_r_us2c
+ Memcheck:Cond
+ obj:*
+ obj:/usr/lib*/*libcrypto.so*
+}
+{
+ todo_openssl_warnings_r_us1d
+ Memcheck:Param
+ write(buf)
+ obj:*
+ obj:/usr/lib*/*libcrypto.so*
+}
+{
+ todo_openssl_warnings_r_us3a
+ Memcheck:Addr4
+ obj:/usr/lib*/*libssl.so*
+}
+{
+ todo_openssl_warnings_r_us3b
+ Memcheck:Value4
+ obj:/usr/lib*/*libssl.so*
+}
+{
+ todo_openssl_warnings_r_us3c
+ Memcheck:Cond
+ obj:/usr/lib*/*libssl.so*
+}
+{
+ # http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=532059
+ # http://rt.openssl.org/index.html?q=1642
+ todo_openssl_warnings_mod_inverse
+ Memcheck:Cond
+ fun:BN_mod_inverse
+}
+{
+ # http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=532059
+ # http://rt.openssl.org/index.html?q=1642
+ todo_openssl_warnings_div
+ Memcheck:Cond
+ fun:BN_div
+}
+# And sane
+{
+ todo_sane_warnings_r_us
+ Memcheck:Addr4
+ obj:*libsane*
+}
+{
+ todo_sane_warnings_r_us2
+ Memcheck:Cond
+ obj:*libsane*
+}
+# and visual C++ 6
+{
+ todo_visual_c_chkstk
+ Memcheck:Addr4
+ fun:$$$00001
+}
+{
+ todo_visual_c_chkstk_2
+ Memcheck:Addr4
+ fun:_chkstk
+}
+{
+ visual_c_ignore_bad_typeid
+ Memcheck:Cond
+ fun:??0bad_typeid@@QAE@ABV0@@Z
+}
+# and pulseaudio?? possible bad stack from valgrind?
+{
+ fixme_pulseaudio_leak_widOpen
+ Memcheck:Leak
+ fun:calloc
+ ...
+ fun:pa_cvolume_set
+}
+{
+ fixme_pulseaudio_leak_pa_mainloop_dispatch
+ Memcheck:Leak
+ fun:calloc
+ fun:pa_xmalloc0
+ obj:/usr/lib32/libpulse.so.0.7.1
+ obj:/usr/lib32/libpulse.so.0.7.1
+ obj:/usr/lib32/libpulse.so.0.7.1
+ obj:/usr/lib32/libpulse.so.0.7.1
+ obj:/usr/lib32/libpulse.so.0.7.1
+ obj:/usr/lib32/libpulse.so.0.7.1
+ obj:/usr/lib32/libpulse.so.0.7.1
+ obj:/usr/lib32/libpulse.so.0.7.1
+ fun:pa_mainloop_dispatch
+}
+# and msacm32? possible bad stack from valgrind?
+{
+ fixme_msacm32_leak
+ Memcheck:Leak
+ fun:calloc
+ obj:*
+ fun:acmDriverRemove
+ obj:*
+ fun:acmFilterTagDetailsW
+}
+{
+ fixme_msacm32_leak2
+ Memcheck:Leak
+ fun:calloc
+ fun:attr_copy_file
+ ...
+ fun:widReset
+}
+# Seen in chromium's EmfTest
+{
+ fixme_msacm32_leak3
+ Memcheck:Leak
+ fun:calloc
+ obj:*
+ fun:wodPrepare
+ obj:*
+ fun:wodMapperReconfigure
+}
+# aw, heck, sometimes the symbols aren't there?
+{
+ <insert_a_suppression_name_here>
+ Memcheck:Leak
+ fun:calloc
+ obj:*
+ obj:*msacm32.drv.so
+}
+
+# shell32 isn't freeing its imagelist cache on unload?
+{
+ wine_bug_20544
+ Memcheck:Leak
+ fun:malloc
+ fun:XInitExtension
+ fun:XextAddDisplay
+ fun:*
+ fun:XShmQueryVersion
+ fun:X11DRV_CreateDIBSection
+ fun:CreateDIBSection
+ fun:ImageList_CreateImage
+ fun:ImageList_Create
+ fun:SIC_Initialize
+ fun:DllMain
+}
+# winmm isn't freeing everything on unload?
+{
+ wine_bug_20545
+ Memcheck:Leak
+ ...
+ fun:Rtl*AllocateHeap
+ fun:MMDRV_InitPerType
+ fun:MMDRV_Install
+ fun:MMDRV_Init
+}
+{
+ # This one's probably benign?
+ user32_builtin_classes_leak
+ Memcheck:Leak
+ fun:calloc
+ fun:XAddExtension
+ fun:_XcursorGetDisplayInfo
+ fun:XcursorSupportsARGB
+ fun:XcursorNoticeCreateBitmap
+ fun:_XNoticeCreateBitmap
+ fun:XCreatePixmap
+ fun:X11DRV_BITMAP_Init
+ fun:device_init
+ fun:X11DRV_CreateDC
+ fun:CreateDCW
+ fun:CURSORICON_CreateIconFromBMI
+ fun:CreateIconFromResourceEx
+ fun:CURSORICON_Load
+ fun:LoadImageW
+ fun:LoadImageA
+ fun:LoadCursorA
+ fun:register_builtin
+ fun:CLASS_RegisterBuiltinClasses
+}
+# yet another leak on unload, seen on chromium's net http and ftp tests
+{
+ wine_bug_20549
+ Memcheck:Leak
+ fun:malloc
+ ...
+ fun:SECUR32_initSchannelSP
+}
+{
+ # yet another gnutls leak?
+ gnutls_leak_bug_2
+ Memcheck:Leak
+ fun:calloc
+ ...
+# fun:_gnutls_hash_init (commented out because sometimes this shows up without symbols)
+# fun:gnutls_handshake
+ fun:schan_InitializeSecurityContextW
+ fun:InitializeSecurityContextW
+}
+# leak on thread creation?
+{
+ wine_bug_20552
+ Memcheck:Leak
+ ...
+ fun:RtlAllocateHeap
+ fun:alloc_thread_tls
+ fun:MODULE_DllThreadAttach
+}
+{
+ wine_secur32_ignore_fork_helper_leak
+ Memcheck:Leak
+ ...
+ fun:RtlAllocateHeap
+ fun:fork_helper
+ fun:SECUR32_initNTLMSP
+ fun:SECUR32_initializeProviders
+}
+{
+ wine_bug_20548_ConnectNamedPipe
+ Memcheck:Leak
+ ...
+ fun:RtlAllocateHeap
+ fun:server_ioctl_file
+ fun:NtFsControlFile
+}
+{
+ wine_bug_20548_ReadFile
+ Memcheck:Leak
+ ...
+ fun:RtlAllocateHeap
+ fun:NtReadFile
+}
+{
+ wine_bug_20548_WriteFile
+ Memcheck:Leak
+ ...
+ fun:RtlAllocateHeap
+ fun:NtWriteFile
+}
+{
+ wine_bug_20548_WS_shutdown
+ Memcheck:Leak
+ ...
+ fun:RtlAllocateHeap
+ fun:WS2_register_async_shutdown
+ fun:WS_shutdown
+}
+{
+ todo_tls_leak_wine_bug_20552
+ Memcheck:Leak
+ ...
+ fun:RtlAllocateHeap
+ fun:alloc_thread_tls
+ fun:MODULE_DllThreadAttach
+ fun:start_thread
+}
+{
+ wine_bug_20654
+ Memcheck:Leak
+ ...
+ fun:RtlAllocateHeap
+ fun:get_full_path_helper
+ fun:RtlGetFullPathName_U
+}
+{
+ # This leak is expected - wine doesn't have a reliable way to free the default provider on exit.
+ wine_bug_20679
+ Memcheck:Leak
+ ...
+ fun:CRYPT_GetDefaultProvider
+}
+{
+ # Benign window title leak?
+ wine_bug_20692_wontfix
+ Memcheck:Leak
+ ...
+ fun:DEFWND_SetText*
+ ...
+ fun:CreateWindow*
+}
+{
+ expected_double_free_wintrust_tests_crypt
+ Memcheck:Addr4
+ fun:CryptCATAdminReleaseContext
+ fun:test_context
+ fun:func_crypt
+ fun:run_test
+ fun:main
+}
+{
+ expected_bad_pointer_wininet_tests_http
+ Memcheck:Addr1
+ fun:HttpOpenRequestA
+ fun:test_bogus_accept_types_array
+ fun:func_http
+ fun:run_test
+ fun:main
+}
+{
+ expected_use_after_free_user32_tests_dialog
+ Memcheck:Addr4
+ fun:DIALOG_CreateIndirect
+ fun:DialogBoxParamA
+ fun:test_DialogBoxParamA
+ fun:func_dialog
+ fun:run_test
+ fun:main
+}
+{
+ expected_12345678_ptr_user32_tests_class
+ Memcheck:Addr2
+ fun:RtlImageNtHeader
+ fun:RtlImageDirectoryEntryToData
+ fun:find_entry
+ fun:LdrFindResource_U
+ fun:find_resourceA
+ fun:FindResourceExA
+ fun:FindResourceA
+ fun:LoadMenuA
+ fun:WIN_CreateWindowEx
+ fun:CreateWindowExA
+ fun:check_instance_
+ fun:test_instances
+ fun:func_class
+ fun:run_test
+ fun:main
+}
+{
+ expected_advapi32_tests_crypt_badparams
+ Memcheck:Addr4
+ ...
+ fun:test_incorrect_api_usage
+ fun:func_crypt
+ fun:run_test
+ fun:main
+}
+{
+ # These aren't even in wine, but in a helper app wine runs
+ ntlm_auth_leaks
+ Memcheck:Leak
+ ...
+ obj:/usr/bin/ntlm_auth
+}
+{
+ ntlm_auth_leaks
+ Memcheck:Leak
+ ...
+ fun:poptGetNextOpt
+ fun:main
+}
+{
+ expected_wininet_tests_http_test_bogus_accept_types_array
+ Memcheck:Addr1
+ fun:HttpOpenRequestA
+ fun:test_bogus_accept_types_array
+ fun:func_http
+ fun:run_test
+ fun:main
+}
+{
+ expected_advapi32_tests_crypt_see_wine_bug_20918
+ Memcheck:Addr4
+ fun:*
+ fun:test_incorrect_api_usage
+ fun:func_crypt
+ fun:run_test
+ fun:main
+}
+{
+ expected_crypt32_tests_crypt_see_wine_bug_20984
+ Memcheck:Leak
+ fun:notify_alloc
+ fun:RtlAllocateHeap
+ fun:new_object
+ fun:new_key
+ fun:import_public_key
+ fun:import_key
+ fun:RSAENH_CPImportKey
+ fun:CryptImportKey
+ fun:CRYPT_ImportRsaPublicKeyInfoEx
+ fun:CryptImportPublicKeyInfoEx
+ fun:CryptImportPublicKeyInfo
+ fun:CDecodeSignedMsg_VerifySignatureWithKey
+ fun:CDecodeSignedMsg_VerifySignature
+ fun:CDecodeMsg_Control
+ fun:CryptMsgControl
+ fun:CryptVerifyDetachedMessageSignature
+ fun:test_verify_detached_message_signature
+}