Print this page
locale stuff should use libc safe lmalloc. Other fixes from tests.
Split |
Close |
Expand all |
Collapse all |
--- old/usr/src/lib/libc/port/locale/ldpart.c
+++ new/usr/src/lib/libc/port/locale/ldpart.c
1 1 /*
2 2 * Copyright 2013 Garrett D'Amore <garrett@damore.org>
3 3 * Copyright 2010 Nexenta Systems, Inc. All rights reserved.
4 4 * Copyright (c) 2000, 2001 Alexey Zelkin <phantom@FreeBSD.org>
5 5 * All rights reserved.
6 6 *
7 7 * Redistribution and use in source and binary forms, with or without
8 8 * modification, are permitted provided that the following conditions
9 9 * are met:
10 10 * 1. Redistributions of source code must retain the above copyright
11 11 * notice, this list of conditions and the following disclaimer.
12 12 * 2. Redistributions in binary form must reproduce the above copyright
13 13 * notice, this list of conditions and the following disclaimer in the
14 14 * documentation and/or other materials provided with the distribution.
15 15 *
16 16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 26 * SUCH DAMAGE.
27 27 */
28 28
29 29 #include "lint.h"
30 30 #include "file64.h"
↓ open down ↓ |
30 lines elided |
↑ open up ↑ |
31 31 #include <sys/types.h>
32 32 #include <sys/stat.h>
33 33 #include <errno.h>
34 34 #include <fcntl.h>
35 35 #include <limits.h>
36 36 #include <stdlib.h>
37 37 #include <string.h>
38 38 #include <unistd.h>
39 39 #include <stdio.h>
40 40
41 +#include "libc.h"
41 42 #include "ldpart.h"
42 43 #include "setlocale.h"
43 44
44 45 static int split_lines(char *, const char *);
45 46
46 47 int
47 48 __part_load_locale(const char *name,
48 49 char **locale_buf, const char *category_filename,
49 50 int locale_buf_size_max, int locale_buf_size_min,
50 51 const char **dst_localebuf)
51 52 {
52 53 int saverr, fd, i, num_lines;
53 54 char *lbuf, *p;
54 55 const char *plim;
55 56 char filename[PATH_MAX];
56 57 struct stat st;
57 58 size_t namesize, bufsize;
58 59
59 60 /*
60 61 * Slurp the locale file into the cache.
61 62 */
62 63 namesize = strlen(name) + 1;
63 64
64 65 /* 'PathLocale' must be already set & checked. */
65 66
66 67 (void) snprintf(filename, sizeof (filename), "%s/%s/%s/LCL_DATA",
67 68 _PathLocale, name, category_filename);
↓ open down ↓ |
17 lines elided |
↑ open up ↑ |
68 69
69 70 if ((fd = open(filename, O_RDONLY)) < 0)
70 71 return (_LDP_ERROR);
71 72 if (fstat(fd, &st) != 0)
72 73 goto bad_locale;
73 74 if (st.st_size <= 0) {
74 75 errno = EINVAL;
75 76 goto bad_locale;
76 77 }
77 78 bufsize = namesize + st.st_size;
78 - if ((lbuf = malloc(bufsize)) == NULL) {
79 + if ((lbuf = libc_malloc(bufsize)) == NULL) {
79 80 errno = ENOMEM;
80 81 goto bad_locale;
81 82 }
82 83 (void) strcpy(lbuf, name);
83 84 p = lbuf + namesize;
84 85 plim = p + st.st_size;
85 86 if (read(fd, p, (size_t)st.st_size) != st.st_size)
86 87 goto bad_lbuf;
87 88 /*
88 89 * Parse the locale file into localebuf.
89 90 */
90 91 if (plim[-1] != '\n') {
91 92 errno = EINVAL;
92 93 goto bad_lbuf;
93 94 }
94 95 num_lines = split_lines(p, plim);
95 96 if (num_lines >= locale_buf_size_max)
96 97 num_lines = locale_buf_size_max;
97 98 else if (num_lines >= locale_buf_size_min)
98 99 num_lines = locale_buf_size_min;
99 100 else {
100 101 errno = EINVAL;
101 102 goto bad_lbuf;
102 103 }
103 104 (void) close(fd);
104 105 /*
105 106 * Record the successful parse in the cache.
106 107 */
107 108 *locale_buf = lbuf;
108 109 for (p = *locale_buf, i = 0; i < num_lines; i++)
109 110 dst_localebuf[i] = (p += strlen(p) + 1);
110 111 for (i = num_lines; i < locale_buf_size_max; i++)
111 112 dst_localebuf[i] = NULL;
112 113
113 114 return (_LDP_LOADED);
114 115
115 116 bad_lbuf:
116 117 saverr = errno;
117 118 free(lbuf);
118 119 errno = saverr;
119 120 bad_locale:
120 121 saverr = errno;
121 122 (void) close(fd);
122 123 errno = saverr;
123 124
124 125 return (_LDP_ERROR);
125 126 }
126 127
127 128 static int
128 129 split_lines(char *p, const char *plim)
129 130 {
130 131 int i;
131 132
132 133 i = 0;
133 134 while (p < plim) {
134 135 if (*p == '\n') {
135 136 *p = '\0';
136 137 i++;
137 138 }
138 139 p++;
139 140 }
140 141 return (i);
141 142 }
↓ open down ↓ |
53 lines elided |
↑ open up ↑ |
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX