The branch main has been updated by wulf:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=f4f46a2eef3be6d19c65a4ca4ee70f365dd5be4f

commit f4f46a2eef3be6d19c65a4ca4ee70f365dd5be4f
Author:     Matthew Nygard Dodd <matthew.nygard.d...@gmail.com>
AuthorDate: 2024-11-18 04:25:10 +0000
Commit:     Vladimir Kondratyev <w...@freebsd.org>
CommitDate: 2024-11-18 04:31:39 +0000

    hidraw(4): update hgd_actlen in HIDRAW_GET_REPORT ioctl
    
    HIDRAW_GET_REPORT ioctl is documented to update hgd_actlen on return
    with the number of bytes copied.  It does not do this.
    
    Reviewed by:    wulf
    PR:             282790
    MFC after:      1 week
---
 sys/dev/hid/hidraw.c | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/sys/dev/hid/hidraw.c b/sys/dev/hid/hidraw.c
index 6a05b633cfc8..ccfdcdddf545 100644
--- a/sys/dev/hid/hidraw.c
+++ b/sys/dev/hid/hidraw.c
@@ -570,6 +570,7 @@ hidraw_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, 
int flag,
        struct hidraw_devinfo *hd;
        const char *devname;
        uint32_t size;
+       hid_size_t actsize;
        int id, len;
        int error = 0;
 
@@ -747,16 +748,16 @@ hidraw_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, 
int flag,
                }
                size = MIN(hgd->hgd_maxlen, size);
                buf = HIDRAW_LOCAL_ALLOC(local_buf, size);
-               error = hid_get_report(sc->sc_dev, buf, size, NULL,
+               actsize = 0;
+               error = hid_get_report(sc->sc_dev, buf, size, &actsize,
                    hgd->hgd_report_type, id);
                if (!error)
-                       error = copyout(buf, hgd->hgd_data, size);
+                       error = copyout(buf, hgd->hgd_data, actsize);
                HIDRAW_LOCAL_FREE(local_buf, buf);
+               hgd->hgd_actlen = actsize;
 #ifdef COMPAT_FREEBSD32
-               /*
-                * HIDRAW_GET_REPORT is declared _IOWR, but hgd is not written
-                * so we don't call update_hgd32().
-                */
+               if (hgd32 != NULL)
+                       update_hgd32(hgd, hgd32);
 #endif
                return (error);
 

Reply via email to