Commit e9d6f612 authored by Niels Möller's avatar Niels Möller

(sexp_iterator_assoc): Return 0 for missing or duplicate keys.

Rev: src/nettle/sexp.c:1.3
parent 2b7af82f
......@@ -192,9 +192,19 @@ sexp_iterator_assoc(struct sexp_iterator *iterator,
const struct sexp_assoc_key *keys,
struct sexp_iterator *values)
{
int *found;
unsigned nfound;
unsigned i;
if (!sexp_iterator_enter_list(iterator))
return 0;
found = alloca(nkeys * sizeof(*found));
for (i = 0; i<nkeys; i++)
found[i] = 0;
nfound = 0;
for (;;)
{
if (!sexp_iterator_next(iterator))
......@@ -212,13 +222,19 @@ sexp_iterator_assoc(struct sexp_iterator *iterator,
&& !iterator->display)
{
/* Compare to the given keys */
unsigned i;
for (i = 0; i<nkeys; i++)
{
if (keys[i].length == iterator->atom_length
&& !memcmp(keys[i].name, iterator->atom,
keys[i].length))
{
if (found[i])
/* We don't allow duplicates */
return 0;
found[i] = 1;
nfound++;
/* Record this position. */
values[i] = *iterator;
......@@ -234,7 +250,8 @@ sexp_iterator_assoc(struct sexp_iterator *iterator,
break;
case SEXP_END:
return sexp_iterator_exit_list(iterator);
return sexp_iterator_exit_list(iterator)
&& (nfound == nkeys);
default:
abort();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment