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:
parent
4d6807b215
commit
09f49b4c9a
6 changed files with 380 additions and 18 deletions
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue