--- ntop-current-starting/address.c	Thu Apr  4 11:26:09 2002
+++ ntop-current/address.c	Thu Apr  4 16:17:04 2002
@@ -340,4 +340,5 @@
 #endif
   char tmpBuf[32];
+  int rc;
 
   if(myGlobals.trackOnlyLocalHosts && (!_pseudoLocalAddress(&elem)))
@@ -348,32 +349,40 @@
 #endif
 
-  sprintf(tmpBuf, "%u", elem.s_addr);
-/*
-  key_data.dptr = tmpBuf;
-  key_data.dsize = strlen(tmpBuf)+1;
-*/
+  /* Fix - Burton Strauss (BStrauss@acm.org) 2002-04-04 
+           Make sure tmpBuf has a value and 
+           Prevent increment of queue length on failure (i.e. add of existing value)
+           Incidentally, speed this up by eliminating the fetch/store sequence in favor of
+           a single store.
+   */
   key_data.dptr = (void*)&elem.s_addr;
   key_data.dsize = 4;
 
-  data_data = gdbm_fetch(myGlobals.gdbm_file, key_data);
-
-  if(data_data.dptr == NULL) {
-    data_data.dptr = tmpBuf;
-    data_data.dsize = strlen(tmpBuf)+1;
-
-    if(gdbm_store(myGlobals.addressCache, key_data, data_data, GDBM_REPLACE) != 0)
-    printf("Error while adding address '%s'\n", tmpBuf);
+  sprintf(tmpBuf, "%u", elem.s_addr);
+  data_data.dptr = tmpBuf;
+  data_data.dsize = strlen(tmpBuf)+1;
 
-    myGlobals.addressQueueLen++;
-    if(myGlobals.addressQueueLen > myGlobals.maxAddressQueueLen) myGlobals.maxAddressQueueLen = myGlobals.addressQueueLen;
+  rc = gdbm_store(myGlobals.addressCache, key_data, data_data, GDBM_INSERT);
 
+  if (rc == 0) {
+      myGlobals.addressQueueLen++;
+      if (myGlobals.addressQueueLen > myGlobals.maxAddressQueueLen) 
+          myGlobals.maxAddressQueueLen = myGlobals.addressQueueLen;
 #ifdef DNS_DEBUG
-   traceEvent(TRACE_INFO, "Queued address '%s' [addr queue=%d/max=%d]\n",
-	      tmpBuf, myGlobals.addressQueueLen, myGlobals.maxAddressQueueLen);
+      traceEvent(TRACE_INFO, "Queued address '%s' [addr queue=%d/max=%d]\n",
+                 tmpBuf, myGlobals.addressQueueLen, myGlobals.maxAddressQueueLen);
 #endif
   } else {
-      if(data_data.dptr != NULL)  /* Address already in queue */ 
-	  free(data_data.dptr);
+      /* rc = 1 is duplicate key, which is fine.  Other codes are problems... */
+      if (rc != 1) {
+          traceEvent(TRACE_WARNING, "Failed(%d): Queue address '%s' [addr queue=%d/max=%d] (processing continues)\n",
+                     rc, tmpBuf, myGlobals.addressQueueLen, myGlobals.maxAddressQueueLen);
+      } 
+#ifdef DNS_DEBUG
+        else {
+          traceEvent(TRACE_INFO, "Queuing of address '%s' - duplicate in queue (ntop continues ok)\n",                     tmpBuf);
+      }
+#endif
   }
+
 #ifdef MULTITHREADED
   releaseMutex(&myGlobals.gdbmMutex);
@@ -441,4 +450,11 @@
     }
 
+#ifdef DNS_DEBUG
+   if ( (data_data.dptr == NULL) && (myGlobals.addressQueueLen > 0) ) {
+       traceEvent(TRACE_INFO, "firstkey/nextkey for returned null, but address queue length is %d\n",
+                  myGlobals.addressQueueLen);
+   }
+#endif
+
   if(data_data.dptr != NULL) {
       myGlobals.addressQueueLen--;
@@ -471,5 +487,5 @@
   } /* endless loop */
 
-  traceEvent(TRACE_INFO, "Address resultion terminated...");
+  traceEvent(TRACE_INFO, "Address resolution terminated...");
   return(NULL); /* NOTREACHED */
 }
