Don't allocate objects of 0 length
[openafs.git] / src / tools / dumpscan / dumptool.c
index d514cde..a8c05a0 100644 (file)
@@ -77,6 +77,7 @@
 #include <fcntl.h>
 #include <sys/ioctl.h>
 
+#include <rx/rx_queue.h>
 #include <lock.h>
 #include <afs/afsint.h>
 #include <afs/nfs.h>
@@ -1148,12 +1149,19 @@ ScanVnodes(FILE * f, VolumeDiskData * vol, int sizescan)
        numSmallVnodes = numFileVnodes;
 
     } else {
-       LargeVnodeIndex = (struct vnodeData **)
-           malloc(numDirVnodes * sizeof(struct vnodeData));
-       SmallVnodeIndex = (struct vnodeData **)
-           malloc(numFileVnodes * sizeof(struct vnodeData));
+       if (numDirVnodes == 0)
+           LargeVnodeIndex = NULL;
+       else
+           LargeVnodeIndex = malloc(numDirVnodes
+                                     * sizeof(struct vnodeData *));
+       if (numFileVnodes == 0)
+           SmallVnodeIndex = NULL;
+       else
+           SmallVnodeIndex = malloc(numFileVnodes
+                                     * sizeof(struct vnodeData *));
 
-       if (LargeVnodeIndex == NULL || SmallVnodeIndex == NULL) {
+       if ((numDirVnodes != 0 && LargeVnodeIndex == NULL) ||
+           (numFileVnodes != 0 && SmallVnodeIndex == NULL)) {
            if (verbose)
                fprintf(stderr,
                        "Unable to allocate space " "for vnode tables\n");
@@ -1442,15 +1450,19 @@ DirListInternal(struct vnodeData *vdata, char *pathnames[], int numpathnames,
     } else if (iflag)
        for (i = 0; i < numentries; i++)
            if (!(lvdata = GetVnode(ntohl(eplist[i]->fid.vnode))))
-               printf("%d.0.0\t%s\n",
-                      vol->parentId ? vol->parentId : vol->id,
+               printf("%" AFS_VOLID_FMT ".0.0\t%s\n",
+                      vol->parentId ? afs_printable_VolumeId_lu(vol->parentId)
+                      : afs_printable_VolumeId_lu(vol->id),
                       eplist[i]->name);
            else if (path)
-               printf("%d.%d.%d\t%s/%s\n", vol->id,
+               printf("%" AFS_VOLID_FMT ".%d.%d\t%s/%s\n",
+                      afs_printable_VolumeId_lu(vol->id),
                       ntohl(eplist[i]->fid.vnode),
                       ntohl(eplist[i]->fid.vunique), path, eplist[i]->name);
            else
-               printf("%d.%d.%d\t%s\n", vol->id, ntohl(eplist[i]->fid.vnode),
+               printf("%" AFS_VOLID_FMT ".%d.%d\t%s\n",
+                      afs_printable_VolumeId_lu(vol->id),
+                      ntohl(eplist[i]->fid.vnode),
                       ntohl(eplist[i]->fid.vunique), eplist[i]->name);
     else if (lflag) {
        for (i = 0; i < numentries; i++)