dir: do not leak contents of deleted directory entries
[openafs.git] / src / dir / dir.c
index 570c2db..6db96b2 100644 (file)
@@ -13,7 +13,9 @@
 #ifdef KERNEL
 # if !defined(UKERNEL)
 #  include "h/types.h"
-#  include "h/param.h"
+#  if !defined(AFS_LINUX26_ENV)
+#   include "h/param.h"
+#  endif
 #  ifdef       AFS_AUX_ENV
 #   include "h/mmu.h"
 #   include "h/seg.h"
@@ -189,7 +191,9 @@ afs_dir_Delete(dir_file_t dir, char *entry)
     DRelease(&prevbuf, 1);
     index = DVOffset(&entrybuf) / 32;
     nitems = afs_dir_NameBlobs(firstitem->name);
-    DRelease(&entrybuf, 0);
+    /* Clear entire DirEntry and any DirXEntry extensions */
+    memset(firstitem, 0, nitems * sizeof(*firstitem));
+    DRelease(&entrybuf, 1);
     FreeBlobs(dir, index, nitems);
     return 0;
 }
@@ -235,7 +239,6 @@ FindBlobs(dir_file_t dir, int nblobs)
 
            /* read the page in. */
            if (DRead(dir, i, &pagebuf) != 0) {
-               DRelease(&headerbuf, 1);
                break;
            }
            pp = (struct PageHeader *)pagebuf.data;
@@ -434,8 +437,10 @@ afs_dir_EnumerateDir(dir_file_t dir, int (*proc) (void *, char *name,
                goto out;
 
            ep = (struct DirEntry *)entrybuf.data;
-           if (!ep)
+           if (!ep) {
+               DRelease(&entrybuf, 0);
                break;
+           }
 
            num = ntohs(ep->next);
            code = (*proc) (hook, ep->name, ntohl(ep->fid.vnode),
@@ -473,7 +478,7 @@ afs_dir_IsEmpty(dir_file_t dir)
        while (num != 0 && elements < BIGMAXPAGES * EPP) {
            elements++;
            /* Walk down the hash table list. */
-           if (afs_dir_GetVerifiedBlob(dir, num, &entrybuf) != 0);
+           if (afs_dir_GetVerifiedBlob(dir, num, &entrybuf) != 0)
                break;
            ep = (struct DirEntry *)entrybuf.data;
            if (strcmp(ep->name, "..") && strcmp(ep->name, ".")) {
@@ -574,7 +579,7 @@ afs_dir_DirHash(char *string)
     tval = hval & (NHASHENT - 1);
     if (tval == 0)
        return tval;
-    else if (hval >= 1<<31)
+    else if (hval >= 1u<<31)
        tval = NHASHENT - tval;
     return tval;
 }