summaryrefslogtreecommitdiffstats
path: root/Modules/pwdmodule.c
diff options
context:
space:
mode:
authorNikita Sobolev <mail@sobolevn.me>2024-03-11 10:58:24 (GMT)
committerGitHub <noreply@github.com>2024-03-11 10:58:24 (GMT)
commitffd79bea0f032df5a2e7f75e8c823a09cdc7c7a2 (patch)
treeadd20899414efd2190482c7714d63551441f1dde /Modules/pwdmodule.c
parent1cc02ca063f50b8c527fbdde9957b03c145c1575 (diff)
downloadcpython-ffd79bea0f032df5a2e7f75e8c823a09cdc7c7a2.zip
cpython-ffd79bea0f032df5a2e7f75e8c823a09cdc7c7a2.tar.gz
cpython-ffd79bea0f032df5a2e7f75e8c823a09cdc7c7a2.tar.bz2
gh-116545: Fix error handling in `mkpwent` in `pwdmodule` (#116548)
Diffstat (limited to 'Modules/pwdmodule.c')
-rw-r--r--Modules/pwdmodule.c61
1 files changed, 30 insertions, 31 deletions
diff --git a/Modules/pwdmodule.c b/Modules/pwdmodule.c
index b703436..c59a8e4 100644
--- a/Modules/pwdmodule.c
+++ b/Modules/pwdmodule.c
@@ -64,53 +64,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]