mirror of git://sourceware.org/git/glibc.git
argp: Fix shift bug
From gnulib commits 06094e390b0 and 88033d3779362a. Reviewed-by: Florian Weimer <fweimer@redhat.com>
This commit is contained in:
parent
7c00a20397
commit
1642570563
|
@ -735,12 +735,15 @@ parser_parse_opt (struct parser *parser, int opt, char *val)
|
|||
}
|
||||
}
|
||||
else
|
||||
/* A long option. We use shifts instead of masking for extracting
|
||||
the user value in order to preserve the sign. */
|
||||
err =
|
||||
group_parse (&parser->groups[group_key - 1], &parser->state,
|
||||
(opt << GROUP_BITS) >> GROUP_BITS,
|
||||
parser->opt_data.optarg);
|
||||
/* A long option. Preserve the sign in the user key, without
|
||||
invoking undefined behavior. Assume two's complement. */
|
||||
{
|
||||
int user_key =
|
||||
((opt & (1 << (USER_BITS - 1))) ? ~USER_MASK : 0) | (opt & USER_MASK);
|
||||
err =
|
||||
group_parse (&parser->groups[group_key - 1], &parser->state,
|
||||
user_key, parser->opt_data.optarg);
|
||||
}
|
||||
|
||||
if (err == EBADKEY)
|
||||
/* At least currently, an option not recognized is an error in the
|
||||
|
|
Loading…
Reference in New Issue