]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.12] gh-116545: Fix error handling in `mkpwent` in `pwdmodule` (GH-116548) (#116593)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Mon, 11 Mar 2024 11:55:09 +0000 (12:55 +0100)
committerGitHub <noreply@github.com>
Mon, 11 Mar 2024 11:55:09 +0000 (11:55 +0000)
gh-116545: Fix error handling in `mkpwent` in `pwdmodule` (GH-116548)
(cherry picked from commit ffd79bea0f032df5a2e7f75e8c823a09cdc7c7a2)

Co-authored-by: Nikita Sobolev <mail@sobolevn.me>
Modules/pwdmodule.c

index cc2e2a43893971d4a2f8dc5036b78c74e0278362..920259a62c48549e2dabcd837aa95fb9f34d48dc 100644 (file)
@@ -63,53 +63,52 @@ static struct PyModuleDef pwdmodule;
 
 #define DEFAULT_BUFFER_SIZE 1024
 
-static void
-sets(PyObject *v, int i, const char* val)
-{
-  if (val) {
-      PyObject *o = PyUnicode_DecodeFSDefault(val);
-      PyStructSequence_SET_ITEM(v, i, o);
-  }
-  else {
-      PyStructSequence_SET_ITEM(v, i, Py_None);
-      Py_INCREF(Py_None);
-  }
-}
-
 static PyObject *
 mkpwent(PyObject *module, struct passwd *p)
 {
-    int setIndex = 0;
     PyObject *v = PyStructSequence_New(get_pwd_state(module)->StructPwdType);
-    if (v == NULL)
+    if (v == NULL) {
         return NULL;
+    }
+
+    int setIndex = 0;
+
+#define SET_STRING(VAL) \
+    SET_RESULT((VAL) ? PyUnicode_DecodeFSDefault((VAL)) : Py_NewRef(Py_None))
 
-#define SETS(i,val) sets(v, i, val)
+#define SET_RESULT(CALL)                                     \
+    do {                                                     \
+        PyObject *item = (CALL);                             \
+        if (item == NULL) {                                  \
+            goto error;                                      \
+        }                                                    \
+        PyStructSequence_SET_ITEM(v, setIndex++, item);      \
+    } while(0)
 
-    SETS(setIndex++, p->pw_name);
+    SET_STRING(p->pw_name);
 #if defined(HAVE_STRUCT_PASSWD_PW_PASSWD) && !defined(__ANDROID__)
-    SETS(setIndex++, p->pw_passwd);
+    SET_STRING(p->pw_passwd);
 #else
-    SETS(setIndex++, "");
+    SET_STRING("");
 #endif
-    PyStructSequence_SET_ITEM(v, setIndex++, _PyLong_FromUid(p->pw_uid));
-    PyStructSequence_SET_ITEM(v, setIndex++, _PyLong_FromGid(p->pw_gid));
+    SET_RESULT(_PyLong_FromUid(p->pw_uid));
+    SET_RESULT(_PyLong_FromGid(p->pw_gid));
 #if defined(HAVE_STRUCT_PASSWD_PW_GECOS)
-    SETS(setIndex++, p->pw_gecos);
+    SET_STRING(p->pw_gecos);
 #else
-    SETS(setIndex++, "");
+    SET_STRING("");
 #endif
-    SETS(setIndex++, p->pw_dir);
-    SETS(setIndex++, p->pw_shell);
-
-#undef SETS
+    SET_STRING(p->pw_dir);
+    SET_STRING(p->pw_shell);
 
-    if (PyErr_Occurred()) {
-        Py_XDECREF(v);
-        return NULL;
-    }
+#undef SET_STRING
+#undef SET_RESULT
 
     return v;
+
+error:
+    Py_DECREF(v);
+    return NULL;
 }
 
 /*[clinic input]