Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[cdt-patch] Spawner fixes.

Index: ChangeLog
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core.win32/ChangeLog,v
retrieving revision 1.5
diff -u -r1.5 ChangeLog
--- ChangeLog	13 Jan 2003 19:29:46 -0000	1.5
+++ ChangeLog	17 Jan 2003 19:29:12 -0000
@@ -1,3 +1,13 @@
+2003-01-17 Alex Chapiro
+
+	* os/win32/x86/spawner.dll: Rebuild
+	* os/win32/x86/starter.exe: Rebuild
+	* src/library/starter/starter.cpp (copyTo):
+	Check for overflow.
+	* src/library/Win32ProcessEx.c (..exec1 exec0):
+	Dynamically allocate environment buffer to avoid overflow. 
+	Check for overflow.
+
 2003-01-13 Alex Chapiro
 
 	* os/win32/x86/spawner.dll: Rebuild.
Index: library/Win32ProcessEx.c
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core.win32/library/Win32ProcessEx.c,v
retrieving revision 1.6
diff -u -r1.6 Win32ProcessEx.c
--- library/Win32ProcessEx.c	13 Jan 2003 19:30:09 -0000	1.6
+++ library/Win32ProcessEx.c	17 Jan 2003 19:29:12 -0000
@@ -22,7 +22,7 @@
 #include "jni.h"
 #include "io.h"
 
-//#define DEBUG_MONITOR
+// #define DEBUG_MONITOR
 
 #define PIPE_SIZE 512
 #define MAX_CMD_SIZE 1024
@@ -85,7 +85,8 @@
 	LPVOID envBlk = NULL;
     int ret = 0;
 	char  szCmdLine[MAX_CMD_SIZE];
-	char  szEnvBlock[MAX_ENV_SIZE];
+	int nBlkSize = MAX_ENV_SIZE; 
+	char  * szEnvBlock = (char *)malloc(nBlkSize);
 	jsize nCmdTokens = 0;
 	jsize nEnvVars = 0;
 	int i;
@@ -150,6 +151,7 @@
 
 	nPos = sprintf(szCmdLine, "%sstarter.exe %s %s %s ", path, eventBreakName, eventWaitName, eventTerminateName);
 
