aboutsummaryrefslogtreecommitdiffstats
path: root/g10/expand-group.c
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2019-09-30 12:08:13 +0000
committerWerner Koch <[email protected]>2019-09-30 12:08:13 +0000
commitec81c437e71b4c630a799ed29447cc5e3db162cd (patch)
treee5aa0afafbce4b5f3322b03f0c5c2d19820a28ea /g10/expand-group.c
parentgpg: Fix a recently introduced printf format buglet. (diff)
downloadgnupg-ec81c437e71b4c630a799ed29447cc5e3db162cd.tar.gz
gnupg-ec81c437e71b4c630a799ed29447cc5e3db162cd.zip
gpg: Fix expand GPG groups when resolving a key
* g10/expand-group.c (expand_group): Add arg prepend_input. * g10/pkclist.c (build_pk_list): Adjust for it. * g10/getkey.c (key_byname): Keep the expanded names in the CTX and don't premature free them. (get_pubkey_byname): Append the namelist to the extra_list. -- The original patch didn't kept the expanded list in the context and also would duplicate names which are not group names. The latter does not really harm but the former lead to a use after free. Original patch was applied just a few weeks ago. Fixes-commit: e825aea2ba3529c333d7ec2c76e63998cb83d999 Signed-off-by: Werner Koch <[email protected]>
Diffstat (limited to 'g10/expand-group.c')
-rw-r--r--g10/expand-group.c33
1 files changed, 24 insertions, 9 deletions
diff --git a/g10/expand-group.c b/g10/expand-group.c
index e09a4fff6..ec9c8a2ef 100644
--- a/g10/expand-group.c
+++ b/g10/expand-group.c
@@ -53,21 +53,36 @@ expand_id (const char *id, strlist_t *into, unsigned int flags)
}
/* For simplicity, and to avoid potential loops, we only expand once -
- * you can't make an alias that points to an alias. */
+ * you can't make an alias that points to an alias. If PREPEND_INPUT
+ * is true each item from INPUT is prepended to the new list; if it is
+ * false the original item from INPUT is only added if no group
+ * existed for it. */
strlist_t
-expand_group (strlist_t input)
+expand_group (strlist_t input, int prepend_input)
{
strlist_t output = NULL;
strlist_t sl, rover;
for (rover = input; rover; rover = rover->next)
- if (!(rover->flags & PK_LIST_FROM_FILE)
- && !expand_id (rover->d, &output, rover->flags))
- {
- /* Didn't find any groups, so use the existing string */
- sl = add_to_strlist (&output, rover->d);
- sl->flags = rover->flags;
- }
+ {
+ if ((rover->flags & PK_LIST_FROM_FILE))
+ continue;
+ if (!expand_id (rover->d, &output, rover->flags))
+ {
+ /* Didn't find any groups, so use the existing string unless
+ * we will anyway add it due to the prepend flag. */
+ if (!prepend_input)
+ {
+ sl = add_to_strlist (&output, rover->d);
+ sl->flags = rover->flags;
+ }
+ }
+ if (prepend_input)
+ {
+ sl = add_to_strlist (&output, rover->d);
+ sl->flags = rover->flags;
+ }
+ }
return output;
}