Module: wine Branch: master Commit: 134feaab05ae382aabc14aeb9268a6e68f035a38 URL: http://source.winehq.org/git/wine.git/?a=commit;h=134feaab05ae382aabc14aeb92...
Author: Alexandre Julliard julliard@winehq.org Date: Wed Jul 22 21:02:47 2009 +0200
mountmgr: Return a copy of the strings in query_dos_device.
---
dlls/mountmgr.sys/device.c | 7 +++---- dlls/mountmgr.sys/mountmgr.c | 10 +++++++--- dlls/mountmgr.sys/mountmgr.h | 3 +-- 3 files changed, 11 insertions(+), 9 deletions(-)
diff --git a/dlls/mountmgr.sys/device.c b/dlls/mountmgr.sys/device.c index 20a7826..bdade97 100644 --- a/dlls/mountmgr.sys/device.c +++ b/dlls/mountmgr.sys/device.c @@ -807,8 +807,7 @@ NTSTATUS remove_dos_device( int letter, const char *udi ) }
/* query information about an existing dos drive, by letter or udi */ -NTSTATUS query_dos_device( int letter, enum device_type *type, - const char **device, const char **mount_point ) +NTSTATUS query_dos_device( int letter, enum device_type *type, char **device, char **mount_point ) { struct dos_drive *drive; struct disk_device *disk_device; @@ -818,8 +817,8 @@ NTSTATUS query_dos_device( int letter, enum device_type *type, if (drive->drive != letter) continue; disk_device = drive->volume->device; if (type) *type = disk_device->type; - if (device) *device = disk_device->unix_device; - if (mount_point) *mount_point = disk_device->unix_mount; + if (device) *device = strdupA( disk_device->unix_device ); + if (mount_point) *mount_point = strdupA( disk_device->unix_mount ); return STATUS_SUCCESS; } return STATUS_NO_SUCH_DEVICE; diff --git a/dlls/mountmgr.sys/mountmgr.c b/dlls/mountmgr.sys/mountmgr.c index bbf5d64..a80d492 100644 --- a/dlls/mountmgr.sys/mountmgr.c +++ b/dlls/mountmgr.sys/mountmgr.c @@ -276,7 +276,7 @@ static NTSTATUS query_unix_drive( const void *in_buff, SIZE_T insize, { const struct mountmgr_unix_drive *input = in_buff; struct mountmgr_unix_drive *output = out_buff; - const char *device, *mount_point; + char *device, *mount_point; int letter = tolowerW( input->letter ); NTSTATUS status; DWORD size, type = DEVICE_UNKNOWN; @@ -314,7 +314,8 @@ static NTSTATUS query_unix_drive( const void *in_buff, SIZE_T insize, output->type = type; iosb->Information = FIELD_OFFSET( struct mountmgr_unix_drive, type ) + sizeof(output->type); } - return STATUS_MORE_ENTRIES; + status = STATUS_MORE_ENTRIES; + goto done; } output->size = size; output->letter = letter; @@ -341,7 +342,10 @@ static NTSTATUS query_unix_drive( const void *in_buff, SIZE_T insize, letter, debugstr_a(device), debugstr_a(mount_point), type );
iosb->Information = ptr - (char *)output; - return STATUS_SUCCESS; +done: + RtlFreeHeap( GetProcessHeap(), 0, device ); + RtlFreeHeap( GetProcessHeap(), 0, mount_point ); + return status; }
/* handler for ioctls on the mount manager device */ diff --git a/dlls/mountmgr.sys/mountmgr.h b/dlls/mountmgr.sys/mountmgr.h index 0ba1086..3d57ba1 100644 --- a/dlls/mountmgr.sys/mountmgr.h +++ b/dlls/mountmgr.sys/mountmgr.h @@ -57,8 +57,7 @@ extern NTSTATUS remove_volume( const char *udi ); extern NTSTATUS add_dos_device( int letter, const char *udi, const char *device, const char *mount_point, enum device_type type, const GUID *guid ); extern NTSTATUS remove_dos_device( int letter, const char *udi ); -extern NTSTATUS query_dos_device( int letter, enum device_type *type, - const char **device, const char **mount_point ); +extern NTSTATUS query_dos_device( int letter, enum device_type *type, char **device, char **mount_point ); extern NTSTATUS WINAPI harddisk_driver_entry( DRIVER_OBJECT *driver, UNICODE_STRING *path );
/* mount point functions */