From e9d6f612e9d7a4180599c0e5315144e004e3a010 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Niels=20M=C3=B6ller?= <nisse@lysator.liu.se>
Date: Sat, 28 Sep 2002 18:04:16 +0200
Subject: [PATCH] (sexp_iterator_assoc): Return 0 for missing or duplicate
 keys.

Rev: src/nettle/sexp.c:1.3
---
 sexp.c | 21 +++++++++++++++++++--
 1 file changed, 19 insertions(+), 2 deletions(-)

diff --git a/sexp.c b/sexp.c
index 194e23cf..bd60e29c 100644
--- a/sexp.c
+++ b/sexp.c
@@ -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();
-- 
GitLab