[PATCH 2/2] server: Remove obsolete synthesized formats in release_clipboard().

Francois Gouget fgouget at codeweavers.com
Mon Aug 9 22:51:46 CDT 2021


Synthesized formats must be removed too if the format they depend on has
been removed.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51496
Signed-off-by: Francois Gouget <fgouget at codeweavers.com>
---
 dlls/user32/tests/clipboard.c | 7 +++----
 server/clipboard.c            | 7 ++++++-
 2 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/dlls/user32/tests/clipboard.c b/dlls/user32/tests/clipboard.c
index 8515ba5b88a..b673fc1add5 100644
--- a/dlls/user32/tests/clipboard.c
+++ b/dlls/user32/tests/clipboard.c
@@ -973,7 +973,7 @@ static void test_synthesized(void)
 
     /* CF_UNICODETEXT and derivatives, CF_TEXT + CF_OEMTEXT, should be gone */
     count = CountClipboardFormats();
-    todo_wine ok(count == 1, "count %u\n", count );
+    ok(count == 1, "count %u\n", count );
     cf = EnumClipboardFormats( 0 );
     ok(cf == CF_LOCALE, "unexpected clipboard format %u\n", cf);
 
@@ -984,10 +984,9 @@ static void test_synthesized(void)
     ok(r, "gle %d\n", GetLastError());
 
     SetLastError(0xdeadbeef);
-    data = (void*)1; if (broken(1)) /* FIXME Crashes in Wine */
     data = GetClipboardData( CF_TEXT );
-    ok(GetLastError() == 0xdeadbeef, "unexpected last error %d\n", GetLastError());
-    todo_wine ok(!data, "GetClipboardData() should have returned NULL\n");
+    ok(GetLastError() == 0xdeadbeef, "bad last error %d\n", GetLastError());
+    ok(!data, "GetClipboardData() should have returned NULL\n");
 
     r = CloseClipboard();
     ok(r, "gle %d\n", GetLastError());
diff --git a/server/clipboard.c b/server/clipboard.c
index 1c4875ff726..8d1c42cb525 100644
--- a/server/clipboard.c
+++ b/server/clipboard.c
@@ -303,7 +303,12 @@ static user_handle_t release_clipboard( struct clipboard *clipboard )
     /* free the delayed-rendered formats, since we no longer have an owner to render them */
     LIST_FOR_EACH_ENTRY_SAFE( format, next, &clipboard->formats, struct clip_format, entry )
     {
-        if (format->data || format->from) continue;
+        /* format->from is earlier in the list and thus has already been
+         * removed if not available anymore (it is also < CF_MAX)
+         */
+        if (format->data ||
+            (format->from && HAS_FORMAT(clipboard->format_map, format->from)))
+            continue;
         list_remove( &format->entry );
         if (format->id < CF_MAX) clipboard->format_map &= ~(1 << format->id);
         clipboard->format_count--;
-- 
2.20.1



More information about the wine-devel mailing list