dir: fileserver leaks names of file and directories
[openafs.git] / src / dir / buffer.c
index 8a99d4b..1a8da8f 100644 (file)
@@ -11,6 +11,7 @@
 #include <afs/param.h>
 
 #include <roken.h>
+#include <afs/opr.h>
 
 #include <lock.h>
 
@@ -93,8 +94,6 @@ extern void FidZap(dir_file_t);
 extern int  FidVolEq(dir_file_t, afs_int32 vid);
 extern void FidCpy(dir_file_t, dir_file_t fromfile);
 
-extern void Die(char *msg);
-
 int
 DStat(int *abuffers, int *acalls, int *aios)
 {
@@ -123,9 +122,9 @@ DInit(int abuffers)
     Lock_Init(&afs_bufferLock);
     /* Align each element of Buffers on a doubleword boundary */
     tsize = (sizeof(struct buffer) + 7) & ~7;
-    tp = (char *)malloc(abuffers * tsize);
-    Buffers = (struct buffer **)malloc(abuffers * sizeof(struct buffer *));
-    BufferData = (char *)malloc(abuffers * BUFFER_PAGE_SIZE);
+    tp = malloc(abuffers * tsize);
+    Buffers = malloc(abuffers * sizeof(struct buffer *));
+    BufferData = malloc(abuffers * BUFFER_PAGE_SIZE);
     timecounter = 0;
     LastBuffer = (struct buffer *)tp;
     nbuffers = abuffers;
@@ -210,6 +209,7 @@ DRead(dir_file_t fid, int page, struct DirBuffer *entry)
                        ReleaseWriteLock(&tb->lock);
                        entry->buffer = tb;
                        entry->data = tb->data;
+                       return 0;
                    }
                } else
                    break;
@@ -313,6 +313,7 @@ newslot(dir_file_t dir, afs_int32 apage, struct buffer *lp)
     /* Now fill in the header. */
     FidZap(bufferDir(lp));
     FidCpy(bufferDir(lp), dir);        /* set this */
+    memset(lp->data, 0, BUFFER_PAGE_SIZE);  /* Don't leak stale data. */
     lp->page = apage;
     lp->accesstime = ++timecounter;