Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 16 Nov 2009 10:30:09 +0100
From:      Christian Brueffer <brueffer@FreeBSD.org>
To:        Jim Wilcoxson <prirun@gmail.com>
Cc:        freebsd-bugs@freebsd.org, testing@lists.pcbsd.org
Subject:   Re: acl_from_text leaking memory
Message-ID:  <20091116093008.GB1459@serenity>
In-Reply-To: <c5830b750911150804i694b00aai891819242816e89c@mail.gmail.com>
References:  <c5830b750911150804i694b00aai891819242816e89c@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help

--pWyiEgJYm5f9v55/
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

On Sun, Nov 15, 2009 at 11:04:19AM -0500, Jim Wilcoxson wrote:
> I've been working on a new backup program, HashBackup, and believe I
> have found a memory leak with ACLs in PCBSD/FreeBSD 7.1 and OSX
> (Leopard).
>=20
> acl_from_text is a function that takes a text string as input, and
> returns a pointer to a malloc'd acl.  This acl is then freed with
> acl_free.  I noticed that acl_from_text appears to leak memory.  This
> is not used during the backup of a filesystem, but is needed to do a
> restore.
>=20
> After looking at the acl_from_text source in /usr/src/lib/libc/posix1e
> (from PCBSD7.1), I believe the problem is that the duplicate text
> string, mybuf_p, is not freed on normal return of this function.  Here
> is the end of this function:
>=20
>         }
>=20
> #if 0
>         /* XXX Should we only return ACLs valid according to acl_valid? */
>         /* Verify validity of the ACL we read in. */
>         if (acl_valid(acl) =3D=3D -1) {
>                 errno =3D EINVAL;
>                 goto error_label;
>         }
> #endif
>=20
>         return(acl);
>=20
> error_label:
>         acl_free(acl);
>         free(mybuf_p);
>         return(NULL);
> }
>=20
> I think there should be a free(mybuf_p) before return(acl).
>=20
> Here is a PCBSD/FreeBSD test program that causes the memory leak:
>=20
> #include <stdio.h>
> #include <sys/types.h>
> #include <sys/acl.h>
>=20
> main() {
>    acl_t acl;
>    char* acltext;
>=20
>    acltext =3D "user::rw-\n group::r--\n mask::r--\n other::r--\n";
>    while (1) {
>       acl =3D acl_from_text(acltext);
>       if (acl =3D=3D NULL)
>         printf("acl_from_text failed\n");
>       if (acl_free(acl) !=3D 0)
>         printf("acl_free failed\n");
>   }
> }
>=20
> I've subscribed to the lists for a few days in case there are
> questions or I can help test something.
>=20

Hi Jim,

this looks good, I`ve just committed it to HEAD.  I will merge it to
the stable branches next week.  Thanks for the submission!

- Christian

--=20
Christian Brueffer	chris@unixpages.org	brueffer@FreeBSD.org
GPG Key:	 http://people.freebsd.org/~brueffer/brueffer.key.asc
GPG Fingerprint: A5C8 2099 19FF AACA F41B  B29B 6C76 178C A0ED 982D

--pWyiEgJYm5f9v55/
Content-Type: application/pgp-signature
Content-Disposition: inline

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (FreeBSD)

iEYEARECAAYFAksBG6AACgkQbHYXjKDtmC2nIgCfbL2meL4DiA1moZl9f5cnL8VZ
zasAoKngKM/90ry+MoyooNAPJeRhHMtY
=10U9
-----END PGP SIGNATURE-----

--pWyiEgJYm5f9v55/--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20091116093008.GB1459>