Please use "error and out" logic (Re: [PATCH] Avoid privileged segfault in GetNCChanges and add many more tests)
Andrew Bartlett
abartlet at samba.org
Wed Aug 9 18:57:54 UTC 2017
On Wed, 2017-08-09 at 09:14 +0200, Stefan Metzmacher wrote:
> Hi Andrew,
>
> > - sid = pytalloc_get_ptr(py_sid);
> > + if (PyObject_TypeCheck(py_sid, &dom_sid_Type)) {
> > + sid = pytalloc_get_ptr(py_sid);
> > + } else {
> > + PyErr_SetString(PyExc_TypeError,
> > + "expected security.dom_sid "
> > + "for second argument to .from_sddl");
> > + return NULL;
> > +
> > + }
> >
> > secdesc = sddl_decode(NULL, sddl, sid);
> > if (secdesc == NULL) {
> > --
>
> Can we please agree on using an "error and out logic" for new code?
> There's really no good reason to have the additional indentation
> for the "sid = pytalloc_get_ptr(py_sid);" line!
> I thought this was part of README.Coding for a long time already,
> but I can't find it...
Sure. I'm happy to fix this up.
> The above example seems harmless, but I notice new examples
> almost every time I review patches from you or once you reviewed.
> These act as bad examples others will likely copy'n'paste or
> at least learn from.
>
> This morning I also noticed
>
> + if (ret == LDB_SUCCESS) {
> + if (result->count == 0) {
> + ret = LDB_ERR_NO_SUCH_OBJECT;
> + } else {
> + struct ldb_message *match =
> + get_best_match(dn, result);
> + if (match == NULL) {
> + TALLOC_FREE(frame);
> + return LDB_ERR_OPERATIONS_ERROR;
> + }
> + *msg = talloc_move(mem_ctx, &match);
> + }
> + }
> => here
> + TALLOC_FREE(frame);
> + return ret;
>
> Which adds a lot of useless indentation and it makes it really
> hard to add new code where I added "here", as you need remember
> and understand all the logic be had above or protect
> the new code by using another "if (ret == LDB_SUCCESS) {"
>
> It should be:
>
> if (ret != LDB_SUCCESS) {
> TALLOC_FREE(frame);
> return ret;
> }
>
> if (result->count == 0) {
> TALLOC_FREE(frame);
> return LDB_ERR_NO_SUCH_OBJECT;
> }
>
> match = get_best_match(dn, result);
> if (match == NULL) {
> TALLOC_FREE(frame);
> return LDB_ERR_OPERATIONS_ERROR;
> }
>
> *msg = talloc_move(mem_ctx, &match);
> TALLOC_FREE(frame);
> return LDB_SUCCESS; <= This is important to be not "return ret;"
I'll work with Gary to fix this one up.
> Untangling these kind of spaghetti was the major pain I had when
> working on spnego.c, it took days in order to understand the logic
> of some functions.
>
> I know we have to live with our existing code for a long time,
> but we should really try hard to avoid it for new code.
>
> I started to write such a mail already a few weeks ago,
> but discarded it in order to enjoy my vacation...
>
> (I hope this mail is not too harsh, but reviewing this of stuff
> ruins my day)
Do you have any thoughts on the substantive part of the patch, being
the segfault fix and the tests?
Andrew Bartlett
--
Andrew Bartlett http://samba.org/~abartlet/
Authentication Developer, Samba Team http://samba.org
Samba Developer, Catalyst IT http://catalyst.net.nz/services/samba
More information about the samba-technical
mailing list