svn commit: r366375 - head/lib/libc/locale

Mark Johnston markj at FreeBSD.org
Fri Oct 2 18:35:56 UTC 2020


Author: markj
Date: Fri Oct  2 18:35:55 2020
New Revision: 366375
URL: https://svnweb.freebsd.org/changeset/base/366375

Log:
  newlocale(3): Fix a memory leak.
  
  newlocale() optionally takes a "base" locale, from which components not
  specified in the mask are inherited.  POSIX says that newlocale() may
  modify "base" and return it, or free "base" and return a newly allocated
  locale.  We were not doing either, so applications which use newlocale()
  to modify an existing base locale end up leaking memory on FreeBSD.
  
  This diff fixes the leak by releasing a reference to the base locale
  before returning.  This is less efficient than modifying "base"
  directly, but is simpler for an initial bug fix.  Also, update the man
  page to clarify behaviour with respect to "base".
  
  PR:		249416
  MFC after:	3 weeks
  Sponsored by:	The FreeBSD Foundation
  Differential Revision:	https://reviews.freebsd.org/D26522

Modified:
  head/lib/libc/locale/newlocale.3
  head/lib/libc/locale/xlocale.c

Modified: head/lib/libc/locale/newlocale.3
==============================================================================
--- head/lib/libc/locale/newlocale.3	Fri Oct  2 18:29:25 2020	(r366374)
+++ head/lib/libc/locale/newlocale.3	Fri Oct  2 18:35:55 2020	(r366375)
@@ -26,7 +26,7 @@
 .\" SUCH DAMAGE.
 .\"
 .\" $FreeBSD$
-.Dd September 17, 2011
+.Dd October 2, 2020
 .Dt NEWLOCALE 3
 .Os
 .Sh NAME
@@ -46,7 +46,20 @@ defines the components that the new locale will have s
 name specified in the
 .Fa locale
 parameter.
-Any other components will be inherited from
+Any components not specified in
+.Fa mask
+will be inherited from the locale referenced by
+.Fa base ,
+if
+.Fa base
+is not
+.Dv NULL .
+If the call is successful, the state of the locale referenced by
+.Fa base
+is unspecified, and it must not be accessed.
+The special locale
+.Dv LC_GLOBAL_LOCALE
+may not be specified for
 .Fa base .
 The
 .Fa mask

Modified: head/lib/libc/locale/xlocale.c
==============================================================================
--- head/lib/libc/locale/xlocale.c	Fri Oct  2 18:29:25 2020	(r366374)
+++ head/lib/libc/locale/xlocale.c	Fri Oct  2 18:35:55 2020	(r366375)
@@ -251,6 +251,7 @@ static int dupcomponent(int type, locale_t base, local
 
 locale_t newlocale(int mask, const char *locale, locale_t base)
 {
+	locale_t orig_base;
 	int type;
 	const char *realLocale = locale;
 	int useenv = 0;
@@ -263,6 +264,7 @@ locale_t newlocale(int mask, const char *locale, local
 		return (NULL);
 	}
 
+	orig_base = base;
 	FIX_LOCALE(base);
 	copyflags(new, base);
 
@@ -297,6 +299,8 @@ locale_t newlocale(int mask, const char *locale, local
 	if (0 == success) {
 		xlocale_release(new);
 		new = NULL;
+	} else if (base == orig_base) {
+		xlocale_release(base);
 	}
 
 	return (new);


More information about the svn-src-head mailing list