Deleted Added
sdiff udiff text old ( 92986 ) new ( 101498 )
full compact
1/*-
2 * Copyright (c) 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * This code is derived from software contributed to Berkeley by
6 * Paul Borman at Krystal Technologies.
7 *
8 * Redistribution and use in source and binary forms, with or without

--- 24 unchanged lines hidden (view full) ---

33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 * SUCH DAMAGE.
35 */
36
37#if defined(LIBC_SCCS) && !defined(lint)
38static char sccsid[] = "@(#)rune.c 8.1 (Berkeley) 6/4/93";
39#endif /* LIBC_SCCS and not lint */
40#include <sys/cdefs.h>
41__FBSDID("$FreeBSD: head/lib/libc/locale/rune.c 101498 2002-08-08 05:51:54Z ache $");
42
43#include "namespace.h"
44#include <arpa/inet.h>
45#include <errno.h>
46#include <rune.h>
47#include <stdio.h>
48#include <string.h>
49#include <stdlib.h>
50#include <sys/types.h>
51#include <sys/stat.h>
52#include "un-namespace.h"
53
54_RuneLocale *
55_Read_RuneMagi(fp)
56 FILE *fp;
57{
58 char *data;
59 void *lastp;
60 _RuneLocale *rl;
61 _RuneEntry *rr;
62 struct stat sb;
63 int x, saverr;
64
65 if (_fstat(fileno(fp), &sb) < 0)
66 return (NULL);
67
68 if (sb.st_size < sizeof(_RuneLocale)) {
69 errno = EFTYPE;
70 return (NULL);
71 }
72
73 if ((data = malloc(sb.st_size)) == NULL) {
74 errno = ENOMEM;
75 return (NULL);
76 }
77
78 errno = 0;
79 rewind(fp); /* Someone might have read the magic number once already */
80 if (errno) {
81 saverr = errno;
82 free(data);
83 errno = saverr;
84 return (NULL);
85 }
86
87 if (fread(data, sb.st_size, 1, fp) != 1) {
88 saverr = errno;
89 free(data);
90 errno = saverr;
91 return (NULL);
92 }
93
94 rl = (_RuneLocale *)data;
95 lastp = data + sb.st_size;
96
97 rl->variable = rl + 1;
98
99 if (memcmp(rl->magic, _RUNE_MAGIC_1, sizeof(rl->magic))) {
100 free(data);
101 errno = EFTYPE;
102 return (NULL);
103 }
104
105 rl->invalid_rune = ntohl(rl->invalid_rune);
106 rl->variable_len = ntohl(rl->variable_len);
107 rl->runetype_ext.nranges = ntohl(rl->runetype_ext.nranges);
108 rl->maplower_ext.nranges = ntohl(rl->maplower_ext.nranges);
109 rl->mapupper_ext.nranges = ntohl(rl->mapupper_ext.nranges);
110
111 for (x = 0; x < _CACHED_RUNES; ++x) {
112 rl->runetype[x] = ntohl(rl->runetype[x]);
113 rl->maplower[x] = ntohl(rl->maplower[x]);
114 rl->mapupper[x] = ntohl(rl->mapupper[x]);
115 }
116
117 rl->runetype_ext.ranges = (_RuneEntry *)rl->variable;
118 rl->variable = rl->runetype_ext.ranges + rl->runetype_ext.nranges;
119 if (rl->variable > lastp) {
120 free(data);
121 errno = EFTYPE;
122 return (NULL);
123 }
124
125 rl->maplower_ext.ranges = (_RuneEntry *)rl->variable;
126 rl->variable = rl->maplower_ext.ranges + rl->maplower_ext.nranges;
127 if (rl->variable > lastp) {
128 free(data);
129 errno = EFTYPE;
130 return (NULL);
131 }
132
133 rl->mapupper_ext.ranges = (_RuneEntry *)rl->variable;
134 rl->variable = rl->mapupper_ext.ranges + rl->mapupper_ext.nranges;
135 if (rl->variable > lastp) {
136 free(data);
137 errno = EFTYPE;
138 return (NULL);
139 }
140
141 for (x = 0; x < rl->runetype_ext.nranges; ++x) {
142 rr = rl->runetype_ext.ranges;
143
144 rr[x].min = ntohl(rr[x].min);
145 rr[x].max = ntohl(rr[x].max);
146 if ((rr[x].map = ntohl(rr[x].map)) == 0) {
147 int len = rr[x].max - rr[x].min + 1;
148 rr[x].types = rl->variable;
149 rl->variable = rr[x].types + len;
150 if (rl->variable > lastp) {
151 free(data);
152 errno = EFTYPE;
153 return (NULL);
154 }
155 while (len-- > 0)
156 rr[x].types[len] = ntohl(rr[x].types[len]);
157 } else
158 rr[x].types = 0;
159 }
160
161 for (x = 0; x < rl->maplower_ext.nranges; ++x) {

--- 8 unchanged lines hidden (view full) ---

170 rr = rl->mapupper_ext.ranges;
171
172 rr[x].min = ntohl(rr[x].min);
173 rr[x].max = ntohl(rr[x].max);
174 rr[x].map = ntohl(rr[x].map);
175 }
176 if (((char *)rl->variable) + rl->variable_len > (char *)lastp) {
177 free(data);
178 errno = EFTYPE;
179 return (NULL);
180 }
181
182 /*
183 * Go out and zero pointers that should be zero.
184 */
185 if (!rl->variable_len)
186 rl->variable = 0;
187
188 if (!rl->runetype_ext.nranges)
189 rl->runetype_ext.ranges = 0;
190
191 if (!rl->maplower_ext.nranges)
192 rl->maplower_ext.ranges = 0;
193
194 if (!rl->mapupper_ext.nranges)
195 rl->mapupper_ext.ranges = 0;
196
197 return (rl);
198}