From nobody Tue May 05 15:48:44 2026 X-Original-To: dev-commits-src-all@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 4g92xF6ZJjz6cK7P for ; Tue, 05 May 2026 15:48:49 +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 4g92xF5ffvz3mmc for ; Tue, 05 May 2026 15:48:49 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1777996129; 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=LJ5AzU7AKE5rKNzX4b9VaxTgYDdfNOP0qNswK0EvWJWdknp2QOotE3EouMoZv+CsCqU3MT P4eR+k+bPlQ2nzeFkTMV7WfNC+Rl7mpTssklkRI8ExUPBsqD5sVwsj2HpUk3NBWqm2vv8T LImwLmMjCSzbmyBA/pyMLB97XWWctJ5QeYA00cvmsEwKuYjNYyHyiuHj2Cfebu1VHlU4x8 RNpG4CdCCSNC0T8QY1OjdJTpl8KHCio4LsdpcLvrQo+N7OyrXADWkXiGryQhiu/m8l+TVg /rA+sI6DqFoPXcadjGkgWMC8v4CI2kL3AUw2FOWyfedlgwy27tvvGMBsE1qVNQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1777996129; a=rsa-sha256; cv=none; b=NVcabfWdD4MmftUNN7Cdq6Vrcz7Bu2dnhUVt1LzsQ+uxDde1hXqitF2UZoAOSb4gXUQFnn UWEiqU2Zl/qZvNmBAPrwgX/WIV61Eo5DpnM8YZ9h0FWLsQdo2CJ5br7AXgUCCnJo/qtMcG ZJbnbPcbpiEp7TC3mvZ95yQAq9inRTsJFqMRy2QFsVDLzBYVrfIvUowL3hhQpmH5HVGjcv njAp/Z0huheqKD1rg1F9wfeNyMD0XkFgBT6mrhzqqOnQ+zfqDHMqFnmE9D/Ls5emx2TxDw hbonASHw7+65Q3EgvpA6KN5um3nTFLxXj0ONEtz9YWwXQCJ+gTxyQ+4htZPeDw== 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=1777996129; 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=AnB5yOT8Syd8uh0Bq46FOQOSx1inL3lEXcjUrGfwm9LRWCyXnY4psMQmR7LiJMKYI5aTI6 gNESbbYBd+mddIe2a4oLuwnxPP4BcIJFeuuAxqKZ30f+e9dVlgkVFiwNR4hoNFnucQx4sZ 9OWMCA/ddTneNf5WuohVucDayJe6ZKCfh/w7DpBokvRDFPC3HptaAu+LbV6U6RjDCXusyN YNFbiY+srZ1Rrzh0//HaxLLqQIseVNnExz1m/EVrsE5bV84xGxpRbrEdE2q3LJtsHjnUbo R6vXfutTjvqNma/zBDVSgKV/fk4eoA52v5sFdjtmgd7F8HmcGfJ+0fizte6H6w== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4g92xF5GZZz1C2C for ; Tue, 05 May 2026 15:48:49 +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 all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@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);