[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