Contents of /trunk/libarchive/patches/libarchive-3.0.4-gcc47.patch
Parent Directory | Revision Log
Revision 1821 -
(show annotations)
(download)
Wed Jun 27 11:23:12 2012 UTC (12 years, 3 months ago) by niro
File size: 2446 byte(s)
Wed Jun 27 11:23:12 2012 UTC (12 years, 3 months ago) by niro
File size: 2446 byte(s)
-fixed issues with >= gcc-4.7
1 | From 12b0d0d581409733da1931110df8cf540aba34c6 Mon Sep 17 00:00:00 2001 |
2 | From: Dan McGee <dan@archlinux.org> |
3 | Date: Tue, 27 Mar 2012 17:22:40 -0500 |
4 | Subject: [PATCH] Fixes for GCC 4.7.0 |
5 | |
6 | Fixes the following compile error exposed with GCC 4.7.0: |
7 | |
8 | libarchive/archive_string.c: In function 'cesu8_to_unicode': |
9 | libarchive/archive_string.c:2450:11: error: 'wc' may be used uninitialized in this function [-Werror=uninitialized] |
10 | cc1: all warnings being treated as errors |
11 | |
12 | As well as a test failure that depends on signed integer wraparound, |
13 | which is a very bad thing to do in C [1]. Add a bit more magic to ensure |
14 | the assert is not optimized to always being false. This is still |
15 | extremely brittle, and a better way should probably be figured out, but |
16 | this ensures it works as before in all compilers. |
17 | |
18 | [1] http://www.gnu.org/software/autoconf/manual/autoconf-2.67/html_node/Signed-Overflow-Examples.html |
19 | --- |
20 | libarchive/archive_string.c | 3 ++- |
21 | libarchive/test/test_read_format_mtree.c | 6 ++++-- |
22 | 2 files changed, 6 insertions(+), 3 deletions(-) |
23 | |
24 | diff --git a/libarchive/archive_string.c b/libarchive/archive_string.c |
25 | index 2728a37..2b56a48 100644 |
26 | --- a/libarchive/archive_string.c |
27 | +++ b/libarchive/archive_string.c |
28 | @@ -2447,11 +2447,12 @@ combine_surrogate_pair(uint32_t uc, uint32_t uc2) |
29 | static int |
30 | cesu8_to_unicode(uint32_t *pwc, const char *s, size_t n) |
31 | { |
32 | - uint32_t wc, wc2; |
33 | + uint32_t wc = 0; |
34 | int cnt; |
35 | |
36 | cnt = _utf8_to_unicode(&wc, s, n); |
37 | if (cnt == 3 && IS_HIGH_SURROGATE_LA(wc)) { |
38 | + uint32_t wc2 = 0; |
39 | if (n - 3 < 3) { |
40 | /* Invalid byte sequence. */ |
41 | goto invalid_sequence; |
42 | diff --git a/libarchive/test/test_read_format_mtree.c b/libarchive/test/test_read_format_mtree.c |
43 | index 0d86bd4..d8df2ea 100644 |
44 | --- a/libarchive/test/test_read_format_mtree.c |
45 | +++ b/libarchive/test/test_read_format_mtree.c |
46 | @@ -137,8 +137,10 @@ test_read_format_mtree1(void) |
47 | /* Verify min_time is the smallest possible time_t. */ |
48 | min_time = archive_entry_mtime(ae); |
49 | assert(min_time <= 0); |
50 | - /* Simply asserting min_time - 1 > 0 breaks with some compiler optimizations. */ |
51 | - t = min_time - 1; |
52 | + /* Simply asserting min_time - 1 > 0 breaks with some compiler |
53 | + * optimizations. This attempts to do enough to prevent GCC optimizing the |
54 | + * math completely away and failing the assertion. */ |
55 | + t = (min_time - 1) >> 16; |
56 | assert(t > 0); |
57 | |
58 | /* toooldfile is 1 sec older, which should overflow and get returned |
59 | -- |
60 | 1.7.9.5 |
61 |