DEVEL15-afsdb-avoid-cross-task-stack-use-20071204
authorDerrick Brashear <shadow@dementia.org>
Tue, 4 Dec 2007 20:31:07 +0000 (20:31 +0000)
committerDerrick Brashear <shadow@dementia.org>
Tue, 4 Dec 2007 20:31:07 +0000 (20:31 +0000)
LICENSE IPL10

really for aix, but simplified code universally.

(cherry picked from commit a342c531a24544988e1a2c2ad1de6d555787989d)

src/afs/afs_cell.c

index 62fab7e..754d12f 100644 (file)
@@ -41,14 +41,13 @@ afs_rwlock_t afsdb_req_lock;        /* Serializes client requests */
 static char afsdb_handler_running;     /* Protected by GLOCK */
 static char afsdb_handler_shutdown;    /* Protected by GLOCK */
 
+/* from cellconfig.h */
+#define MAXCELLCHARS    64
 static struct {
-    afs_rwlock_t lock;
+    /* lock moved to afsdb_req_lock for cmdebug */
     char pending;
     char complete;
     char *cellname;
-    afs_int32 *cellhosts;
-    int *timeout;
-    char **realname;
 } afsdb_req;
 
 void
@@ -65,6 +64,9 @@ afs_StopAFSDB()
 int
 afs_AFSDBHandler(char *acellName, int acellNameLen, afs_int32 * kernelMsg)
 {
+    afs_int32 timeout, code;
+    afs_int32 cellHosts[MAXCELLHOSTS];
+
     if (afsdb_handler_shutdown)
        return -2;
     afsdb_handler_running = 1;
@@ -75,18 +77,29 @@ afs_AFSDBHandler(char *acellName, int acellNameLen, afs_int32 * kernelMsg)
 
        UpgradeSToWLock(&afsdb_req_lock, 684);
        hostCount = kernelMsg[0];
-       *afsdb_req.timeout = kernelMsg[1];
-       if (*afsdb_req.timeout)
-           *afsdb_req.timeout += osi_Time();
-       *afsdb_req.realname = afs_strdup(acellName);
+       timeout = kernelMsg[1];
+       if (timeout)
+           timeout += osi_Time();
 
        for (i = 0; i < MAXCELLHOSTS; i++) {
            if (i >= hostCount)
-               afsdb_req.cellhosts[i] = 0;
+               cellHosts[i] = 0;
            else
-               afsdb_req.cellhosts[i] = kernelMsg[2 + i];
+               cellHosts[i] = kernelMsg[2 + i];
        }
 
+       if (hostCount)
+           code = afs_NewCell(acellName, cellHosts, CNoSUID, NULL, 0, 0, 
+                              timeout);
+
+       if (!hostCount || (code && code != EEXIST)) 
+           /* null out the cellname if the lookup failed */
+           afsdb_req.cellname = NULL;
+       else
+           /* If we found an alias, create it */
+           if (afs_strcasecmp(afsdb_req.cellname, acellName))
+               afs_NewCellAlias(afsdb_req.cellname, acellName);
+
        /* Request completed, wake up the relevant thread */
        afsdb_req.pending = 0;
        afsdb_req.complete = 1;
@@ -123,8 +136,7 @@ afs_AFSDBHandler(char *acellName, int acellNameLen, afs_int32 * kernelMsg)
 }
 
 static int
-afs_GetCellHostsAFSDB(char *acellName, afs_int32 * acellHosts, int *timeout,
-                     char **realName)
+afs_GetCellHostsAFSDB(char *acellName)
 {
     AFS_ASSERT_GLOCK();
     if (!afsdb_handler_running)
@@ -133,11 +145,7 @@ afs_GetCellHostsAFSDB(char *acellName, afs_int32 * acellHosts, int *timeout,
     ObtainWriteLock(&afsdb_client_lock, 685);
     ObtainWriteLock(&afsdb_req_lock, 686);
 
-    *acellHosts = 0;
-    afsdb_req.cellname = afs_strdup(acellName);
-    afsdb_req.cellhosts = acellHosts;
-    afsdb_req.timeout = timeout;
-    afsdb_req.realname = realName;
+    afsdb_req.cellname = acellName;
 
     afsdb_req.complete = 0;
     afsdb_req.pending = 1;
@@ -154,7 +162,7 @@ afs_GetCellHostsAFSDB(char *acellName, afs_int32 * acellHosts, int *timeout,
     ReleaseReadLock(&afsdb_req_lock);
     ReleaseWriteLock(&afsdb_client_lock);
 
-    if (*acellHosts)
+    if (afsdb_req.cellname) 
        return 0;
     else
        return ENOENT;
@@ -165,43 +173,13 @@ void
 afs_LookupAFSDB(char *acellName)
 {
 #ifdef AFS_AFSDB_ENV
-    afs_int32 *cellHosts;
-    char **realName=NULL;
     int code;
-    int *timeout=NULL;
-
-    if(!(cellHosts = afs_osi_Alloc(MAXCELLHOSTS * sizeof(afs_int32))))
-       goto done;
-
-    if(!(realName = afs_osi_Alloc(sizeof(char *))))
-       goto done;
-    *realName = NULL;
-
-    if(!(timeout = afs_osi_Alloc(sizeof(int))))
-       goto done;
-
-    code = afs_GetCellHostsAFSDB(acellName, cellHosts, timeout, realName);
-    if (code)
-       goto done;
-    code = afs_NewCell(*realName, cellHosts, CNoSUID, NULL, 0, 0, *timeout);
-    if (code && code != EEXIST)
-       goto done;
-
-    /* If we found an alias, create it */
-    if (afs_strcasecmp(acellName, *realName))
-       afs_NewCellAlias(acellName, *realName);
-
-      done:
-    afs_Trace2(afs_iclSetp, CM_TRACE_AFSDB, ICL_TYPE_STRING, acellName, 
-              ICL_TYPE_INT32, code);
-    if(timeout)
-       afs_osi_Free(timeout, sizeof(int));
-    if (realName && *realName)
-       afs_osi_FreeStr(*realName);
-    if(realName)
-       afs_osi_Free(realName, sizeof(char *));
-    if(cellHosts)
-       afs_osi_Free(cellHosts, MAXCELLHOSTS * sizeof(afs_int32));
+    char *cellName = afs_strdup(acellName);
+
+    code = afs_GetCellHostsAFSDB(cellName);
+    afs_Trace2(afs_iclSetp, CM_TRACE_AFSDB, ICL_TYPE_STRING, cellName, 
+               ICL_TYPE_INT32, code);
+    afs_osi_FreeStr(cellName);
 #endif
 }