[Python-checkins] python/dist/src/PC _winreg.c,1.14,1.15

gvanrossum at users.sourceforge.net gvanrossum at users.sourceforge.net
Sun Nov 30 17:01:47 EST 2003


Update of /cvsroot/python/python/dist/src/PC
In directory sc8-pr-cvs1:/tmp/cvs-serv9905

Modified Files:
	_winreg.c 
Log Message:
Remove all uses of alloca() from this module.  The alloca() return value
isn't checked, and it *is* possible that a very large alloca() call is
made, e.g. when a large registry value is being read.  I don't know if
alloca() in that case returns NULL or returns a pointer pointing outside
the stack, and I don't want to know -- I've simply replaced all calls to
alloca() with either PyMem_Malloc() or PyString_FromStringAndSize(NULL,)
as appropriate, followed by a size check.  This addresses SF buf 851056.
Will backport to 2.3 next.


Index: _winreg.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/PC/_winreg.c,v
retrieving revision 1.14
retrieving revision 1.15
diff -C2 -d -r1.14 -r1.15
*** _winreg.c	15 Jan 2003 23:38:15 -0000	1.14
--- _winreg.c	30 Nov 2003 22:01:43 -0000	1.15
***************
*** 1032,1035 ****
--- 1032,1036 ----
  	int index;
  	long rc;
+ 	PyObject *retStr;
  	char *retBuf;
  	DWORD len;
***************
*** 1046,1054 ****
  							   "RegQueryInfoKey");
  	++len;    /* include null terminator */
! 	retBuf = (char *)alloca(len);
  
! 	if ((rc = RegEnumKey(hKey, index, retBuf, len)) != ERROR_SUCCESS)
  		return PyErr_SetFromWindowsErrWithFunction(rc, "RegEnumKey");
! 	return Py_BuildValue("s", retBuf);
  }
  
--- 1047,1061 ----
  							   "RegQueryInfoKey");
  	++len;    /* include null terminator */
! 	retStr = PyString_FromStringAndSize(NULL, len);
! 	if (retStr == NULL)
! 		return NULL;
! 	retBuf = PyString_AS_STRING(retStr);
  
! 	if ((rc = RegEnumKey(hKey, index, retBuf, len)) != ERROR_SUCCESS) {
! 		Py_DECREF(retStr);
  		return PyErr_SetFromWindowsErrWithFunction(rc, "RegEnumKey");
! 	}
! 	_PyString_Resize(&retStr, strlen(retBuf));
! 	return retStr;
  }
  
***************
*** 1081,1086 ****
  	++retValueSize;    /* include null terminators */
  	++retDataSize;
! 	retValueBuf = (char *)alloca(retValueSize);
! 	retDataBuf = (char *)alloca(retDataSize);
  
  	Py_BEGIN_ALLOW_THREADS
--- 1088,1099 ----
  	++retValueSize;    /* include null terminators */
  	++retDataSize;
! 	retValueBuf = (char *)PyMem_Malloc(retValueSize);
! 	if (retValueBuf == NULL)
! 		return PyErr_NoMemory();
! 	retDataBuf = (char *)PyMem_Malloc(retDataSize);
! 	if (retDataBuf == NULL) {
! 		PyMem_Free(retValueBuf);
! 		return PyErr_NoMemory();
! 	}
  
  	Py_BEGIN_ALLOW_THREADS
***************
*** 1095,1106 ****
  	Py_END_ALLOW_THREADS
  
! 	if (rc != ERROR_SUCCESS)
! 		return PyErr_SetFromWindowsErrWithFunction(rc,
! 							   "PyRegEnumValue");
  	obData = Reg2Py(retDataBuf, retDataSize, typ);
! 	if (obData == NULL)
! 		return NULL;
  	retVal = Py_BuildValue("sOi", retValueBuf, obData, typ);
  	Py_DECREF(obData);
  	return retVal;
  }
--- 1108,1126 ----
  	Py_END_ALLOW_THREADS
  
