[PATCH v6 4/4] ntdll: Allow renaming a file/directory to a different casing of itself.

Rémi Bernon rbernon at codeweavers.com
Fri Apr 23 05:44:02 CDT 2021


On 4/22/21 3:00 PM, Gabriel Ivăncescu wrote:
>   
> +/***********************************************************************
> + *           nt_to_unix_file_name_with_casing
> + *
> + * Same as nt_to_unix_file_name, but additionally return unix file name
> + * without path, with the original casing from the NT file name.
> + */
> +static NTSTATUS nt_to_unix_file_name_with_casing( const OBJECT_ATTRIBUTES *attr, char **name_ret,
> +                                                  char **casing_ret, UINT disposition )
> +{
> +    const WCHAR *nt_filename = attr->ObjectName->Buffer + attr->ObjectName->Length / sizeof(WCHAR);
> +    NTSTATUS status;
> +    char *casing;
> +    int len;
> +
> +    /* NT name may not be NUL terminated; look for last \ character */
> +    for (; nt_filename != attr->ObjectName->Buffer; nt_filename--)
> +        if (nt_filename[-1] == '\\')
> +            break;
> +    len = attr->ObjectName->Buffer + attr->ObjectName->Length / sizeof(WCHAR) - nt_filename;
> +

Nitpick: You could make it a bit less verbose by using len to store

   attr->ObjectName->Length / sizeof(WCHAR)

instead of duplicating it here and above (initializing nt_filename in 
the for, maybe).

> +    if (!(casing = malloc( len * 3 ))) return STATUS_NO_MEMORY;
> +
> +    status = nt_to_unix_file_name( attr, name_ret, disposition );
> +    if (status != STATUS_SUCCESS && status != STATUS_NO_SUCH_FILE)
> +    {
> +        free(casing);

Nitpick: it should probably be "free( casing )" to be consistent.

> +        return status;
> +    }
> +
> +    len = ntdll_wcstoumbs( nt_filename, len, casing, len * 3, TRUE );
> +    if (len > 0)
> +        casing[len] = 0;

Not a nitpick: we probably need +1 for the zero-termination in the 
malloc for the worst case?

Otherwise I think it looks nice.
-- 
Rémi Bernon <rbernon at codeweavers.com>



More information about the wine-devel mailing list