[Python-checkins] r84199 - in python/branches/py3k: Misc/NEWS Modules/nismodule.c

martin.v.loewis python-checkins at python.org
Thu Aug 19 11:11:51 CEST 2010


Author: martin.v.loewis
Date: Thu Aug 19 11:11:51 2010
New Revision: 84199

Log:
Decode NIS data to fs encoding, using the surrogate error handler.


Modified:
   python/branches/py3k/Misc/NEWS
   python/branches/py3k/Modules/nismodule.c

Modified: python/branches/py3k/Misc/NEWS
==============================================================================
--- python/branches/py3k/Misc/NEWS	(original)
+++ python/branches/py3k/Misc/NEWS	Thu Aug 19 11:11:51 2010
@@ -69,7 +69,8 @@
 - Issue #5737: Add Solaris-specific mnemonics in the errno module.  Patch by
   Matthew Ahrens.
 
-- Restore GIL in nis_cat in case of error.
+- Restore GIL in nis_cat in case of error. Decode NIS data to fs encoding,
+  using the surrogate error handler.
 
 - Issue #665761: ``functools.reduce()`` will no longer mask exceptions
   other than ``TypeError`` raised by the iterator argument.

Modified: python/branches/py3k/Modules/nismodule.c
==============================================================================
--- python/branches/py3k/Modules/nismodule.c	(original)
+++ python/branches/py3k/Modules/nismodule.c	Thu Aug 19 11:11:51 2010
@@ -117,8 +117,8 @@
             if (invallen > 0 && inval[invallen-1] == '\0')
             invallen--;
         }
-        key = PyUnicode_FromStringAndSize(inkey, inkeylen);
-        val = PyUnicode_FromStringAndSize(inval, invallen);
+        key = PyUnicode_DecodeFSDefaultAndSize(inkey, inkeylen);
+        val = PyUnicode_DecodeFSDefaultAndSize(inval, invallen);
         if (key == NULL || val == NULL) {
             /* XXX error -- don't know how to handle */
             PyErr_Clear();
@@ -159,30 +159,40 @@
 {
     char *match;
     char *domain = NULL;
-    int keylen, len;
+    Py_ssize_t keylen;
+    int len;
     char *key, *map;
     int err;
-    PyObject *res;
+    PyObject *ukey, *bkey, *res;
     int fix;
     static char *kwlist[] = {"key", "map", "domain", NULL};
 
     if (!PyArg_ParseTupleAndKeywords(args, kwdict,
-                                     "s#s|s:match", kwlist,
-                                     &key, &keylen, &map, &domain))
+                                     "Us|s:match", kwlist,
+                                     &ukey, &map, &domain))
         return NULL;
-    if (!domain && ((err = yp_get_default_domain(&domain)) != 0))
+    if ((bkey = PyUnicode_EncodeFSDefault(ukey)) == NULL)
+        return NULL;
+    if (PyBytes_AsStringAndSize(bkey, &key, &keylen) == -1) {
+        Py_DECREF(bkey);
+        return NULL;
+    }
+    if (!domain && ((err = yp_get_default_domain(&domain)) != 0)) {
+        Py_DECREF(bkey);
         return nis_error(err);
+    }
     map = nis_mapname (map, &fix);
     if (fix)
         keylen++;
     Py_BEGIN_ALLOW_THREADS
     err = yp_match (domain, map, key, keylen, &match, &len);
     Py_END_ALLOW_THREADS
+    Py_DECREF(bkey);
     if (fix)
         len--;
     if (err != 0)
         return nis_error(err);
-    res = PyUnicode_FromStringAndSize (match, len);
+    res = PyUnicode_DecodeFSDefaultAndSize(match, len);
     free (match);
     return res;
 }


More information about the Python-checkins mailing list