On Fri, Feb 12, 2021 at 12:14:27PM +0100, Michal Privoznik wrote:
On 2/12/21 11:07 AM, Erik Skultety wrote:
> On Fri, Feb 12, 2021 at 10:43:56AM +0100, Martin Kletzander wrote:
> > On Fri, Feb 12, 2021 at 12:54:02AM -0500, Laine Stump wrote:
> > > I've looked at a few of these, and one thing I've found is that
very
> > > often we have a function called somethingSomethingClear(), and:
> > >
> > > 1) The only places it is ever called will immediately free the memory
> > > of the object as soon as they clear it.
> > >
> > > and very possibly
> > >
> > > 2) It doesn't actually *clear* everything. Some items are cleared via
VIR_FREE(), but then some of the other pointers call
> > >
> > > bobLoblawFree(def->bobloblaw)
> > >
> > > and then don't actually set def->bobloblaw to NULL - so the
functions
> > > aren't actually "Clearing", they're "Freeing and
then clearing a few
> > > things, but not everything".
> > >
> >
> > One thing I am wondering is whether this is really only used where it makes
> > sense. As far as I understand, and please correct me if I am way off, the
> > purpose of the Clear functions is to:
> >
> > a) provide a way to remove everything from a structure that the current
> > function cannot recreate (there is a pointer to it somewhere else which
> > would not be updated) and
> >
> > b) provide a way to reset a structure so that it can be filled again without
> > needless reallocation.
> >
> > I think (b) is obviously pointless, especially lately, so the only reasonable
> > usage would be for the scenario (a). However, I think I remember this also
> > being used in places where it would be perfectly fine to free the variable and
> > recreate it. Maybe it could ease up the decision, at least by eliminating
some
> > of the code, if my hunch is correct.
> >
> > In my quick search I only found virDomainVideoDefClear to be used in this
manner
> > and I am not convinced that it is worth having this extra function with extra
>
> You could always memset it explicitly, someone might find the code more
> readable then. IMO I'd vote for an explicit memset just for the sake of better
> security practice (since we'll have to wait a little while for something like
> SGX to be convenient to deploy and develop with...). Anyhow, I'm not sure how
> many cycles exactly would be wasted, but IIRC a recent discussion memset can be
> optimized away (correct me if I don't remember it well!), so Dan P.B.
> suggested to gradually convert to some platform-specific ways on how to
> sanitize the memory safely - with that in mind, I'd say we use an explicit
> memset in all the functions in question and convert them later?
I think one can argue that if there's a memset() called inside a function
that is supposed to clear out a member of a struct and later the member is
tested against NULL, but compiler decides to "optimize" memset out - it's
a
compiler bug.
I agree - it is, especially now that GCC employs a static analyzer it should be
smart and not optimize it away, not sure whether the memset optimization
happened only with GCC or was a generic thing hence I won't try to make any
comments about Clang.
Erik