Michael Hudson:

This patch changes posixmodule.c:execv to

a) check for zero length args (does this to execve, too), raising
   ValueError.

b) raises more rational exceptions for various flavours of duff arguments.
   I *hate*
      TypeError: "illegal argument type for built-in operation"
   It has to be one of the most frustrating error messages ever.
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index e269106..2c5274a 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -1343,8 +1343,12 @@
 		getitem = PyTuple_GetItem;
 	}
 	else {
- badarg:
-		PyErr_BadArgument();
+		PyErr_SetString(PyExc_TypeError, "argv must be tuple or list");
+		return NULL;
+	}
+
+	if (argc == 0) {
+		PyErr_SetString(PyExc_ValueError, "empty argument list");
 		return NULL;
 	}
 
@@ -1354,7 +1358,10 @@
 	for (i = 0; i < argc; i++) {
 		if (!PyArg_Parse((*getitem)(argv, i), "s", &argvlist[i])) {
 			PyMem_DEL(argvlist);
-			goto badarg;
+			PyErr_SetString(PyExc_TypeError, 
+					"all arguments must be strings");
+			return NULL;
+			
 		}
 	}
 	argvlist[argc] = NULL;
@@ -1416,6 +1423,12 @@
 		return NULL;
 	}
 
+	if (argc == 0) {
+		PyErr_SetString(PyExc_ValueError, 
+				"empty argument list");
+		return NULL;
+	}
+
 	argvlist = PyMem_NEW(char *, argc+1);
 	if (argvlist == NULL) {
 		PyErr_NoMemory();