! 	if (rc != ERROR_SUCCESS) {
! 		retVal = PyErr_SetFromWindowsErrWithFunction(rc,
! 							     "PyRegEnumValue");
! 		goto fail;
! 	}
  	obData = Reg2Py(retDataBuf, retDataSize, typ);
! 	if (obData == NULL) {
! 		retVal = NULL;
! 		goto fail;
! 	}
  	retVal = Py_BuildValue("sOi", retValueBuf, obData, typ);
  	Py_DECREF(obData);
+   fail:
+ 	PyMem_Free(retValueBuf);
+ 	PyMem_Free(retDataBuf);
  	return retVal;
  }
***************
*** 1207,1214 ****
  	PyObject *obKey;
  	char *subKey;
- 
  	long rc;
  	char *retBuf;
  	long bufSize = 0;
  	if (!PyArg_ParseTuple(args, "Oz:QueryValue", &obKey, &subKey))
  		return NULL;
--- 1227,1235 ----
  	PyObject *obKey;
  	char *subKey;
  	long rc;
+ 	PyObject *retStr;
  	char *retBuf;
  	long bufSize = 0;
+ 
  	if (!PyArg_ParseTuple(args, "Oz:QueryValue", &obKey, &subKey))
  		return NULL;
***************
*** 1220,1229 ****
  		return PyErr_SetFromWindowsErrWithFunction(rc,
  							   "RegQueryValue");
! 	retBuf = (char *)alloca(bufSize);
  	if ((rc = RegQueryValue(hKey, subKey, retBuf, &bufSize))
! 	    != ERROR_SUCCESS)
  		return PyErr_SetFromWindowsErrWithFunction(rc,
  							   "RegQueryValue");
! 	return Py_BuildValue("s", retBuf);
  }
  
--- 1241,1256 ----
  		return PyErr_SetFromWindowsErrWithFunction(rc,
  							   "RegQueryValue");
! 	retStr = PyString_FromStringAndSize(NULL, bufSize);
! 	if (retStr == NULL)
! 		return NULL;
! 	retBuf = PyString_AS_STRING(retStr);
  	if ((rc = RegQueryValue(hKey, subKey, retBuf, &bufSize))
! 	    != ERROR_SUCCESS) {
! 		Py_DECREF(retStr);
  		return PyErr_SetFromWindowsErrWithFunction(rc,
  							   "RegQueryValue");
! 	}
! 	_PyString_Resize(&retStr, strlen(retBuf));
! 	return retStr;
  }
  
***************
*** 1253,1263 ****
  		return PyErr_SetFromWindowsErrWithFunction(rc,
  							   "RegQueryValueEx");
! 	retBuf = (char *)alloca(bufSize);
  	if ((rc = RegQueryValueEx(hKey, valueName, NULL,
  				  &typ, (BYTE *)retBuf, &bufSize))
! 	    != ERROR_SUCCESS)
  		return PyErr_SetFromWindowsErrWithFunction(rc,
  							   "RegQueryValueEx");
  	obData = Reg2Py(retBuf, bufSize, typ);
  	if (obData == NULL)
  		return NULL;
--- 1280,1295 ----
  		return PyErr_SetFromWindowsErrWithFunction(rc,
  							   "RegQueryValueEx");
! 	retBuf = (char *)PyMem_Malloc(bufSize);
! 	if (retBuf == NULL)
! 		return PyErr_NoMemory();
  	if ((rc = RegQueryValueEx(hKey, valueName, NULL,
  				  &typ, (BYTE *)retBuf, &bufSize))
! 	    != ERROR_SUCCESS) {
! 		PyMem_Free(retBuf);
  		return PyErr_SetFromWindowsErrWithFunction(rc,
  							   "RegQueryValueEx");
+ 	}
  	obData = Reg2Py(retBuf, bufSize, typ);
+ 	PyMem_Free((void *)retBuf);
  	if (obData == NULL)
  		return NULL;





More information about the Python-checkins mailing list