##// END OF EJS Templates
parsers: avoid pointer aliasing...
Matt Mackall -
r15033:2ef2d3a5 stable
parent child Browse files
Show More
@@ -238,7 +238,7 b' static struct flist *decode(const char *'
238 238 struct flist *l;
239 239 struct frag *lt;
240 240 const char *data = bin + 12, *end = bin + len;
241 char decode[12]; /* for dealing with alignment issues */
241 uint32_t decode[3]; /* for dealing with alignment issues */
242 242
243 243 /* assume worst case size, we won't have many of these lists */
244 244 l = lalloc(len / 12);
@@ -249,9 +249,9 b' static struct flist *decode(const char *'
249 249
250 250 while (data <= end) {
251 251 memcpy(decode, bin, 12);
252 lt->start = ntohl(*(uint32_t *)decode);
253 lt->end = ntohl(*(uint32_t *)(decode + 4));
254 lt->len = ntohl(*(uint32_t *)(decode + 8));
252 lt->start = ntohl(decode[0]);
253 lt->end = ntohl(decode[1]);
254 lt->len = ntohl(decode[2]);
255 255 if (lt->start > lt->end)
256 256 break; /* sanity check */
257 257 bin = data + lt->len;
@@ -397,7 +397,7 b' patchedsize(PyObject *self, PyObject *ar'
397 397 long orig, start, end, len, outlen = 0, last = 0;
398 398 int patchlen;
399 399 char *bin, *binend, *data;
400 char decode[12]; /* for dealing with alignment issues */
400 uint32_t decode[3]; /* for dealing with alignment issues */
401 401
402 402 if (!PyArg_ParseTuple(args, "ls#", &orig, &bin, &patchlen))
403 403 return NULL;
@@ -407,9 +407,9 b' patchedsize(PyObject *self, PyObject *ar'
407 407
408 408 while (data <= binend) {
409 409 memcpy(decode, bin, 12);
410 start = ntohl(*(uint32_t *)decode);
411 end = ntohl(*(uint32_t *)(decode + 4));
412 len = ntohl(*(uint32_t *)(decode + 8));
410 start = ntohl(decode[0]);
411 end = ntohl(decode[1]);
412 len = ntohl(decode[2]);
413 413 if (start > end)
414 414 break; /* sanity check */
415 415 bin = data + len;
@@ -170,7 +170,7 b' static PyObject *parse_dirstate(PyObject'
170 170 int state, mode, size, mtime;
171 171 unsigned int flen;
172 172 int len;
173 char decode[16]; /* for alignment */
173 uint32_t decode[4]; /* for alignment */
174 174
175 175 if (!PyArg_ParseTuple(args, "O!O!s#:parse_dirstate",
176 176 &PyDict_Type, &dmap,
@@ -194,10 +194,10 b' static PyObject *parse_dirstate(PyObject'
194 194 /* unpack header */
195 195 state = *cur;
196 196 memcpy(decode, cur + 1, 16);
197 mode = ntohl(*(uint32_t *)(decode));
198 size = ntohl(*(uint32_t *)(decode + 4));
199 mtime = ntohl(*(uint32_t *)(decode + 8));
200 flen = ntohl(*(uint32_t *)(decode + 12));
197 mode = ntohl(decode[0]);
198 size = ntohl(decode[1]);
199 mtime = ntohl(decode[2]);
200 flen = ntohl(decode[3]);
201 201 cur += 17;
202 202 if (cur + flen > end || cur + flen < cur) {
203 203 PyErr_SetString(PyExc_ValueError, "overflow in dirstate");
@@ -264,27 +264,27 b' static int _parse_index_ng(const char *d'
264 264 int comp_len, uncomp_len, base_rev, link_rev, parent_1, parent_2;
265 265 const char *c_node_id;
266 266 const char *end = data + size;
267 char decode[64]; /* to enforce alignment with inline data */
267 uint32_t decode[8]; /* to enforce alignment with inline data */
268 268
269 269 while (data < end) {
270 270 unsigned int step;
271 271
272 memcpy(decode, data, 64);
273 offset_flags = ntohl(*((uint32_t *) (decode + 4)));
272 memcpy(decode, data, 32);
273 offset_flags = ntohl(decode[1]);
274 274 if (n == 0) /* mask out version number for the first entry */
275 275 offset_flags &= 0xFFFF;
276 276 else {
277 uint32_t offset_high = ntohl(*((uint32_t *)decode));
277 uint32_t offset_high = ntohl(decode[0]);
278 278 offset_flags |= ((uint64_t)offset_high) << 32;
279 279 }
280 280
281 comp_len = ntohl(*((uint32_t *)(decode + 8)));
282 uncomp_len = ntohl(*((uint32_t *)(decode + 12)));
283 base_rev = ntohl(*((uint32_t *)(decode + 16)));
284 link_rev = ntohl(*((uint32_t *)(decode + 20)));
285 parent_1 = ntohl(*((uint32_t *)(decode + 24)));
286 parent_2 = ntohl(*((uint32_t *)(decode + 28)));
287 c_node_id = decode + 32;
281 comp_len = ntohl(decode[2]);
282 uncomp_len = ntohl(decode[3]);
283 base_rev = ntohl(decode[4]);
284 link_rev = ntohl(decode[5]);
285 parent_1 = ntohl(decode[6]);
286 parent_2 = ntohl(decode[7]);
287 c_node_id = data + 32;
288 288
289 289 entry = Py_BuildValue("Liiiiiis#", offset_flags, comp_len,
290 290 uncomp_len, base_rev, link_rev,
General Comments 0
You need to be logged in to leave comments. Login now