[PATCH v2] winemapi: Directly use xdg-email if available, enabling file attachments.

Hans Leidekker hans at codeweavers.com
Mon Nov 21 04:19:24 CST 2016


On Thu, 2016-11-17 at 13:43 -0600, Jeremy White wrote:
> +static ULONG add_argument(char **argv, int *argc, const char *arg, const char *param)
> +{
> +    argv[(*argc)] = HeapAlloc(GetProcessHeap(), 0, strlen(arg) + 1);
> +    if (!argv[(*argc)])
> +        return MAPI_E_INSUFFICIENT_MEMORY;
> +    strcpy(argv[(*argc)++], arg);
> +
> +    if (param)
> +    {
> +        argv[(*argc)] = HeapAlloc(GetProcessHeap(), 0, strlen(param) + 1);
> +        if (!argv[(*argc)])
> +            return MAPI_E_INSUFFICIENT_MEMORY;
> +        strcpy(argv[(*argc)++], param);
> +    }
> +
> +    return SUCCESS_SUCCESS;

This still leaks when the first allocation succeeds and the second fails.

> +static ULONG add_file(char **argv, int *argc, const char *path, const char *file)
> +{
> +    WCHAR *fullname, *p;
> +    char *unixpath;
> +    int namelen = 1;
> +    ULONG ret;
> +
> +    if (path)
> +        namelen += strlen(path) + 1;
> +    if (file)
> +        namelen += strlen(file);
> +
> +    p = fullname = HeapAlloc(GetProcessHeap(), 0, namelen * sizeof(WCHAR));
> +    if (!fullname)
> +        return MAPI_E_INSUFFICIENT_MEMORY;
> +    memset(fullname, 0, namelen * sizeof(WCHAR));

You should pass HEAP_ZERO_MEMORY to HeapAlloc if you need a zero-initialized
block but in this case it's sufficient to initialize the first element of fullname.

> +    if (path)
> +    {
> +        MultiByteToWideChar(CP_ACP, 0, path, -1, p, namelen);
> +        p += strlen(path);
> +        MultiByteToWideChar(CP_ACP, 0, "\\", 1, p, 1);
> +        p++;

This is shorter and doesn't make an assumption about conversion length:

p += MultiByteToWideChar(CP_ACP, 0, path, -1, p, namelen);

> +ULONG XDGSendMail(LHANDLE session, ULONG_PTR uiparam,
> +    lpMapiMessage message, FLAGS flags, ULONG reserved)
> +{
> +    int i;
> +    int argc = 0;
> +    int max_args;
> +    char **argv = NULL;
> +    ULONG ret;
> +
> +    TRACE("(0x%08lx 0x%08lx %p 0x%08x 0x%08x)\n", session, uiparam, message, flags, reserved);
> +
> +    if (!message)
> +        return MAPI_E_FAILURE;
> +
> +    max_args = 1 + (2 + message->nRecipCount + message->nFileCount) * 2;
> +    argv = HeapAlloc(GetProcessHeap(), 0, (max_args + 1) * sizeof(*argv));
> +    if (!argv)
> +        return MAPI_E_INSUFFICIENT_MEMORY;
> +
> +    memset(argv, 0, (max_args + 1) * sizeof(*argv));

See above.





More information about the wine-devel mailing list