Windows: more pioctl output validation
authorJeffrey Altman <jaltman@secure-endpoints.com>
Mon, 14 Sep 2009 14:59:54 +0000 (07:59 -0700)
committerJeffrey Altman <jaltman|account-1000011@unknown>
Sat, 19 Sep 2009 18:42:52 +0000 (11:42 -0700)
Add output validation checks to the Explorer Shell and the
Client configuration control panel.

LICENSE MIT

Reviewed-on: http://gerrit.openafs.org/458
Reviewed-by: Jeffrey Altman <jaltman@openafs.org>
Tested-by: Jeffrey Altman <jaltman@openafs.org>

src/WINNT/client_config/config.cpp
src/WINNT/client_config/drivemap.cpp
src/WINNT/client_exp/gui2fs.cpp

index f5be891..b576d72 100644 (file)
@@ -172,6 +172,7 @@ void Config_GetCellName (LPTSTR pszName)
 
 BOOL Config_ContactGateway (LPTSTR pszGateway, LPTSTR pszCell)
 {
+   // pszCell is MAX_PATH
    BOOL rc = FALSE;
 
    BYTE OutData[ PIOCTL_MAXSIZE ];
@@ -189,13 +190,14 @@ BOOL Config_ContactGateway (LPTSTR pszGateway, LPTSTR pszCell)
 
    ULONG status;
    if ((status = pioctl (0, VIOC_GET_WS_CELL, &IOInfo, 1)) == 0)
-      {
-      if (OutData[0])
-         {
-         lstrcpy (pszCell, (LPCTSTR)OutData);
-         rc = TRUE;
-         }
-      }
+   {
+       OutData[min(PIOCTL_MAXSIZE, MAX_PATH) - 1] = '\0';
+       if (OutData[0])
+       {
+           lstrcpy (pszCell, (LPCTSTR)OutData);
+           rc = TRUE;
+       }
+   }
 
    Config_SetGatewayName (szOldGateway);
 
index 5485950..4ae9087 100644 (file)
@@ -786,8 +786,11 @@ void FreeDriveMapList (PDRIVEMAPLIST pList)
 }
 
 
+
 BOOL PathToSubmount (LPTSTR pszSubmount, LPTSTR pszMapping, LPTSTR pszSubmountReq, ULONG *pStatus)
 {
+   // pszSubmount is MAX_PATH in length
+
    if (pszSubmountReq && !IsValidSubmountName (pszSubmountReq))
       pszSubmountReq = NULL;
 
@@ -824,6 +827,8 @@ BOOL PathToSubmount (LPTSTR pszSubmount, LPTSTR pszMapping, LPTSTR pszSubmountRe
    if (status)
       return FALSE;
 
+
+   OutData[min(PIOCTL_MAXSIZE, MAX_PATH) - 1] = '\0';
    lstrcpy (pszSubmount, (LPCTSTR)OutData);
    return (pszSubmount[0] != TEXT('\0')) ? TRUE : FALSE;
 }
@@ -1424,9 +1429,12 @@ BOOL GlobalMountDrive()
 
 DWORD MountDOSDrive(char chDrive,const char *szSubmount,BOOL bPersistent,const char * pUsername)
 {
+#ifdef AFSIFS
     DWORD err;
-       BOOL succ;
-       TCHAR szPath[MAX_PATH], szTokens[MAX_PATH], *tok;
+    BOOL succ;
+    TCHAR szTokens[MAX_PATH], *tok;
+#endif /* AFSIFS */
+    TCHAR szPath[MAX_PATH];
     TCHAR szClient[MAX_PATH];
     TCHAR szDrive[3] = TEXT("?:");
 
@@ -1504,8 +1512,9 @@ DWORD DisMountDOSDrive(const char *pSubmount,BOOL bForce)
 DWORD DisMountDOSDrive(const char chDrive,BOOL bForce)
 {
     TCHAR szPath[MAX_PATH];
+#ifdef AFSIFS
     DWORD succ;
-
+#endif
     sprintf(szPath,"%c:",chDrive);
 #ifdef AFSIFS
     succ = DefineDosDevice(DDD_REMOVE_DEFINITION, szPath, NULL);
index de1fbb4..c5be1c0 100644 (file)
@@ -284,6 +284,7 @@ void WhichCell(CStringArray& files)
             } else
                 results.Add(GetAfsError(errno));
         } else {
+            space[MAXSIZE - 1] = '\0';
             results.Add(Utf8ToCString(space));
         }
     }       
@@ -1488,7 +1489,9 @@ BOOL ListMount(CStringArray& files)
         last_component.ReleaseBuffer();
 
         if (code == 0) {
-            int nPos = strlen(space) - 1;
+            int nPos;
+            space[MAXSIZE - 1] = '\0';
+            nPos = strlen(space) - 1;
             if (space[nPos] == '.')
                 space[nPos] = 0;
             mountPoints.Add(ParseMountPoint(StripPath(files[i]), Utf8ToCString(space)));
@@ -1796,7 +1799,7 @@ BOOL GetVolumeInfo(CString strFile, CVolInfo& volInfo)
     blob.out = space;
 
     code = pioctl_T(strFile, VIOCGETVOLSTAT, &blob, 1);
-    if (code) {
+    if (code || blob.out_size < sizeof(*status)) {
         volInfo.m_strErrorMsg = GetAfsError(errno, strFile);
         return FALSE;
     }
@@ -1855,7 +1858,7 @@ BOOL SetVolInfo(CVolInfo& volInfo)
 #endif
 
     code = pioctl_T(volInfo.m_strFilePath, VIOCSETVOLSTAT, &blob, 1);
-    if (code) {
+    if (code || blob.out_size < sizeof(*status)) {
         ShowMessageBox(IDS_SET_QUOTA_ERROR, MB_ICONERROR, IDS_SET_QUOTA_ERROR, GetAfsError(errno, volInfo.m_strName));
         return FALSE;
     }
@@ -2169,8 +2172,12 @@ BOOL ListSymlink(CStringArray& files)
         ustrLast.ReleaseBuffer();
 
         if (code == 0) {
-            CString syml = Utf8ToCString(space);
-            int len = syml.GetLength();
+            CString syml;
+            int len;
+
+            space[MAXSIZE - 1] = '\0';
+            syml = Utf8ToCString(space);
+            len = syml.GetLength();
 
             if (len > 0) {
                 if (syml[len - 1] == _T('.'))