From 6b0016dd992b3215cb17c93812e14de9e4916d25 Mon Sep 17 00:00:00 2001 From: Andrew Deason Date: Wed, 31 Jul 2013 15:58:41 -0500 Subject: [PATCH] budb: Do not use garbage cellinfo If the -servers option is given, we never initialize cellinfo or the clones array. So, don't give the cellinfo structure or the clones array to ubik in that case, or we may crash or do other weird things. This issue appears to have been introduced in commit fc4ab52e. FIXES 131706 Change-Id: I87681c697fec7bbfd6c73a8a9a865e4309c95963 Reviewed-on: http://gerrit.openafs.org/10115 Reviewed-by: Jeffrey Altman Tested-by: BuildBot Reviewed-by: Derrick Brashear --- src/budb/server.c | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/src/budb/server.c b/src/budb/server.c index ee4536c40..bc9281296 100644 --- a/src/budb/server.c +++ b/src/budb/server.c @@ -357,7 +357,8 @@ main(int argc, char **argv) { char *whoami = argv[0]; char *dbNamePtr = 0; - struct afsconf_cell cellinfo; + struct afsconf_cell cellinfo_s; + struct afsconf_cell *cellinfo = NULL; time_t currentTime; afs_int32 code = 0; afs_uint32 host = ntohl(INADDR_ANY); @@ -394,6 +395,10 @@ main(int argc, char **argv) sigaction(SIGSEGV, &nsa, NULL); sigaction(SIGABRT, &nsa, NULL); #endif + + memset(&cellinfo_s, 0, sizeof(cellinfo_s)); + memset(clones, 0, sizeof(clones)); + osi_audit_init(); osi_audit(BUDB_StartEvent, 0, AUD_END); @@ -478,9 +483,11 @@ main(int argc, char **argv) * list from the cell's database */ + cellinfo = &cellinfo_s; + LogDebug(1, "Using server list from %s cell database.\n", lcell); - code = afsconf_GetExtendedCellInfo (BU_conf, lcell, 0, &cellinfo, + code = afsconf_GetExtendedCellInfo (BU_conf, lcell, 0, cellinfo, clones); if (code) { LogError(0, "Can't read cell information\n"); @@ -488,7 +495,7 @@ main(int argc, char **argv) } code = - convert_cell_to_ubik(&cellinfo, &globalConfPtr->myHost, + convert_cell_to_ubik(cellinfo, &globalConfPtr->myHost, globalConfPtr->serverList); if (code) ERROR(code); @@ -536,12 +543,19 @@ main(int argc, char **argv) /* Disable jumbograms */ rx_SetNoJumbo(); - code = ubik_ServerInitByInfo (globalConfPtr->myHost, - htons(AFSCONF_BUDBPORT), - &cellinfo, - clones, - dbNamePtr, /* name prefix */ - &BU_dbase); + if (cellinfo) { + code = ubik_ServerInitByInfo(globalConfPtr->myHost, + htons(AFSCONF_BUDBPORT), + cellinfo, + clones, + dbNamePtr, /* name prefix */ + &BU_dbase); + } else { + code = ubik_ServerInit(globalConfPtr->myHost, htons(AFSCONF_BUDBPORT), + globalConfPtr->serverList, + dbNamePtr, /* name prefix */ + &BU_dbase); + } if (code) { LogError(code, "Ubik init failed\n"); -- 2.39.5