[Python-checkins] python/dist/src/Modules posixmodule.c,2.263,2.264

loewis@users.sourceforge.net loewis@users.sourceforge.net
2002年10月06日 23:44:24 -0700


Update of /cvsroot/python/python/dist/src/Modules
In directory usw-pr-cvs1:/tmp/cvs-serv1042
Modified Files:
	posixmodule.c 
Log Message:
Apply file system default encoding to exec and spawn path and arguments.
Index: posixmodule.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Modules/posixmodule.c,v
retrieving revision 2.263
retrieving revision 2.264
diff -C2 -d -r2.263 -r2.264
*** posixmodule.c	5 Oct 2002 01:47:34 -0000	2.263
--- posixmodule.c	7 Oct 2002 06:44:21 -0000	2.264
***************
*** 1853,1856 ****
--- 1853,1867 ----
 }
 
+ #if defined(HAVE_EXECV) || defined(HAVE_SPAWNV)
+ static void
+ free_string_array(char **array, int count)
+ {
+ 	int i;
+ 	for (i = 0; i < count; i++)
+ 		PyMem_Free(array[i]);
+ 	PyMem_DEL(array);
+ }
+ #endif
+ 
 
 #ifdef HAVE_EXECV
***************
*** 1874,1878 ****
 	 argv is a list or tuple of strings. */
 
