From 3dee8895ec0f686504c276746a1793dd44b638ef Mon Sep 17 00:00:00 2001 From: akallabeth Date: Thu, 22 May 2025 11:17:00 +0200 Subject: [PATCH] [rdpdr,hotplug] fix passing of device::Id back to caller --- channels/drive/client/drive_main.c | 9 ++++++--- channels/rdpdr/client/devman.c | 2 +- channels/rdpdr/client/devman.h | 2 +- channels/rdpdr/client/rdpdr_main.c | 5 +++-- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/channels/drive/client/drive_main.c b/channels/drive/client/drive_main.c index 70daacb8d..d4302f90a 100644 --- a/channels/drive/client/drive_main.c +++ b/channels/drive/client/drive_main.c @@ -932,8 +932,10 @@ static void drive_message_free(void* obj) * @return 0 on success, otherwise a Win32 error code */ static UINT drive_register_drive_path(PDEVICE_SERVICE_ENTRY_POINTS pEntryPoints, const char* name, - const char* path, BOOL automount) + const char* path, BOOL automount, uint32_t* pid) { + WINPR_ASSERT(pid); + size_t length = 0; DRIVE_DEVICE* drive = NULL; UINT error = ERROR_INTERNAL_ERROR; @@ -1035,6 +1037,7 @@ static UINT drive_register_drive_path(PDEVICE_SERVICE_ENTRY_POINTS pEntryPoints, WLog_ERR(TAG, "RegisterDevice failed with error %" PRIu32 "!", error); goto out_error; } + *pid = drive->device.id; drive->async = !freerdp_settings_get_bool(drive->rdpcontext->settings, FreeRDP_SynchronousStaticChannels); @@ -1104,8 +1107,8 @@ FREERDP_ENTRY_POINT( } } - error = - drive_register_drive_path(pEntryPoints, drive->device.Name, drive->Path, drive->automount); + error = drive_register_drive_path(pEntryPoints, drive->device.Name, drive->Path, + drive->automount, &drive->device.Id); #else /* Special case: path[0] == '*' -> export all drives */ /* Special case: path[0] == '%' -> user home dir */ diff --git a/channels/rdpdr/client/devman.c b/channels/rdpdr/client/devman.c index 5da3a410a..df48292be 100644 --- a/channels/rdpdr/client/devman.c +++ b/channels/rdpdr/client/devman.c @@ -182,7 +182,7 @@ static const char PARALLEL_SERVICE_NAME[] = "parallel"; * * @return 0 on success, otherwise a Win32 error code */ -UINT devman_load_device_service(DEVMAN* devman, const RDPDR_DEVICE* device, rdpContext* rdpcontext) +UINT devman_load_device_service(DEVMAN* devman, RDPDR_DEVICE* device, rdpContext* rdpcontext) { const char* ServiceName = NULL; DEVICE_SERVICE_ENTRY_POINTS ep = { 0 }; diff --git a/channels/rdpdr/client/devman.h b/channels/rdpdr/client/devman.h index 2e6019e6d..060038c9b 100644 --- a/channels/rdpdr/client/devman.h +++ b/channels/rdpdr/client/devman.h @@ -26,7 +26,7 @@ #include "rdpdr_main.h" void devman_unregister_device(DEVMAN* devman, void* key); -UINT devman_load_device_service(DEVMAN* devman, const RDPDR_DEVICE* device, rdpContext* rdpcontext); +UINT devman_load_device_service(DEVMAN* devman, RDPDR_DEVICE* device, rdpContext* rdpcontext); DEVICE* devman_get_device_by_id(DEVMAN* devman, UINT32 id); DEVICE* devman_get_device_by_type(DEVMAN* devman, UINT32 type); diff --git a/channels/rdpdr/client/rdpdr_main.c b/channels/rdpdr/client/rdpdr_main.c index f1d200d3c..66b6b7a9a 100644 --- a/channels/rdpdr/client/rdpdr_main.c +++ b/channels/rdpdr/client/rdpdr_main.c @@ -1163,8 +1163,8 @@ static UINT rdpdr_add_devices(rdpdrPlugin* rdpdr) for (UINT32 index = 0; index < freerdp_settings_get_uint32(settings, FreeRDP_DeviceCount); index++) { - const RDPDR_DEVICE* device = - freerdp_settings_get_pointer_array(settings, FreeRDP_DeviceArray, index); + RDPDR_DEVICE* device = + freerdp_settings_get_pointer_array_writable(settings, FreeRDP_DeviceArray, index); WINPR_ASSERT(device); if (device->Type == RDPDR_DTYP_FILESYSTEM) @@ -2325,6 +2325,7 @@ static UINT rdpdr_register_device(RdpdrClientContext* context, const RDPDR_DEVIC return ERROR_INVALID_DATA; UINT rc = devman_load_device_service(rdpdr->devman, copy, rdpdr->rdpcontext); *pid = copy->Id; + freerdp_device_free(copy); if (rc == CHANNEL_RC_OK) rc = rdpdr_try_send_device_list_announce_request(rdpdr); return rc;