From 6d32f5ade611144766e72e170dd0b0c389b05fe4 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Thu, 31 Jan 2008 05:49:00 +0000 Subject: [PATCH] DEVEL15-windows-fs-newcell-20080130 LICENSE MIT prevent the afs client service from crashing when fs newcell is executed (cherry picked from commit 02a80e05a73d9df50fbd427e30ca862706afcbc1) --- src/WINNT/afsd/cm_cell.c | 5 ----- src/WINNT/afsd/cm_cell.h | 8 ++++++++ src/WINNT/afsd/cm_ioctl.c | 10 ++++++---- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/WINNT/afsd/cm_cell.c b/src/WINNT/afsd/cm_cell.c index 491dffdbb..d07d36535 100644 --- a/src/WINNT/afsd/cm_cell.c +++ b/src/WINNT/afsd/cm_cell.c @@ -30,11 +30,6 @@ osi_rwlock_t cm_cellLock; * * At the present time the return value is ignored by the caller. */ -typedef struct cm_cell_rock { - cm_cell_t * cellp; - afs_uint32 flags; -} cm_cell_rock_t; - long cm_AddCellProc(void *rockp, struct sockaddr_in *addrp, char *hostnamep) { cm_server_t *tsp; diff --git a/src/WINNT/afsd/cm_cell.h b/src/WINNT/afsd/cm_cell.h index 20f6c4231..2471ea265 100644 --- a/src/WINNT/afsd/cm_cell.h +++ b/src/WINNT/afsd/cm_cell.h @@ -36,6 +36,12 @@ typedef struct cm_cell { #define CM_CELLFLAG_IN_NAMEHASH 0x10 #define CM_CELLFLAG_IN_IDHASH 0x20 +typedef struct cm_cell_rock { + cm_cell_t * cellp; + afs_uint32 flags; +} cm_cell_rock_t; + + #define CM_CELL_NAME_HASH(name) (SDBMHash(name) % cm_data.cellHashTableSize) #define CM_CELL_ID_HASH(id) ((unsigned long) id % cm_data.cellHashTableSize) @@ -64,4 +70,6 @@ extern void cm_AddCellToNameHashTable(cm_cell_t * cellp); extern void cm_AddCellToIDHashTable(cm_cell_t * cellp); +extern long cm_AddCellProc(void *rockp, struct sockaddr_in *addrp, char *namep); + #endif /* __CELL_H_ENV_ */ diff --git a/src/WINNT/afsd/cm_ioctl.c b/src/WINNT/afsd/cm_ioctl.c index 346a22178..2266817a7 100644 --- a/src/WINNT/afsd/cm_ioctl.c +++ b/src/WINNT/afsd/cm_ioctl.c @@ -1592,8 +1592,6 @@ long cm_IoctlGetCell(struct smb_ioctl *ioctlp, struct cm_user *userp) return CM_ERROR_NOMORETOKENS; /* mapped to EDOM */ } -extern long cm_AddCellProc(void *rockp, struct sockaddr_in *addrp, char *namep); - long cm_IoctlNewCell(struct smb_ioctl *ioctlp, struct cm_user *userp) { /* NT cache manager will read cell information from CellServDB each time @@ -1606,6 +1604,8 @@ long cm_IoctlNewCell(struct smb_ioctl *ioctlp, struct cm_user *userp) */ cm_cell_t *cp; + cm_cell_rock_t rock; + cm_SkipIoctlPath(ioctlp); lock_ObtainWrite(&cm_cellLock); @@ -1617,12 +1617,14 @@ long cm_IoctlNewCell(struct smb_ioctl *ioctlp, struct cm_user *userp) /* delete all previous server lists - cm_FreeServerList will ask for write on cm_ServerLock*/ cm_FreeServerList(&cp->vlServersp, CM_FREESERVERLIST_DELETE); cp->vlServersp = NULL; - code = cm_SearchCellFile(cp->name, cp->name, cm_AddCellProc, cp); + rock.cellp = cp; + rock.flags = 0; + code = cm_SearchCellFile(cp->name, cp->name, cm_AddCellProc, &rock); #ifdef AFS_AFSDB_ENV if (code) { if (cm_dnsEnabled) { int ttl; - code = cm_SearchCellByDNS(cp->name, cp->name, &ttl, cm_AddCellProc, cp); + code = cm_SearchCellByDNS(cp->name, cp->name, &ttl, cm_AddCellProc, &rock); if ( code == 0 ) { /* got cell from DNS */ cp->flags |= CM_CELLFLAG_DNS; cp->flags &= ~CM_CELLFLAG_VLSERVER_INVALID; -- 2.39.5