get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/2216227/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 2216227,
    "url": "http://patchwork.ozlabs.org/api/patches/2216227/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260326065111.626236-1-zhaoguohan@kylinos.cn/",
    "project": {
        "id": 14,
        "url": "http://patchwork.ozlabs.org/api/projects/14/?format=api",
        "name": "QEMU Development",
        "link_name": "qemu-devel",
        "list_id": "qemu-devel.nongnu.org",
        "list_email": "qemu-devel@nongnu.org",
        "web_url": "",
        "scm_url": "",
        "webscm_url": "",
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<20260326065111.626236-1-zhaoguohan@kylinos.cn>",
    "list_archive_url": null,
    "date": "2026-03-26T06:51:11",
    "name": "ui/dbus: associate add_client completion with its request",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "89d785b5ccf477c3970d15470414bb57e1acd30b",
    "submitter": {
        "id": 92952,
        "url": "http://patchwork.ozlabs.org/api/people/92952/?format=api",
        "name": "GuoHan Zhao",
        "email": "zhaoguohan@kylinos.cn"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260326065111.626236-1-zhaoguohan@kylinos.cn/mbox/",
    "series": [
        {
            "id": 497539,
            "url": "http://patchwork.ozlabs.org/api/series/497539/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=497539",
            "date": "2026-03-26T06:51:11",
            "name": "ui/dbus: associate add_client completion with its request",
            "version": 1,
            "mbox": "http://patchwork.ozlabs.org/series/497539/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2216227/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2216227/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>",
        "X-Original-To": "incoming@patchwork.ozlabs.org",
        "Delivered-To": "patchwork-incoming@legolas.ozlabs.org",
        "Authentication-Results": "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)",
        "Received": [
            "from lists.gnu.org (lists.gnu.org [209.51.188.17])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fhDwb2pxpz1y1x\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 26 Mar 2026 17:52:15 +1100 (AEDT)",
            "from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1w5eZ4-0000Ah-Ly; Thu, 26 Mar 2026 02:51:34 -0400",
            "from eggs.gnu.org ([2001:470:142:3::10])\n by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <zhaoguohan@kylinos.cn>)\n id 1w5eZ2-0000AP-AZ\n for qemu-devel@nongnu.org; Thu, 26 Mar 2026 02:51:32 -0400",
            "from mailgw.kylinos.cn ([124.126.103.232])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <zhaoguohan@kylinos.cn>)\n id 1w5eYy-0000Qv-Rm\n for qemu-devel@nongnu.org; Thu, 26 Mar 2026 02:51:31 -0400",
            "from localhost.localdomain [(10.44.16.150)] by mailgw.kylinos.cn\n (envelope-from <zhaoguohan@kylinos.cn>)\n (Generic MTA with TLSv1.3 TLS_AES_256_GCM_SHA384 256/256)\n with ESMTP id 295054896; Thu, 26 Mar 2026 14:51:15 +0800"
        ],
        "X-UUID": [
            "2f271de028e011f1a21c59e7364eecb8-20260326",
            "2f271de028e011f1a21c59e7364eecb8-20260326"
        ],
        "X-CID-P-RULE": "Release_Ham",
        "X-CID-O-INFO": "VERSION:1.3.11, REQID:1ea9415f-3aab-42ae-a742-a02b26f2c93a,\n IP:0,\n U\n RL:0,TC:0,Content:0,EDM:25,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTION\n :release,TS:25",
        "X-CID-META": "VersionHash:89c9d04, CLOUDID:57232f90b651bdf86ccb35070357935b,\n BulkI\n D:nil,BulkQuantity:0,Recheck:0,SF:102|850|898,TC:nil,Content:0|15|50,EDM:5\n ,IP:nil,URL:0,File:nil,RT:nil,Bulk:nil,QS:nil,BEC:nil,COL:0,OSI:0,OSA:0,AV\n :0,LES:1,SPR:NO,DKR:0,DKP:0,BRR:0,BRE:0,ARC:0",
        "X-CID-BVR": "2,SSN|SDN",
        "X-CID-BAS": "2,SSN|SDN,0,_",
        "X-CID-FACTOR": "TF_CID_SPAM_SNR",
        "X-CID-RHF": "D41D8CD98F00B204E9800998ECF8427E",
        "X-User": "zhaoguohan@kylinos.cn",
        "From": "GuoHan Zhao <zhaoguohan@kylinos.cn>",
        "To": "=?utf-8?q?Marc-Andr=C3=A9_Lureau?= <marcandre.lureau@redhat.com>",
        "Cc": "qemu-devel@nongnu.org,\n\tGuoHan Zhao <zhaoguohan@kylinos.cn>",
        "Subject": "[PATCH] ui/dbus: associate add_client completion with its request",
        "Date": "Thu, 26 Mar 2026 14:51:11 +0800",
        "Message-ID": "<20260326065111.626236-1-zhaoguohan@kylinos.cn>",
        "X-Mailer": "git-send-email 2.43.0",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Received-SPF": "pass client-ip=124.126.103.232;\n envelope-from=zhaoguohan@kylinos.cn; helo=mailgw.kylinos.cn",
        "X-Spam_score_int": "-18",
        "X-Spam_score": "-1.9",
        "X-Spam_bar": "-",
        "X-Spam_report": "(-1.9 / 5.0 requ) BAYES_00=-1.9,\n RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001,\n SPF_HELO_NONE=0.001, SPF_PASS=-0.001,\n UNPARSEABLE_RELAY=0.001 autolearn=ham autolearn_force=no",
        "X-Spam_action": "no action",
        "X-BeenThere": "qemu-devel@nongnu.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "qemu development <qemu-devel.nongnu.org>",
        "List-Unsubscribe": "<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>",
        "List-Archive": "<https://lists.nongnu.org/archive/html/qemu-devel>",
        "List-Post": "<mailto:qemu-devel@nongnu.org>",
        "List-Help": "<mailto:qemu-devel-request@nongnu.org?subject=help>",
        "List-Subscribe": "<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=subscribe>",
        "Errors-To": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org",
        "Sender": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org"
    },
    "content": "Commit 99997823bbbd (\"ui/dbus: add p2p=on/off option\")\nintroduced an asynchronous D-Bus client setup path, with the completion\nhandler reaching back into the global dbus_display state.\n\nThis makes the callback effectively operate on whatever request is\ncurrent when it runs, rather than the one that created it. A completion\nfrom an older request can therefore clear a newer\nadd_client_cancellable or install its connection after a replacement\nrequest has already been issued. It also relies on the DBusDisplay\ninstance remaining alive until completion.\n\nFix this by passing the DBusDisplay and GCancellable as callback data,\ntaking references while the async setup is in flight, and only acting\non completion if it still matches the current request. Also drop the\nprevious cancellable before creating a new request.\n\nFixes: 99997823bbbd (\"ui/dbus: add p2p=on/off option\")\nSigned-off-by: GuoHan Zhao <zhaoguohan@kylinos.cn>\n---\n ui/dbus.c | 44 ++++++++++++++++++++++++++++++++++++++++----\n 1 file changed, 40 insertions(+), 4 deletions(-)",
    "diff": "diff --git a/ui/dbus.c b/ui/dbus.c\nindex 4f24215555a4..7c54b6a502d2 100644\n--- a/ui/dbus.c\n+++ b/ui/dbus.c\n@@ -263,22 +263,52 @@ dbus_display_complete(UserCreatable *uc, Error **errp)\n     }\n }\n \n+typedef struct DBusDisplayAddClientData {\n+    DBusDisplay *display;\n+    GCancellable *cancellable;\n+} DBusDisplayAddClientData;\n+\n+static void dbus_display_add_client_data_free(DBusDisplayAddClientData *data)\n+{\n+    if (data->display) {\n+        object_unref(OBJECT(data->display));\n+        data->display = NULL;\n+    }\n+    g_clear_object(&data->cancellable);\n+    g_free(data);\n+}\n+\n+G_DEFINE_AUTOPTR_CLEANUP_FUNC(DBusDisplayAddClientData,\n+                              dbus_display_add_client_data_free)\n+\n static void\n dbus_display_add_client_ready(GObject *source_object,\n                               GAsyncResult *res,\n                               gpointer user_data)\n {\n+    g_autoptr(DBusDisplayAddClientData) data = user_data;\n+    DBusDisplay *display = data->display;\n+    bool current = display->add_client_cancellable == data->cancellable;\n     g_autoptr(GError) err = NULL;\n     g_autoptr(GDBusConnection) conn = NULL;\n \n-    g_clear_object(&dbus_display->add_client_cancellable);\n+    if (current) {\n+        g_clear_object(&display->add_client_cancellable);\n+    }\n \n     conn = g_dbus_connection_new_finish(res, &err);\n     if (!conn) {\n-        error_printf(\"Failed to accept D-Bus client: %s\", err->message);\n+        if (!g_error_matches(err, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {\n+            error_printf(\"Failed to accept D-Bus client: %s\", err->message);\n+        }\n+        return;\n     }\n \n-    g_dbus_object_manager_server_set_connection(dbus_display->server, conn);\n+    if (!current) {\n+        return;\n+    }\n+\n+    g_dbus_object_manager_server_set_connection(display->server, conn);\n     g_dbus_connection_start_message_processing(conn);\n }\n \n@@ -290,6 +320,7 @@ dbus_display_add_client(int csock, Error **errp)\n     g_autoptr(GSocket) socket = NULL;\n     g_autoptr(GSocketConnection) conn = NULL;\n     g_autofree char *guid = g_dbus_generate_guid();\n+    DBusDisplayAddClientData *data;\n \n     if (!dbus_display) {\n         error_setg(errp, \"p2p connections not accepted in bus mode\");\n@@ -298,6 +329,7 @@ dbus_display_add_client(int csock, Error **errp)\n \n     if (dbus_display->add_client_cancellable) {\n         g_cancellable_cancel(dbus_display->add_client_cancellable);\n+        g_clear_object(&dbus_display->add_client_cancellable);\n     }\n \n #ifdef WIN32\n@@ -318,6 +350,10 @@ dbus_display_add_client(int csock, Error **errp)\n     conn = g_socket_connection_factory_create_connection(socket);\n \n     dbus_display->add_client_cancellable = g_cancellable_new();\n+    data = g_new0(DBusDisplayAddClientData, 1);\n+    data->display = DBUS_DISPLAY(object_ref(OBJECT(dbus_display)));\n+    data->cancellable = g_object_ref(dbus_display->add_client_cancellable);\n+\n     GDBusConnectionFlags flags =\n         G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_SERVER |\n         G_DBUS_CONNECTION_FLAGS_DELAY_MESSAGE_PROCESSING;\n@@ -332,7 +368,7 @@ dbus_display_add_client(int csock, Error **errp)\n                           NULL,\n                           dbus_display->add_client_cancellable,\n                           dbus_display_add_client_ready,\n-                          NULL);\n+                          data);\n \n     return true;\n }\n",
    "prefixes": []
}