Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 12 Aug 2015 22:14:38 +0200
From:      Jilles Tjoelker <jilles@stack.nl>
To:        Bruce Evans <brde@optusnet.com.au>
Cc:        Baptiste Daroussin <bapt@freebsd.org>, src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   Re: svn commit: r286521 - projects/collation/lib/libc/locale
Message-ID:  <20150812201438.GA26529@stack.nl>
In-Reply-To: <20150809223647.O2415@besplex.bde.org>
References:  <201508091150.t79Boo3v096088@repo.freebsd.org> <20150809223647.O2415@besplex.bde.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sun, Aug 09, 2015 at 10:54:15PM +1000, Bruce Evans wrote:
> On Sun, 9 Aug 2015, Baptiste Daroussin wrote:

> > Log:
> >  Use asprintf/free instead of snprintf

> Why?  It takes 3 times as much code, and immediately gave you a memory
> leak when you wrote only twice as much.  You fixed the memory leak in the
> next commit, but it might not always be so easy to see.

> > Modified: projects/collation/lib/libc/locale/collate.c
> > ==============================================================================
> > --- projects/collation/lib/libc/locale/collate.c	Sun Aug  9 11:47:01 2015	(r286520)
> > +++ projects/collation/lib/libc/locale/collate.c	Sun Aug  9 11:50:50 2015	(r286521)
> > @@ -107,7 +107,7 @@ int
> > __collate_load_tables_l(const char *encoding, struct xlocale_collate *table)
> > {
> > 	int i, chains, z;
> > -	char buf[PATH_MAX];
> > +	char *buf;

> POSIX_ME_HARDER code would use {PATH_MAX} = sysconf(__PATH_MAX) and error
> handling for sysconf() and then for malloc()ing {PATH_MAX} bytes.  This
> would take 10 times as much code, except it could use a VLA with no
> error checking for the allocation starting with C99.  The asprintf()
> method would be better then.

No, POSIX_ME_HARDER code would use dynamic allocation (but without
asprintf() since that's not in POSIX). This is because {PATH_MAX} may be
indeterminate (pathconf() returns -1 but does not set errno).

Note that some usages of certain functions are invalid when {PATH_MAX}
is indeterminate, for example realpath() with a non-NULL resolved_path
parameter.

It seems uncommon to have a fixed {PATH_MAX} but not define it as a
compile-time constant. An indeterminate {PATH_MAX} is used in GNU Hurd
and its developers occasionally patch software to make it cope with
that.

I think it is fine to use dynamic allocation here.

-- 
Jilles Tjoelker



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