]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
DEVEL15-windows-fs-newcell-20080130
authorJeffrey Altman <jaltman@secure-endpoints.com>
Thu, 31 Jan 2008 05:49:00 +0000 (05:49 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Thu, 31 Jan 2008 05:49:00 +0000 (05:49 +0000)
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
src/WINNT/afsd/cm_cell.h
src/WINNT/afsd/cm_ioctl.c

index 491dffdbbee14f0a0d93d76af9676b72fed5e0dd..d07d365356bbd5ba56cf85dbfeb2c95e0182175d 100644 (file)
@@ -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;
index 20f6c42316400e5f4104aca55ec8c89fc63fd872..2471ea265436ff5298f4d129ee35e3238c9a283f 100644 (file)
@@ -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_ */
index 346a2217833819c6ce13ba6d6920607f4171d019..2266817a7986725da270e13e3f022868305605ae 100644 (file)
@@ -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;