kdb: don't dereference a null pointer on corrupt database
[openafs.git] / src / kauth / kdb.c
index a83aa28..0703cdd 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Copyright 2000, International Business Machines Corporation and others.
  * All Rights Reserved.
- * 
+ *
  * This software has been released under the terms of the IBM Public
  * License.  For details, see the LICENSE file in the top-level source
  * directory or online at http://www.openafs.org/dl/license10.html
 #include <afsconfig.h>
 #include <afs/param.h>
 
-RCSID("$Header$");
+#include <roken.h>
 
-#include <fcntl.h>
-#include <sys/types.h>
-#include <time.h>
-#include <stdio.h>
-#ifndef AFS_NT40_ENV
-#include <strings.h>
-#endif
 #include <afs/cmd.h>
+#include <afs/afsutil.h>
+
 #include "kauth.h"
 #include "kalog.h"
-#include <afs/afsutil.h>
 
 #ifdef AUTH_DBM_LOG
 
-char *dbmfile;
+const char *dbmfile;
 
-static cmdproc(
-  register struct cmd_syndesc *as,
-  afs_int32 arock)
+static int
+cmdproc(struct cmd_syndesc *as, void * arock)
 {
     DBM *kdb;
     datum key, data;
     kalog_elt rdata;
-    register afs_int32 code = 0, cnt = 0;
-    register struct cmd_item *ti;
+    afs_int32 cnt = 0;
+    struct cmd_item *ti;
 
     if (as->parms[0].items) {
        dbmfile = as->parms[0].items->data;
-    } 
+    }
     kdb = dbm_open(dbmfile, O_RDONLY, KALOG_DB_MODE);
     if (!kdb) {
-        perror(dbmfile);
+       perror(dbmfile);
        exit(1);
     }
     if (!(ti = as->parms[1].items)) {
        printf("Printing all entries found in %s\n", dbmfile);
        for (key = dbm_firstkey(kdb); key.dptr;
             key = afs_dbm_nextkey(kdb, key), cnt++) {
-           printf("\t%s\n", key.dptr);
+            if (as->parms[2].items) {
+               data = dbm_fetch(kdb, key);
+               if (!data.dptr) {
+                   fprintf(stderr, "%s: no entry exists\n", (char *)key.dptr);
+                   continue;
+               }
+               if (data.dsize != sizeof(kalog_elt)) {
+                   fprintf(stderr, "%s: data came out corrupt\n", 
+                       (char *)key.dptr);
+                   continue;
+               }
+               memcpy(&rdata, data.dptr, sizeof(kalog_elt));
+               if (! as->parms[3].items) {
+                   char *hostName;
+                   hostName = hostutil_GetNameByINet(rdata.host);
+                   printf("%s: last operation from host %s at %s",
+                          (char *)key.dptr, hostName,
+                          ctime(&rdata.last_use));
+               } else {
+                   char *hostIP;
+                   char hoststr[16];
+                   hostIP = afs_inet_ntoa_r(rdata.host, hoststr);
+                   printf("%s: last operation from host %s at %s",
+                          (char *)key.dptr, hostIP,
+                          ctime(&rdata.last_use));
+               }
+            } else {
+               printf("\t%s\n", (char *)key.dptr);
+            }
        }
        printf("%d entries were found\n", cnt);
     } else {
@@ -66,30 +87,34 @@ static cmdproc(
                fprintf(stderr, "%s: data came out corrupt\n", ti->data);
                continue;
            }
-           bcopy(data.dptr, &rdata, sizeof(kalog_elt));
-           printf("%s: last operation from host %x at %s", ti->data, rdata.host, 
-                  ctime(&rdata.last_use));
+           memcpy(&rdata, data.dptr, sizeof(kalog_elt));
+           printf("%s: last operation from host %x at %s", ti->data,
+                  rdata.host, ctime(&rdata.last_use));
        }
     }
     dbm_close(kdb);
+    return 0;
 }
 
 
 #include "AFS_component_version_number.c"
 
-int main(
-  int argc,
-  char **argv)
+int
+main(int argc, char **argv)
 {
-    register struct cmd_syndesc *ts;
-    register afs_int32 code;
+    struct cmd_syndesc *ts;
+    afs_int32 code;
     char dbmfile_help[AFSDIR_PATH_MAX];
 
-    sprintf(dbmfile_help, "dbmfile to use (default %s)",  AFSDIR_SERVER_KALOGDB_FILEPATH);
+    sprintf(dbmfile_help, "dbmfile to use (default %s)",
+           AFSDIR_SERVER_KALOGDB_FILEPATH);
     dbmfile = AFSDIR_SERVER_KALOGDB_FILEPATH;
-    ts = cmd_CreateSyntax((char *) 0, cmdproc, 0, "Dump contents of dbm database");
+    ts = cmd_CreateSyntax(NULL, cmdproc, NULL, "Dump contents of dbm database");
     cmd_AddParm(ts, "-dbmfile", CMD_SINGLE, CMD_OPTIONAL, dbmfile_help);
-    cmd_AddParm(ts, "-key", CMD_SINGLE, CMD_OPTIONAL, "extract entries that match specified key");
+    cmd_AddParm(ts, "-key", CMD_SINGLE, CMD_OPTIONAL,
+               "extract entries that match specified key");
+    cmd_AddParm(ts, "-long", CMD_FLAG, CMD_OPTIONAL, "print long info for each entry");
+    cmd_AddParm(ts, "-numeric", CMD_FLAG, CMD_OPTIONAL, "addresses only");
     code = cmd_Dispatch(argc, argv);
     return code;
 }
@@ -97,8 +122,10 @@ int main(
 
 #include "AFS_component_version_number.c"
 
-int main(void)
+int
+main(void)
 {
     printf("kdb not supported\n");
+    return 1;
 }
 #endif