[ Bug #116174 ] using %% in cstrings sometimes fails with unicode paramsFix for the bug reported in Bug #116174: "%% %s" % u"abc" failed due
to the way string formatting delegated work to the Unicode formatting
function.
diff --git a/Objects/stringobject.c b/Objects/stringobject.c
index ec7eb90..dbade8c 100644
--- a/Objects/stringobject.c
+++ b/Objects/stringobject.c
@@ -2666,7 +2666,7 @@
 	char *fmt, *res;
 	int fmtcnt, rescnt, reslen, arglen, argidx;
 	int args_owned = 0;
-	PyObject *result, *orig_args;
+	PyObject *result, *orig_args, *v, *w;
 	PyObject *dict = NULL;
 	if (format == NULL || !PyString_Check(format) || args == NULL) {
 		PyErr_BadInternalCall();
@@ -3055,22 +3055,28 @@
 		Py_INCREF(orig_args);
 		args = orig_args;
 	}
-	/* Paste rest of format string to what we have of the result
-	   string; we reuse result for this */
+	args_owned = 1;
+	/* Take what we have of the result and let the Unicode formatting
+	   function format the rest of the input. */
 	rescnt = res - PyString_AS_STRING(result);
+	if (_PyString_Resize(&result, rescnt))
+		goto error;
 	fmtcnt = PyString_GET_SIZE(format) - \
 		 (fmt - PyString_AS_STRING(format));
-	if (_PyString_Resize(&result, rescnt + fmtcnt)) {
-		Py_DECREF(args);
+	format = PyUnicode_Decode(fmt, fmtcnt, NULL, NULL);
+	if (format == NULL)
 		goto error;
-	}
-	memcpy(PyString_AS_STRING(result) + rescnt, fmt, fmtcnt);
-	format = result;
-	/* Let Unicode do its magic */
-	result = PyUnicode_Format(format, args);
+	v = PyUnicode_Format(format, args);
 	Py_DECREF(format);
+	if (v == NULL)
+		goto error;
+	/* Paste what we have (result) to what the Unicode formatting
+	   function returned (v) and return the result (or error) */
+	w = PyUnicode_Concat(result, v);
+	Py_DECREF(result);
+	Py_DECREF(v);
 	Py_DECREF(args);
-	return result;
+	return w;
 	
  error:
 	Py_DECREF(result);