From nobody Tue May 05 15:48:44 2026 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4g92x85CRCz6cKYK for ; Tue, 05 May 2026 15:48:44 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R13" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4g92x84bMVz3mhF for ; Tue, 05 May 2026 15:48:44 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1777996124; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=7TM53kVeIKjv1fMaRkZbKGfxAGApDLYrUVnrhIvJx6w=; b=Nkg+B6VlDrmu60QOSk3xawDwGLwRmElI1gah7jct/Ml9cbNjkjcsB+OtnXErlNKRdzi8rZ kHvpmT+8qiYPuzDXJWbxkoBigXVGhgx8+siG4WtCSNLkI3lT8aiPP5KtVBYOKCGQ+aDt5k pcbMbXryBEUxa09MnlCIeuIBqwGcXhXaFkmMXDrgsPj4X1Mlv1H5DkZYDZP6NYHw7//PEp VO7D5jltpJOaJfTw6AGD+zWHGzVLAj9cUX2hS6ZTf4rGkzqodwsAFYPl/be87fbvYZ4bDr +pWO1Xcb91qwJP0JoYXN4R3fXJRXqO8K5icxSPO10ZvK4EQFB/BNsiPYk9I5dw== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1777996124; a=rsa-sha256; cv=none; b=qB2mfYJgjRYAfAG8Kz7I0HTn3zRnn7iKANK/CtVJ+otO8SCCYFq2YaMzz8Dt1y1CxnSwVa ioh5zcNUS9GxVcCVcYw9sEqH0t4IzCl3J02MdTHlGH/KQyfXFzOPcyc/JJwtFJKrGkESaP zTNuavc6H3nrxp5NmPYagArG01BlUoAqj2MvlBHLovAx1F52CgS6KLFQxTGRpFvu3qOtW1 5OZn9loAM7u7l0BP+F4mPQBiYd2I1/jHtuNWCxLNBsSZH7jInIEES0I50E3iycgwOcKQb2 7hzbKFIqhNm/21eiTxJ46vpaX7pR/f2UdGXUwefkyW5yQ0h3u06cncH/T+roMg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1777996124; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=7TM53kVeIKjv1fMaRkZbKGfxAGApDLYrUVnrhIvJx6w=; b=rHvJmVb6ebBa7SOyPoLhSqQ2Fyg3MZHgssTmt1qdK0nYpOlYD5xPHqaGSaNdHutHRTfSsn zKDrO5TI8vblsOERvdWbHs7IVC88Ys1B6JNKxFzD18M1cZjpbikDt9/SredGZmRqGPXnn9 BlMkgEaPsCIdcNaEx3BdfmTrO/GHKvTx7BxtKnM5CLJROXMy10v8nc3Hp6ZyT9PkOH89fq IEyRCICPiQglDWcuMi7s8GL+5Ql4AMoYAsKZootWV+SkBS5QXA/dRTQKhcRKBmBDJU9+s0 MeD/9NNC6FZoZHlhl5EC8QAkmnFnI9A+zailwiz1gh7am24CubpG2UbK9UC1rw== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4g92x848Yfz1CRZ for ; Tue, 05 May 2026 15:48:44 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 1eae4 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Tue, 05 May 2026 15:48:44 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: ShengYi Hung Subject: git: ce9ced951a0b - main - libusb: change callback register handler to int List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: aokblast X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: ce9ced951a0b9d004a3b007d4ac6e9087a1301a2 Auto-Submitted: auto-generated Date: Tue, 05 May 2026 15:48:44 +0000 Message-Id: <69fa115c.1eae4.306694d3@gitrepo.freebsd.org> The branch main has been updated by aokblast: URL: https://cgit.FreeBSD.org/src/commit/?id=ce9ced951a0b9d004a3b007d4ac6e9087a1301a2 commit ce9ced951a0b9d004a3b007d4ac6e9087a1301a2 Author: ShengYi Hung AuthorDate: 2025-12-13 15:12:11 +0000 Commit: ShengYi Hung CommitDate: 2026-05-05 15:48:22 +0000 libusb: change callback register handler to int libusb upstream uses int for register handler. This causes some library user (like pyusb) to assume that we have int in all implementations and therefore provides a 4 byte storage only. This causes Segmentation fault as we will right the pointer. Reviewed by: adrian Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D54211 --- lib/libusb/libusb.h | 5 ++--- lib/libusb/libusb10.c | 1 + lib/libusb/libusb10.h | 2 ++ lib/libusb/libusb10_hotplug.c | 50 +++++++++++++++++++++++++++---------------- 4 files changed, 37 insertions(+), 21 deletions(-) diff --git a/lib/libusb/libusb.h b/lib/libusb/libusb.h index 46a2ed5eb8a6..ec60ce336e5a 100644 --- a/lib/libusb/libusb.h +++ b/lib/libusb/libusb.h @@ -293,7 +293,6 @@ struct libusb_context; struct libusb_device; struct libusb_transfer; struct libusb_device_handle; -struct libusb_hotplug_callback_handle_struct; struct libusb_pollfd { int fd; @@ -322,7 +321,7 @@ typedef struct libusb_device_handle libusb_device_handle; typedef struct libusb_pollfd libusb_pollfd; typedef void (*libusb_pollfd_added_cb) (int fd, short events, void *user_data); typedef void (*libusb_pollfd_removed_cb) (int fd, void *user_data); -typedef struct libusb_hotplug_callback_handle_struct *libusb_hotplug_callback_handle; +typedef int libusb_hotplug_callback_handle; typedef struct libusb_device_descriptor { uint8_t bLength; @@ -632,7 +631,7 @@ typedef int (*libusb_hotplug_callback_fn)(libusb_context *ctx, libusb_device *device, libusb_hotplug_event event, void *user_data); int libusb_hotplug_register_callback(libusb_context *ctx, libusb_hotplug_event events, libusb_hotplug_flag flags, int vendor_id, int product_id, int dev_class, libusb_hotplug_callback_fn cb_fn, void *user_data, libusb_hotplug_callback_handle *handle); -void libusb_hotplug_deregister_callback(libusb_context *ctx, libusb_hotplug_callback_handle handle); +void libusb_hotplug_deregister_callback(libusb_context *ctx, libusb_hotplug_callback_handle callback_handle); void *libusb_hotplug_get_user_data(struct libusb_context *ctx, libusb_hotplug_callback_handle callback_handle); diff --git a/lib/libusb/libusb10.c b/lib/libusb/libusb10.c index b3af017ab980..08e40541a907 100644 --- a/lib/libusb/libusb10.c +++ b/lib/libusb/libusb10.c @@ -205,6 +205,7 @@ libusb_init_context(libusb_context **context, memset(ctx, 0, sizeof(*ctx)); ctx->devd_pipe = -1; + ctx->next_callback_id = 1; debug = getenv("LIBUSB_DEBUG"); if (debug != NULL) { diff --git a/lib/libusb/libusb10.h b/lib/libusb/libusb10.h index eced364ef857..354ff003de3e 100644 --- a/lib/libusb/libusb10.h +++ b/lib/libusb/libusb10.h @@ -80,6 +80,7 @@ struct libusb_hotplug_callback_handle_struct { int devclass; libusb_hotplug_callback_fn fn; void *user_data; + int id; }; TAILQ_HEAD(libusb_device_head, libusb_device); @@ -118,6 +119,7 @@ struct libusb_context { libusb_pollfd_added_cb fd_added_cb; libusb_pollfd_removed_cb fd_removed_cb; void *fd_cb_user_data; + int next_callback_id; }; struct libusb_device { diff --git a/lib/libusb/libusb10_hotplug.c b/lib/libusb/libusb10_hotplug.c index 359c818b5720..fd979fd4db14 100644 --- a/lib/libusb/libusb10_hotplug.c +++ b/lib/libusb/libusb10_hotplug.c @@ -176,8 +176,9 @@ libusb_hotplug_equal(libusb_device *_adev, libusb_device *_bdev) } static int -libusb_hotplug_filter(libusb_context *ctx, libusb_hotplug_callback_handle pcbh, - libusb_device *dev, libusb_hotplug_event event) +libusb_hotplug_filter(libusb_context *ctx, + struct libusb_hotplug_callback_handle_struct *pcbh, libusb_device *dev, + libusb_hotplug_event event) { if (!(pcbh->events & event)) return (0); @@ -216,8 +217,7 @@ libusb_hotplug_scan(void *arg) { struct pollfd pfd; struct libusb_device_head hotplug_devs; - libusb_hotplug_callback_handle acbh; - libusb_hotplug_callback_handle bcbh; + struct libusb_hotplug_callback_handle_struct *acbh, *bcbh; libusb_context *ctx = arg; libusb_device *temp; libusb_device *adev; @@ -343,7 +343,7 @@ int libusb_hotplug_register_callback(libusb_context *ctx, libusb_hotplug_callback_fn cb_fn, void *user_data, libusb_hotplug_callback_handle *phandle) { - libusb_hotplug_callback_handle handle; + struct libusb_hotplug_callback_handle_struct *handle; struct libusb_device *adev; ctx = GET_CONTEXT(ctx); @@ -365,6 +365,17 @@ int libusb_hotplug_register_callback(libusb_context *ctx, if (handle == NULL) return (LIBUSB_ERROR_NO_MEM); + handle->events = events; + handle->vendor = vendor_id; + handle->product = product_id; + handle->devclass = dev_class; + handle->fn = cb_fn; + handle->user_data = user_data; + CTX_LOCK(ctx); + if ((handle->id = ctx->next_callback_id++) < 0) + handle->id = ctx->next_callback_id = 1; + CTX_UNLOCK(ctx); + HOTPLUG_LOCK(ctx); if (ctx->hotplug_handler == NO_THREAD) { libusb_hotplug_enumerate(ctx, &ctx->hotplug_devs); @@ -373,12 +384,6 @@ int libusb_hotplug_register_callback(libusb_context *ctx, &libusb_hotplug_scan, ctx) != 0) ctx->hotplug_handler = NO_THREAD; } - handle->events = events; - handle->vendor = vendor_id; - handle->product = product_id; - handle->devclass = dev_class; - handle->fn = cb_fn; - handle->user_data = user_data; if (flags & LIBUSB_HOTPLUG_ENUMERATE) { TAILQ_FOREACH(adev, &ctx->hotplug_devs, hotplug_entry) { @@ -395,23 +400,32 @@ int libusb_hotplug_register_callback(libusb_context *ctx, HOTPLUG_UNLOCK(ctx); if (phandle != NULL) - *phandle = handle; + *phandle = handle->id; return (LIBUSB_SUCCESS); } void libusb_hotplug_deregister_callback(libusb_context *ctx, - libusb_hotplug_callback_handle handle) + libusb_hotplug_callback_handle callback_handle) { - ctx = GET_CONTEXT(ctx); + struct libusb_hotplug_callback_handle_struct *handle; - if (ctx == NULL || handle == NULL) + ctx = GET_CONTEXT(ctx); + + if (ctx == NULL || callback_handle == 0) return; HOTPLUG_LOCK(ctx); + TAILQ_FOREACH(handle, &ctx->hotplug_cbh, entry) { + if (handle->id == callback_handle) + break; + } + if (handle == NULL) + goto clean; TAILQ_REMOVE(&ctx->hotplug_cbh, handle, entry); libusb_interrupt_event_handler(ctx); - HOTPLUG_UNLOCK(ctx); +clean: + HOTPLUG_UNLOCK(ctx); free(handle); } @@ -419,13 +433,13 @@ void * libusb_hotplug_get_user_data(struct libusb_context *ctx, libusb_hotplug_callback_handle callback_handle) { - libusb_hotplug_callback_handle handle; + struct libusb_hotplug_callback_handle_struct *handle; ctx = GET_CONTEXT(ctx); HOTPLUG_LOCK(ctx); TAILQ_FOREACH(handle, &ctx->hotplug_cbh, entry) { - if (handle == callback_handle) + if (handle->id == callback_handle) break; } HOTPLUG_UNLOCK(ctx);