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

loewis@users.sourceforge.net loewis@users.sourceforge.net
Sun, 06 Oct 2002 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;
  }