svn commit: r314961 - head/usr.bin/localedef
O. Hartmann
ohartmann at walstatt.org
Thu Mar 9 17:50:21 UTC 2017
Am Thu, 9 Mar 2017 15:21:03 +0000 (UTC)
"Pedro F. Giffuni" <pfg at FreeBSD.org> schrieb:
> Author: pfg
> Date: Thu Mar 9 15:21:03 2017
> New Revision: 314961
> URL: https://svnweb.freebsd.org/changeset/base/314961
>
> Log:
> localedef(1): Fix for memory leaks reported by coverity.
>
> Also some small cleanups to match better current illumos.
>
> CID: 1338540, 1338541, 1338557, 1338566
>
> Obtained from: illumos
> Discussed with: Yuri Pankov (@Nexenta)
> MFC after: 5 days
>
> Modified:
> head/usr.bin/localedef/collate.c
> head/usr.bin/localedef/ctype.c
> head/usr.bin/localedef/localedef.c
> head/usr.bin/localedef/localedef.h
> head/usr.bin/localedef/time.c
>
> Modified: head/usr.bin/localedef/collate.c
> ==============================================================================
> --- head/usr.bin/localedef/collate.c Thu Mar 9 13:41:57 2017 (r314960)
> +++ head/usr.bin/localedef/collate.c Thu Mar 9 15:21:03 2017 (r314961)
> @@ -1,5 +1,5 @@
> /*
> - * Copyright 2010 Nexenta Systems, Inc. All rights reserved.
> + * Copyright 2017 Nexenta Systems, Inc.
> * Copyright 2015 John Marino <draco at marino.st>
> *
> * This source code is derived from the illumos localedef command, and
> @@ -1291,21 +1291,25 @@ dump_collate(void)
> if ((wr_category(vers, COLLATE_STR_LEN, f) < 0) ||
> (wr_category(&collinfo, sizeof (collinfo), f) < 0) ||
> (wr_category(&chars, sizeof (chars), f) < 0)) {
> + delete_category(f);
> return;
> }
>
> for (i = 0; i < NUM_WT; i++) {
> sz = sizeof (collate_subst_t) * collinfo.subst_count[i];
> if (wr_category(subst[i], sz, f) < 0) {
> + delete_category(f);
> return;
> }
> }
> sz = sizeof (collate_chain_t) * collinfo.chain_count;
> if (wr_category(chain, sz, f) < 0) {
> + delete_category(f);
> return;
> }
> sz = sizeof (collate_large_t) * collinfo.large_count;
> if (wr_category(large, sz, f) < 0) {
> + delete_category(f);
> return;
> }
>
>
> Modified: head/usr.bin/localedef/ctype.c
> ==============================================================================
> --- head/usr.bin/localedef/ctype.c Thu Mar 9 13:41:57 2017 (r314960)
> +++ head/usr.bin/localedef/ctype.c Thu Mar 9 15:21:03 2017 (r314961)
> @@ -1,5 +1,5 @@
> /*
> - * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
> + * Copyright 2017 Nexenta Systems, Inc.
> * Copyright 2012 Garrett D'Amore <garrett at damore.org> All rights reserved.
> * Copyright 2015 John Marino <draco at marino.st>
> *
> @@ -306,7 +306,7 @@ dump_ctype(void)
> return;
>
> (void) memcpy(rl.magic, _FILE_RUNE_MAGIC_1, 8);
> - (void) strncpy(rl.encoding, get_wide_encoding(), sizeof (rl.encoding));
> + (void) strlcpy(rl.encoding, get_wide_encoding(), sizeof (rl.encoding));
>
> /*
> * Initialize the identity map.
> @@ -379,12 +379,12 @@ dump_ctype(void)
> if ((ctn->ctype & _ISALPHA) &&
> (ctn->ctype & (_ISPUNCT|_ISDIGIT)))
> conflict++;
> - if ((ctn->ctype & _ISPUNCT) &
> + if ((ctn->ctype & _ISPUNCT) &&
> (ctn->ctype & (_ISDIGIT|_ISALPHA|_ISXDIGIT)))
> conflict++;
> if ((ctn->ctype & _ISSPACE) && (ctn->ctype & _ISGRAPH))
> conflict++;
> - if ((ctn->ctype & _ISCNTRL) & _ISPRINT)
> + if ((ctn->ctype & _ISCNTRL) && (ctn->ctype & _ISPRINT))
> conflict++;
> if ((wc == ' ') && (ctn->ctype & (_ISPUNCT|_ISGRAPH)))
> conflict++;
> @@ -412,8 +412,10 @@ dump_ctype(void)
> ct[rl.runetype_ext_nranges-1].max = wc;
> } else {
> rl.runetype_ext_nranges++;
> - ct = realloc(ct,
> - sizeof (*ct) * rl.runetype_ext_nranges);
> + ct = realloc(ct, rl.runetype_ext_nranges *
> + sizeof (*ct));
> + if (ct == NULL)
> + goto fail;
> ct[rl.runetype_ext_nranges - 1].min = wc;
> ct[rl.runetype_ext_nranges - 1].max = wc;
> ct[rl.runetype_ext_nranges - 1].map = ctn->ctype;
> @@ -427,8 +429,10 @@ dump_ctype(void)
> last_lo = ctn;
> } else {
> rl.maplower_ext_nranges++;
> - lo = realloc(lo,
> - sizeof (*lo) * rl.maplower_ext_nranges);
> + lo = realloc(lo, rl.maplower_ext_nranges *
> + sizeof (*lo));
> + if (lo == NULL)
> + goto fail;
> lo[rl.maplower_ext_nranges - 1].min = wc;
> lo[rl.maplower_ext_nranges - 1].max = wc;
> lo[rl.maplower_ext_nranges - 1].map = ctn->tolower;
> @@ -443,8 +447,10 @@ dump_ctype(void)
> last_up = ctn;
> } else {
> rl.mapupper_ext_nranges++;
> - up = realloc(up,
> - sizeof (*up) * rl.mapupper_ext_nranges);
> + up = realloc(up, rl.mapupper_ext_nranges *
> + sizeof (*up));
> + if (up == NULL)
> + goto fail;
> up[rl.mapupper_ext_nranges - 1].min = wc;
> up[rl.mapupper_ext_nranges - 1].max = wc;
> up[rl.mapupper_ext_nranges - 1].map = ctn->toupper;
> @@ -452,12 +458,17 @@ dump_ctype(void)
> }
> }
>
> - if ((wr_category(&rl, sizeof (rl), f) < 0) ||
> - (wr_category(ct, sizeof (*ct) * rl.runetype_ext_nranges, f) < 0) ||
> - (wr_category(lo, sizeof (*lo) * rl.maplower_ext_nranges, f) < 0) ||
> - (wr_category(up, sizeof (*up) * rl.mapupper_ext_nranges, f) < 0)) {
> - return;
> + if ((wr_category(&rl, sizeof (rl), f) == 0) &&
> + (wr_category(ct, sizeof (*ct) * rl.runetype_ext_nranges, f) == 0) &&
> + (wr_category(lo, sizeof (*lo) * rl.maplower_ext_nranges, f) == 0) &&
> + (wr_category(up, sizeof (*up) * rl.mapupper_ext_nranges, f) == 0)) {
> + close_category(f);
> + goto out;
> }
>
> - close_category(f);
> -}
> +fail:
> + delete_category(f);
> +out:
> + free(ct);
> + free(lo);
> + free(up);}
>
> Modified: head/usr.bin/localedef/localedef.c
> ==============================================================================
> --- head/usr.bin/localedef/localedef.c Thu Mar 9 13:41:57 2017 (r314960)
> +++ head/usr.bin/localedef/localedef.c Thu Mar 9 15:21:03 2017 (r314961)
> @@ -1,5 +1,5 @@
> /*
> - * Copyright 2010 Nexenta Systems, Inc. All rights reserved.
> + * Copyright 2017 Nexenta Systems, Inc.
> * Copyright 2015 John Marino <draco at marino.st>
> *
> * This source code is derived from the illumos localedef command, and
> @@ -126,12 +126,21 @@ open_category(void)
> }
>
> void
> +delete_category(FILE *f)
> +{
> + (void) fclose(f);
> + (void) unlink(category_file());
> +}
> +
> +void
> close_category(FILE *f)
> {
> - if (fchmod(fileno(f), 0644) < 0) {
> + if (fchmod(fileno(f), 0644) < 0 ||
> + fclose(f) != 0) {
> (void) fclose(f);
> (void) unlink(category_file());
> errf(strerror(errno));
> + delete_category(f);
> }
> if (fclose(f) < 0) {
> (void) unlink(category_file());
> @@ -193,15 +202,13 @@ int
> putl_category(const char *s, FILE *f)
> {
> if (s && fputs(s, f) == EOF) {
> - (void) fclose(f);
> - (void) unlink(category_file());
> errf(strerror(errno));
> + delete_category(f);
> return (EOF);
> }
> if (fputc('\n', f) == EOF) {
> - (void) fclose(f);
> - (void) unlink(category_file());
> errf(strerror(errno));
> + delete_category(f);
> return (EOF);
> }
> return (0);
> @@ -214,9 +221,8 @@ wr_category(void *buf, size_t sz, FILE *
> return (0);
> }
> if (fwrite(buf, sz, 1, f) < 1) {
> - (void) fclose(f);
> - (void) unlink(category_file());
> errf(strerror(errno));
> + delete_category(f);
> return (EOF);
> }
> return (0);
>
> Modified: head/usr.bin/localedef/localedef.h
> ==============================================================================
> --- head/usr.bin/localedef/localedef.h Thu Mar 9 13:41:57 2017 (r314960)
> +++ head/usr.bin/localedef/localedef.h Thu Mar 9 15:21:03 2017 (r314961)
> @@ -1,5 +1,5 @@
> /*
> - * Copyright 2010 Nexenta Systems, Inc. All rights reserved.
> + * Copyright 2017 Nexenta Systems, Inc.
> * Copyright 2015 John Marino <draco at marino.st>
> *
> * This source code is derived from the illumos localedef command, and
> @@ -60,6 +60,7 @@ void warn(const char *, ...);
> int putl_category(const char *, FILE *);
> int wr_category(void *, size_t, FILE *);
> FILE *open_category(void);
> +void delete_category(FILE *);
> void close_category(FILE *);
> void copy_category(char *);
> const char *category_name(void);
>
> Modified: head/usr.bin/localedef/time.c
> ==============================================================================
> --- head/usr.bin/localedef/time.c Thu Mar 9 13:41:57 2017 (r314960)
> +++ head/usr.bin/localedef/time.c Thu Mar 9 15:21:03 2017 (r314961)
> @@ -1,5 +1,5 @@
> /*
> - * Copyright 2010 Nexenta Systems, Inc. All rights reserved.
> + * Copyright 2017 Nexenta Systems, Inc.
> * Copyright 2015 John Marino <draco at marino.st>
> *
> * This source code is derived from the illumos localedef command, and
> @@ -78,7 +78,7 @@ add_time_str(wchar_t *wcs)
> break;
> case T_DATE_FMT:
> /*
> - * This one is a Solaris extension, Too bad date just
> + * This one is a Solaris extension. Too bad date just
> * doesn't use %c, which would be simpler.
> */
> tm.date_fmt = str;
> _______________________________________________
> svn-src-head at freebsd.org mailing list
> https://lists.freebsd.org/mailman/listinfo/svn-src-head
> To unsubscribe, send any mail to "svn-src-head-unsubscribe at freebsd.org"
Something broke buildworld, I presume:
/usr/src/share/colldef/af_ZA.UTF-8.src: 2421: error: Bad file descriptor
*** [af_ZA.ISO8859-1.LC_COLLATE] Error code 4
make[4]: stopped in /usr/src/share/colldef
.ERROR_TARGET='af_ZA.ISO8859-1.LC_COLLATE'
--
O. Hartmann
Ich widerspreche der Nutzung oder Übermittlung meiner Daten für
Werbezwecke oder für die Markt- oder Meinungsforschung (§ 28 Abs. 4 BDSG).
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 313 bytes
Desc: OpenPGP digital signature
URL: <http://lists.freebsd.org/pipermail/svn-src-all/attachments/20170309/0df67910/attachment.sig>
More information about the svn-src-all
mailing list