1
0
Fork 0
mirror of git://git.gnupg.org/gnupg.git synced 2025-07-03 22:56:33 +02:00

common,w32: Implement globing of command line args.

* common/w32-misc.c [W32]: Include windows.h
(struct add_arg_s): New.
(add_arg): New.
(glob_arg): New.
(parse_cmdstring): Add arg argvflags and set it.
(w32_parse_commandline): Add arg r_itemsalloced.  Add globing.

* common/init.c (prepare_w32_commandline): Mark glob created items as
leaked.

* common/t-w32-cmdline.c : Include windows.h
(test_all): Add simple glob test for Unix.
(main): Add manual test mode for Windows.

* common/xasprintf.c (xtryreallocarray): New.
--

GnuPG-bug-id: 4398
Backported-from-master: 089c943967)
This commit is contained in:
Werner Koch 2021-03-04 16:52:03 +01:00
parent 4d6807b215
commit 09f49b4c9a
No known key found for this signature in database
GPG key ID: E3FDFF218E45B72B
6 changed files with 380 additions and 18 deletions

View file

@ -1,5 +1,6 @@
/* xasprintf.c
* Copyright (C) 2003, 2005 Free Software Foundation, Inc.
* Copyright (C) 2020 g10 Code GmbH
*
* This file is part of GnuPG.
*
@ -68,3 +69,55 @@ xtryasprintf (const char *fmt, ...)
return NULL;
return buf;
}
/* This is safe version of realloc useful for reallocing a calloced
* array. There are two ways to call it: The first example
* reallocates the array A to N elements each of SIZE but does not
* clear the newly allocated elements:
*
* p = xtryreallocarray (a, n, n, nsize);
*
* Note that when NOLD is larger than N no cleaning is needed anyway.
* The second example reallocates an array of size NOLD to N elements
* each of SIZE but clear the newly allocated elements:
*
* p = xtryreallocarray (a, nold, n, nsize);
*
* Note that xtryreallocarray (NULL, 0, n, nsize) is equivalent to
* xtrycalloc (n, nsize).
*
* The same function under the name gpgrt_reallocarray exists in
* libgpg-error but only since version 1.38 and thus we use a copy
* here.
*/
void *
xtryreallocarray (void *a, size_t oldnmemb, size_t nmemb, size_t size)
{
size_t oldbytes, bytes;
char *p;
bytes = nmemb * size; /* size_t is unsigned so the behavior on overflow
* is defined. */
if (size && bytes / size != nmemb)
{
gpg_err_set_errno (ENOMEM);
return NULL;
}
p = xtryrealloc (a, bytes);
if (p && oldnmemb < nmemb)
{
/* OLDNMEMBS is lower than NMEMB thus the user asked for a
calloc. Clear all newly allocated members. */
oldbytes = oldnmemb * size;
if (size && oldbytes / size != oldnmemb)
{
xfree (p);
gpg_err_set_errno (ENOMEM);
return NULL;
}
memset (p + oldbytes, 0, bytes - oldbytes);
}
return p;
}