+	// Prepare command line
 	for(i = 0; i < nCmdTokens; ++i) 
 		{
 		jobject item = (*env) -> GetObjectArrayElement(env, cmdarray, i);
@@ -160,7 +162,7 @@
 			{
 			if(0 > (nCpyLen = copyTo(szCmdLine + nPos, str, len, MAX_CMD_SIZE - nPos)))
 				{
-				ThrowByName(env, "java/Exception", "Too long command line");
+				ThrowByName(env, "java/lang/Exception", "Too long command line");
 				return 0;
 				}
 			nPos += nCpyLen;
@@ -172,6 +174,7 @@
 
 	szCmdLine[nPos] = '\0';
 
+	// Prepare environment block
     if (nEnvVars > 0) 
 		{
 		nPos = 0;
@@ -182,6 +185,21 @@
 			const char *  str = (*env) -> GetStringUTFChars(env, item, 0);	
 			if(NULL != str)
 				{
+				while((nBlkSize - nPos) <= (len + 2)) // +2 for two '\0'
+					{
+					nBlkSize += MAX_ENV_SIZE;
+					szEnvBlock = (char *)realloc(szEnvBlock, nBlkSize);
+					if(NULL == szEnvBlock) 
+						{
+						ThrowByName(env, "java/lang/Exception", "Not enough memory");
+						return 0;
+						}
+#ifdef DEBUG_MONITOR
+					sprintf(buffer, "Realloc environment block; new length is  %i \n", nBlkSize);
+					OutputDebugString(buffer);
+#endif
+
+					}
 				strncpy(szEnvBlock + nPos, str, len);
 				nPos += len;
 				szEnvBlock[nPos] = '\0';
@@ -244,7 +262,8 @@
 
 	if(NULL != cwd)
 		free(cwd);
-
+	
+	free(szEnvBlock);
 
     CloseHandle(hread[0]);
     CloseHandle(hwrite[1]);
@@ -340,7 +359,8 @@
 	int i;
 	int nPos;
 	char  szCmdLine[MAX_CMD_SIZE];
-	char  szEnvBlock[MAX_ENV_SIZE];
+	int nBlkSize = MAX_ENV_SIZE; 
+	char * szEnvBlock = (char *)malloc(nBlkSize);
 
 
     sa.nLength = sizeof(sa);
@@ -353,6 +373,7 @@
 
 	nPos = 0;
 
+	// Prepare command line
 	for(i = 0; i < nCmdTokens; ++i) 
 		{
 		jobject item = (*env) -> GetObjectArrayElement(env, cmdarray, i);
@@ -363,7 +384,7 @@
 			{
 			if(0 > (nCpyLen = copyTo(szCmdLine + nPos, str, len, MAX_CMD_SIZE - nPos)))
 				{
-				ThrowByName(env, "java/Exception", "Too long command line");
+				ThrowByName(env, "java/lang/Exception", "Too long command line");
 				return 0;
 				}
 			nPos += nCpyLen;
@@ -375,6 +396,7 @@
 
 	szCmdLine[nPos] = '\0';
 
+	// Prepare environment block
     if (nEnvVars > 0) 
 		{
 		nPos = 0;
@@ -385,6 +407,16 @@
 			const char *  str = (*env) -> GetStringUTFChars(env, item, 0);	
 			if(NULL != str)
 				{
+				while((nBlkSize - nPos) <= (len + 2)) // +2 for two '\0'
+					{
+					nBlkSize += MAX_ENV_SIZE;
+					szEnvBlock = (char *)realloc(szEnvBlock, nBlkSize);
+					if(NULL == szEnvBlock) 
+						{
+						ThrowByName(env, "java/lang/Exception", "Not enough memory");
+						return 0;
+						}
+					}
 				strncpy(szEnvBlock + nPos, str, len);
 				nPos += len;
 				szEnvBlock[nPos] = '\0';
@@ -433,6 +465,7 @@
 
 	if(NULL != cwd)
 		free(cwd);
+	free(szEnvBlock);
 
     if (!ret) 
 		{
@@ -708,7 +741,12 @@
 	int totCpyLength = cpyLength;
 	BOOL bQoutedTerm = FALSE;
 
-	if(availSpace < cpyLength)
+#ifdef DEBUG_MONITOR
+	sprintf(buffer, "copyTo start: %s %d %d\n", source, cpyLength, availSpace);
+	OutputDebugString(buffer);
+#endif
+
+	if(availSpace <= cpyLength) // = to reserve space for final '\0'
 		return -1;
 	//strncpy(target, source, cpyLength);
 	//return cpyLength;
Index: library/starter/starter.cpp
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core.win32/library/starter/starter.cpp,v
retrieving revision 1.2
diff -u -r1.2 starter.cpp
--- library/starter/starter.cpp	13 Jan 2003 19:30:04 -0000	1.2
+++ library/starter/starter.cpp	17 Jan 2003 19:29:12 -0000
@@ -83,19 +83,6 @@
 		++nPos;
 		}   
    szCmdLine[nPos] = _T('\0');
-/*   
-   for (int i = 4; i < argc; i++) {
-	  if(sizeof(szCmdLine) > (_tcslen(szCmdLine) + _tcslen(argv[i]))) 
-		{
-		_tcscat(szCmdLine, argv[i]); 
-		_tcscat(szCmdLine, __TEXT(" ")); 
-		}
-#ifdef DEBUG_MONITOR
-	  else
-		OutputDebugString("Command line is too long\n");
-#endif
-   }
-*/
 
    STARTUPINFO         si = { sizeof(si) };
    PROCESS_INFORMATION pi = { 0 };
@@ -202,10 +189,8 @@
 	int totCpyLength = cpyLength;
 	BOOL bQoutedTerm = FALSE;
 
-	if(availSpace < cpyLength)
+	if(availSpace <= cpyLength)  // = to reserve space for '\0'
 		return -1;
-//	strncpy(target, source, cpyLength);
-//	return cpyLength;
 
 	if((_T('\"') == *source) && (_T('\"') == *(source + cpyLength)))
 		bQoutedTerm = TRUE; // Already quoted
Index: os/win32/x86/spawner.dll
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core.win32/os/win32/x86/spawner.dll,v
retrieving revision 1.8
diff -u -r1.8 spawner.dll
Binary files /tmp/cvsuOYM8C and spawner.dll differ
Index: os/win32/x86/starter.exe
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core.win32/os/win32/x86/starter.exe,v
retrieving revision 1.4
diff -u -r1.4 starter.exe
Binary files /tmp/cvsbL9Xjy and starter.exe differ



Back to the top