! 	if (!PyArg_ParseTuple(args, "sO:execv", &path, &argv))
 		return NULL;
 	if (PyList_Check(argv)) {
--- 1885,1891 ----
 	 argv is a list or tuple of strings. */
 
! 	if (!PyArg_ParseTuple(args, "etO:execv",
! Py_FileSystemDefaultEncoding,
! &path, &argv))
 		return NULL;
 	if (PyList_Check(argv)) {
***************
*** 1886,1889 ****
--- 1899,1903 ----
 	else {
 		PyErr_SetString(PyExc_TypeError, "execv() arg 2 must be a tuple or list");
+ PyMem_Free(path);
 		return NULL;
 	}
***************
*** 1891,1905 ****
 	if (argc == 0) {
 		PyErr_SetString(PyExc_ValueError, "execv() arg 2 must not be empty");
 		return NULL;
 	}
 
 	argvlist = PyMem_NEW(char *, argc+1);
! 	if (argvlist == NULL)
 		return NULL;
 	for (i = 0; i < argc; i++) {
! 		if (!PyArg_Parse((*getitem)(argv, i), "s", &argvlist[i])) {
! 			PyMem_DEL(argvlist);
 			PyErr_SetString(PyExc_TypeError,
 					"execv() arg 2 must contain only strings");
 			return NULL;
 
--- 1905,1925 ----
 	if (argc == 0) {
 		PyErr_SetString(PyExc_ValueError, "execv() arg 2 must not be empty");
+ PyMem_Free(path);
 		return NULL;
 	}
 
 	argvlist = PyMem_NEW(char *, argc+1);
! 	if (argvlist == NULL) {
! 		PyMem_Free(path);
 		return NULL;
+ 	}
 	for (i = 0; i < argc; i++) {
! 		if (!PyArg_Parse((*getitem)(argv, i), "et",
! 				 Py_FileSystemDefaultEncoding,
! 				 &argvlist[i])) {
! 			free_string_array(argvlist, i);
 			PyErr_SetString(PyExc_TypeError,
 					"execv() arg 2 must contain only strings");
+ 			PyMem_Free(path);
 			return NULL;
 
***************
*** 1916,1920 ****
 	/* If we get here it's definitely an error */
 
! 	PyMem_DEL(argvlist);
 	return posix_error();
 }
--- 1936,1941 ----
 	/* If we get here it's definitely an error */
 
! 	free_string_array(argvlist, argc);
! 	PyMem_Free(path);
 	return posix_error();
 }
***************
*** 1939,1942 ****
--- 1960,1964 ----
 	int i, pos, argc, envc;
 	PyObject *(*getitem)(PyObject *, int);
+ 	int lastarg = 0;
 
 	/* execve has three arguments: (path, argv, env), where
***************
*** 1944,1948 ****
 	 like posix.environ. */
 
! 	if (!PyArg_ParseTuple(args, "sOO:execve", &path, &argv, &env))
 		return NULL;
 	if (PyList_Check(argv)) {
--- 1966,1972 ----
 	 like posix.environ. */
 
! 	if (!PyArg_ParseTuple(args, "etOO:execve",
! 			 Py_FileSystemDefaultEncoding,
! 			 &path, &argv, &env))
 		return NULL;
 	if (PyList_Check(argv)) {
***************
*** 1956,1964 ****
 	else {
 		PyErr_SetString(PyExc_TypeError, "execve() arg 2 must be a tuple or list");
! 		return NULL;
 	}
 	if (!PyMapping_Check(env)) {
 		PyErr_SetString(PyExc_TypeError, "execve() arg 3 must be a mapping object");
! 		return NULL;
 	}
 
--- 1980,1988 ----
 	else {
 		PyErr_SetString(PyExc_TypeError, "execve() arg 2 must be a tuple or list");
! 		goto fail_0;
 	}
 	if (!PyMapping_Check(env)) {
 		PyErr_SetString(PyExc_TypeError, "execve() arg 3 must be a mapping object");
! 		goto fail_0;
 	}
 
***************
*** 1966,1970 ****
 		PyErr_SetString(PyExc_ValueError,
 				"execve() arg 2 must not be empty");
! 		return NULL;
 	}
 
--- 1990,1994 ----
 		PyErr_SetString(PyExc_ValueError,
 				"execve() arg 2 must not be empty");
! 		goto fail_0;
 	}
 
***************
*** 1972,1985 ****
 	if (argvlist == NULL) {
 		PyErr_NoMemory();
! 		return NULL;
 	}
 	for (i = 0; i < argc; i++) {
 		if (!PyArg_Parse((*getitem)(argv, i),
! 				 "s;execve() arg 2 must contain only strings",
 				 &argvlist[i]))
 		{
 			goto fail_1;
 		}
 	}
 	argvlist[argc] = NULL;
 
--- 1996,2011 ----
 	if (argvlist == NULL) {
 		PyErr_NoMemory();
! 		goto fail_0;
 	}
 	for (i = 0; i < argc; i++) {
 		if (!PyArg_Parse((*getitem)(argv, i),
! 				 "et;execve() arg 2 must contain only strings",
 				 &argvlist[i]))
 		{
+ 			lastarg = i;
 			goto fail_1;
 		}
 	}
+ 	lastarg = argc;
 	argvlist[argc] = NULL;
 
***************
*** 2045,2051 ****
 	PyMem_DEL(envlist);
 fail_1:
! 	PyMem_DEL(argvlist);
 	Py_XDECREF(vals);
 	Py_XDECREF(keys);
 	return NULL;
 }
--- 2071,2079 ----
 	PyMem_DEL(envlist);
 fail_1:
! 	free_string_array(argvlist,lastarg);
 	Py_XDECREF(vals);
 	Py_XDECREF(keys);
+ fail_0:
+ 	PyMem_Free(path);
 	return NULL;
 }
***************
*** 2075,2079 ****
 	 argv is a list or tuple of strings. */
 
! 	if (!PyArg_ParseTuple(args, "isO:spawnv", &mode, &path, &argv))
 		return NULL;
 	if (PyList_Check(argv)) {
--- 2103,2109 ----
 	 argv is a list or tuple of strings. */
 
! 	if (!PyArg_ParseTuple(args, "ietO:spawnv", &mode,
! 			 Py_FileSystemDefaultEncoding,
! 			 &path, &argv))
 		return NULL;
 	if (PyList_Check(argv)) {
***************
*** 2087,2101 ****
 	else {
 		PyErr_SetString(PyExc_TypeError, "spawnv() arg 2 must be a tuple or list");
 		return NULL;
 	}
 
 	argvlist = PyMem_NEW(char *, argc+1);
! 	if (argvlist == NULL)
 		return NULL;
 	for (i = 0; i < argc; i++) {
! 		if (!PyArg_Parse((*getitem)(argv, i), "s", &argvlist[i])) {
! 			PyMem_DEL(argvlist);
 			PyErr_SetString(PyExc_TypeError,
 					"spawnv() arg 2 must contain only strings");
 			return NULL;
 		}
--- 2117,2137 ----
 	else {
 		PyErr_SetString(PyExc_TypeError, "spawnv() arg 2 must be a tuple or list");
+ 		PyMem_Free(path);
 		return NULL;
 	}
 
 	argvlist = PyMem_NEW(char *, argc+1);
! 	if (argvlist == NULL) {
! 		PyMem_Free(path);
 		return NULL;
+ 	}
 	for (i = 0; i < argc; i++) {
! 		if (!PyArg_Parse((*getitem)(argv, i), "et",
! 				 Py_FileSystemDefaultEncoding,
! 				 &argvlist[i])) {
! 			free_string_array(argvlist, i);
 			PyErr_SetString(PyExc_TypeError,
 					"spawnv() arg 2 must contain only strings");
+ 			PyMem_Free(path);
 			return NULL;
 		}
***************
*** 2116,2120 ****
 #endif
 
! 	PyMem_DEL(argvlist);
 
 	if (spawnval == -1)
--- 2152,2157 ----
 #endif
 
! 	free_string_array(argvlist, argc);
! 	PyMem_Free(path);
 
 	if (spawnval == -1)
***************
*** 2149,2152 ****
--- 2186,2190 ----
 	Py_intptr_t spawnval;
 	PyObject *(*getitem)(PyObject *, int);
+ 	int lastarg = 0;
 
 	/* spawnve has four arguments: (mode, path, argv, env), where
***************
*** 2154,2158 ****
 	 like posix.environ. */
 
! 	if (!PyArg_ParseTuple(args, "isOO:spawnve", &mode, &path, &argv, &env))
 		return NULL;
 	if (PyList_Check(argv)) {
--- 2192,2198 ----
 	 like posix.environ. */
 
! 	if (!PyArg_ParseTuple(args, "ietOO:spawnve", &mode,
! 			 Py_FileSystemDefaultEncoding,
! 			 &path, &argv, &env))
 		return NULL;
 	if (PyList_Check(argv)) {
***************
*** 2166,2174 ****
 	else {
 		PyErr_SetString(PyExc_TypeError, "spawnve() arg 2 must be a tuple or list");
! 		return NULL;
 	}
 	if (!PyMapping_Check(env)) {
 		PyErr_SetString(PyExc_TypeError, "spawnve() arg 3 must be a mapping object");
! 		return NULL;
 	}
 
--- 2206,2214 ----
 	else {
 		PyErr_SetString(PyExc_TypeError, "spawnve() arg 2 must be a tuple or list");
! 		goto fail_0;
 	}
 	if (!PyMapping_Check(env)) {
 		PyErr_SetString(PyExc_TypeError, "spawnve() arg 3 must be a mapping object");
! 		goto fail_0;
 	}
 
***************
*** 2176,2189 ****
 	if (argvlist == NULL) {
 		PyErr_NoMemory();
! 		return NULL;
 	}
 	for (i = 0; i < argc; i++) {
 		if (!PyArg_Parse((*getitem)(argv, i),
! 				 "s;spawnve() arg 2 must contain only strings",
 				 &argvlist[i]))
 		{
 			goto fail_1;
 		}
 	}
 	argvlist[argc] = NULL;
 
--- 2216,2232 ----
 	if (argvlist == NULL) {
 		PyErr_NoMemory();
! 		goto fail_0;
 	}
 	for (i = 0; i < argc; i++) {
 		if (!PyArg_Parse((*getitem)(argv, i),
! 				 "et;spawnve() arg 2 must contain only strings",
! 				 Py_FileSystemDefaultEncoding,
 				 &argvlist[i]))
 		{
+ 			lastarg = i;
 			goto fail_1;
 		}
 	}
+ 	lastarg = argc;
 	argvlist[argc] = NULL;
 
***************
*** 2252,2258 ****
 	PyMem_DEL(envlist);
 fail_1:
! 	PyMem_DEL(argvlist);
 	Py_XDECREF(vals);
 	Py_XDECREF(keys);
 	return res;
 }
--- 2295,2303 ----
 	PyMem_DEL(envlist);
 fail_1:
! 	free_string_array(argvlist, lastarg);
 	Py_XDECREF(vals);
 	Py_XDECREF(keys);
+ fail_0:
+ 	PyMem_Free(path);
 	return res;
 }

AltStyle によって変換されたページ (->オリジナル) /