Skip to content

Commit

Permalink
pythongh-116545: Fix error handling in mkpwent in pwdmodule (pyth…
Browse files Browse the repository at this point in the history
  • Loading branch information
sobolevn committed Mar 11, 2024
1 parent 1cc02ca commit ffd79be
Showing 1 changed file with 30 additions and 31 deletions.
61 changes: 30 additions & 31 deletions Modules/pwdmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down

0 comments on commit ffd79be

Please sign in to comment.