svn commit: r355137 - head/sys/vm

Ryan Libby rlibby at freebsd.org
Tue Dec 3 20:59:32 UTC 2019


On Tue, Dec 3, 2019 at 12:43 PM Gleb Smirnoff <glebius at freebsd.org> wrote:
>
>   Ryan,
>
> On Wed, Nov 27, 2019 at 07:49:56PM +0000, Ryan Libby wrote:
> R> Author: rlibby
> R> Date: Wed Nov 27 19:49:55 2019
> R> New Revision: 355137
> R> URL: https://svnweb.freebsd.org/changeset/base/355137
> R>
> R> Log:
> R>   uma: trash memory when ctor/dtor supplied too
> R>
> R>   On INVARIANTS kernels, UMA has a use-after-free detection mechanism.
> R>   This mechanism previously required that all of the ctor/dtor/uminit/fini
> R>   arguments to uma_zcreate() be NULL in order to function.  Now, it only
> R>   requires that uminit and fini be NULL; now, the trash ctor and dtor will
> R>   be called in addition to any supplied ctor or dtor.
> R>
> R>   Also do a little refactoring for readability of the resulting logic.
> R>
> R>   This enables use-after-free detection for more zones, and will allow for
> R>   simplification of some callers that worked around the previous
> R>   restriction (see kern_mbuf.c).
> R>
> R>   Reviewed by:       jeff, markj
> R>   Sponsored by:      Dell EMC Isilon
> R>   Differential Revision:     https://reviews.freebsd.org/D20722
>
> If I understand the change correct, now items from UMA_ZONE_NOFREE zones
> will be trashed, too. That would undermine purpose of UMA_ZONE_NOFREE.
> Of course the flag is a hack, but some systems rely on it working.
>
> --
> Gleb Smirnoff

The intent is not to change anything for NOFREE zones (i.e. still don't
trash them).  I didn't put all the detail in the commit log, but I did
reword the block comment in uma_zcreate:

> @@ -2302,14 +2307,17 @@ uma_zcreate(const char *name, size_t size, uma_ctor ct
>         args.fini = fini;
>  #ifdef  INVARIANTS
>         /*
> -        * If a zone is being created with an empty constructor and
> -        * destructor, pass UMA constructor/destructor which checks for
> -        * memory use after free.
> +        * Inject procedures which check for memory use after free if we are
> +        * allowed to scramble the memory while it is not allocated.  This
> +        * requires that: UMA is actually able to access the memory, no init
> +        * or fini procedures, no dependency on the initial value of the
> +        * memory, and no (legitimate) use of the memory after free.  Note,
> +        * the ctor and dtor do not need to be empty.
> +        *
> +        * XXX UMA_ZONE_OFFPAGE.
>          */
>         if ((!(flags & (UMA_ZONE_ZINIT | UMA_ZONE_NOFREE))) &&
> -           ctor == NULL && dtor == NULL && uminit == NULL && fini == NULL) {
> -               args.ctor = trash_ctor;
> -               args.dtor = trash_dtor;
> +           uminit == NULL && fini == NULL) {
>                 args.uminit = trash_init;
>                 args.fini = trash_fini;
>         }

Ryan


More information about the svn-src-head mailing list