--- search.c.orig	Fri Sep 28 23:34:23 2001
+++ search.c	Tue Oct 16 18:14:04 2001
@@ -304,6 +304,9 @@ free_datum (DATUM * d)
 {
     int i;
     TokenRef *ref;
+#if RESUME
+    FileList *flist;
+#endif
 
     for (i = 0; i < d->numTokens; i++)
     {
@@ -342,13 +345,31 @@ free_datum (DATUM * d)
 
     FREE (d->tokens);
 
-    /* XXX broken */
 #if RESUME
     flist = hash_lookup (MD5, d->hash);
     if (flist)
     {
+	DList *list;
+
 	ASSERT (validate_flist (flist));
-	flist->list = list_delete (flist->list, d);
+	for (list = flist->list; list; list = list->next)
+	{
+	    if (list->data == d)
+	    {
+		if (list->prev)
+		    list->prev->next =  list->next;
+		else
+		{
+		    /* element is head of list, update the flist pointer */
+		    flist->list = list->next;
+		}
+		if (list->next)
+		    list->next->prev = list->prev;
+		FREE (list);
+		break;
+	    }
+	}
+
 	flist->count--;
 	/* if there are no more files in this bin, erase it */
 	if (flist->count == 0)
@@ -944,6 +965,13 @@ HANDLER (search)
 	return;
     }
 
+    /* NO SOUP FOR YOU!!! */
+    if (con->user->level == LEVEL_LEECH)
+    {
+	send_cmd (con, MSG_SERVER_SEARCH_END, "");
+	return;
+    }
+
     /* if Max_Searches is > 0, we only allow clients to have a certain small
      * number of pending search requests.  Some abusive clients will tend
      * to issues multiple search requests at a time.
@@ -1015,6 +1043,13 @@ HANDLER (remote_search)
     if (! option (ON_ALLOW_SHARE))
     {
 	/* sharing is not allowed on this server */
+	send_cmd (con, MSG_SERVER_REMOTE_SEARCH_END, "%s", id);
+	return;
+    }
+
+    if (user->level == LEVEL_LEECH)
+    {
+	/* user is not allowed to search this server */
 	send_cmd (con, MSG_SERVER_REMOTE_SEARCH_END, "%s", id);
 	return;
     }
