windows-callback-shutdown-head-20080801
authorJeffrey Altman <jaltman@secure-endpoints.com>
Fri, 22 Aug 2008 21:57:53 +0000 (21:57 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Fri, 22 Aug 2008 21:57:53 +0000 (21:57 +0000)
LICENSE MIT

When the cache manager is shutting down, return an error to all
callback requests.  Otherwise, it is possible for a callback to get
stuck waiting for a lock and when the lock clears to be left with
nothing but invalid memory addresses to crash on.

In the meantime, the file server is waiting for the response.

src/WINNT/afsd/afsd_init.c
src/WINNT/afsd/afsd_service.c
src/WINNT/afsd/cm_callback.c
src/WINNT/afsd/cm_callback.h

index 5fda138..4ded551 100644 (file)
@@ -1382,6 +1382,8 @@ int afsd_ShutdownCM(void)
 {
     cm_ReleaseSCache(cm_data.rootSCachep);
 
+    cm_shutdown = 1;
+
     return 0;
 }
 
index 82709c4..6587b30 100644 (file)
@@ -1456,9 +1456,6 @@ afsd_Main(DWORD argc, LPTSTR *argv)
     buf_Shutdown();                      
     afsi_log("Buffer shutdown complete");
                                          
-    rx_Finalize();                       
-    afsi_log("rx finalization complete");
-                                         
     smb_Shutdown();                      
     afsi_log("smb shutdown complete");   
                                          
@@ -1466,11 +1463,11 @@ afsd_Main(DWORD argc, LPTSTR *argv)
 
     cm_ReleaseAllLocks();
 
+    cm_ShutdownMappedMemory();           
+
     rx_Finalize();
     afsi_log("rx finalization complete");
 
-    cm_ShutdownMappedMemory();           
-
 #ifdef REGISTER_POWER_NOTIFICATIONS
     /* terminate thread used to flush cache */
     if (powerEventsRegistered)
index 4d5e7c1..809845a 100644 (file)
@@ -34,6 +34,8 @@ afs_int32 cm_OfflineROIsValid = 0;
 
 afs_int32 cm_giveUpAllCBs = 0;
 
+afs_int32 cm_shutdown = 0;
+
 #ifdef AFS_FREELANCE_CLIENT
 extern osi_mutex_t cm_Freelance_Lock;
 #endif
@@ -347,6 +349,9 @@ SRXAFSCB_CallBack(struct rx_call *callp, AFSCBFids *fidsArrayp, AFSCBs *cbsArray
     cm_server_t *tsp = NULL;
     cm_cell_t* cellp = NULL;
 
+    if (cm_shutdown)
+        return 1;
+
     if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
         host = rx_HostOf(peerp);
         port = rx_PortOf(peerp);
@@ -418,6 +423,9 @@ SRXAFSCB_InitCallBackState(struct rx_call *callp)
     unsigned long host = 0;
     unsigned short port = 0;
 
+    if (cm_shutdown)
+        return 1;
+
     if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
         host = rx_HostOf(peerp);
         port = rx_PortOf(peerp);
@@ -535,6 +543,9 @@ SRXAFSCB_Probe(struct rx_call *callp)
     unsigned long host = 0;
     unsigned short port = 0;
 
+    if (cm_shutdown)
+        return 1;
+
     if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
         host = rx_HostOf(peerp);
         port = rx_PortOf(peerp);
@@ -637,6 +648,9 @@ SRXAFSCB_GetLock(struct rx_call *callp, long index, AFSDBLock *lockp)
     unsigned long host = 0;
     unsigned short port = 0;
 
+    if (cm_shutdown)
+        return 1;
+
     if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
         host = rx_HostOf(peerp);
         port = rx_PortOf(peerp);
@@ -694,6 +708,9 @@ SRXAFSCB_GetCE(struct rx_call *callp, long index, AFSDBCacheEntry *cep)
     unsigned long host = 0;
     unsigned short port = 0;
 
+    if (cm_shutdown)
+        return 1;
+
     if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
         host = rx_HostOf(peerp);
         port = rx_PortOf(peerp);
@@ -806,6 +823,9 @@ SRXAFSCB_GetCE64(struct rx_call *callp, long index, AFSDBCacheEntry64 *cep)
     unsigned long host = 0;
     unsigned short port = 0;
 
+    if (cm_shutdown)
+        return 1;
+
     if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
         host = rx_HostOf(peerp);
         port = rx_PortOf(peerp);
@@ -920,6 +940,9 @@ SRXAFSCB_XStatsVersion(struct rx_call *callp, long *vp)
     unsigned long host = 0;
     unsigned short port = 0;
 
+    if (cm_shutdown)
+        return 1;
+
     if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
         host = rx_HostOf(peerp);
         port = rx_PortOf(peerp);
@@ -942,6 +965,9 @@ SRXAFSCB_GetXStats(struct rx_call *callp, long cvn, long coln, long *srvp, long
     unsigned long host = 0;
     unsigned short port = 0;
 
+    if (cm_shutdown)
+        return 1;
+
     if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
         host = rx_HostOf(peerp);
         port = rx_PortOf(peerp);
@@ -956,6 +982,9 @@ SRXAFSCB_GetXStats(struct rx_call *callp, long cvn, long coln, long *srvp, long
 int
 SRXAFSCB_InitCallBackState2(struct rx_call *callp, struct interfaceAddr* addr)
 {
+    if (cm_shutdown)
+        return 1;
+
     osi_Log0(afsd_logp, "SRXAFSCB_InitCallBackState2 ->");
 
     return SRXAFSCB_InitCallBackState(callp);
@@ -972,6 +1001,9 @@ SRXAFSCB_WhoAreYou(struct rx_call *callp, struct interfaceAddr* addr)
     unsigned long host = 0;
     unsigned short port = 0;
 
+    if (cm_shutdown)
+        return 1;
+
     if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
         host = rx_HostOf(peerp);
         port = rx_PortOf(peerp);
@@ -1015,6 +1047,9 @@ SRXAFSCB_InitCallBackState3(struct rx_call *callp, afsUUID* serverUuid)
 {
     char *p = NULL;
 
+    if (cm_shutdown)
+        return 1;
+
     if (UuidToString((UUID *)serverUuid, &p) == RPC_S_OK) {
         osi_Log1(afsd_logp, "SRXAFSCB_InitCallBackState3 %s ->",osi_LogSaveString(afsd_logp,p));
         RpcStringFree(&p);
@@ -1035,6 +1070,9 @@ SRXAFSCB_ProbeUuid(struct rx_call *callp, afsUUID* clientUuid)
     char *p,*q;
     int code = 0;
 
+    if (cm_shutdown)
+        return 1;
+
     if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
         host = rx_HostOf(peerp);
         port = rx_PortOf(peerp);
@@ -1106,6 +1144,9 @@ SRXAFSCB_GetCellByNum(struct rx_call *callp, afs_int32 a_cellnum,
     unsigned short port = 0;
     int rc;
 
+    if (cm_shutdown)
+        return 1;
+
     if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
         host = rx_HostOf(peerp);
         port = rx_PortOf(peerp);
@@ -1138,6 +1179,9 @@ SRXAFSCB_TellMeAboutYourself( struct rx_call *callp,
     unsigned long host = 0;
     unsigned short port = 0;
 
+    if (cm_shutdown)
+        return 1;
+
     if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
         host = rx_HostOf(peerp);
         port = rx_PortOf(peerp);
@@ -1214,6 +1258,9 @@ int SRXAFSCB_GetServerPrefs(
     unsigned long host = 0;
     unsigned short port = 0;
 
+    if (cm_shutdown)
+        return 1;
+
     if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
         host = rx_HostOf(peerp);
         port = rx_PortOf(peerp);
@@ -1260,6 +1307,9 @@ int SRXAFSCB_GetCellServDB(struct rx_call *callp, afs_int32 index, char **a_name
     unsigned short port = 0;
     int rc;
 
+    if (cm_shutdown)
+        return 1;
+
     if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
         host = rx_HostOf(peerp);
         port = rx_PortOf(peerp);
@@ -1307,6 +1357,9 @@ int SRXAFSCB_GetLocalCell(struct rx_call *callp, char **a_name)
     unsigned long host = 0;
     unsigned short port = 0;
 
+    if (cm_shutdown)
+        return 1;
+
     if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
         host = rx_HostOf(peerp);
         port = rx_PortOf(peerp);
@@ -1402,6 +1455,9 @@ int SRXAFSCB_GetCacheConfig(struct rx_call *callp,
     unsigned long host = 0;
     unsigned short port = 0;
 
+    if (cm_shutdown)
+        return 1;
+
     if ((connp = rx_ConnectionOf(callp)) && (peerp = rx_PeerOf(connp))) {
         host = rx_HostOf(peerp);
         port = rx_PortOf(peerp);
index eff1a47..78633b9 100644 (file)
@@ -75,4 +75,6 @@ extern void cm_GiveUpAllCallbacksAllServers(afs_int32 markDown);
 extern afs_int32 cm_OfflineROIsValid;
 
 extern afs_int32 cm_giveUpAllCBs;
+
+extern afs_int32 cm_shutdown;
 #endif /*  _CM_CALLBACK_H_ENV__ */