[augeas/f14/master] Release 0.7.3-2
Matthew Booth
mdbooth at fedoraproject.org
Thu Nov 18 12:03:23 UTC 2010
commit e48764dc685a33693ab159dd089d74c0a2ea58cc
Author: Matthew Booth <mbooth at redhat.com>
Date: Thu Nov 18 12:02:07 2010 +0000
Release 0.7.3-2
Pull in patch to fix i686 crasher when build on gcc 4.5
augeas-0.7.3-01-c17cd53d.patch | 57 ++++++++++++++++++++++++++++++++++++++++
augeas.spec | 12 +++++++-
2 files changed, 68 insertions(+), 1 deletions(-)
---
diff --git a/augeas-0.7.3-01-c17cd53d.patch b/augeas-0.7.3-01-c17cd53d.patch
new file mode 100644
index 0000000..615cb98
--- /dev/null
+++ b/augeas-0.7.3-01-c17cd53d.patch
@@ -0,0 +1,57 @@
+commit c17cd53d8d4a643e4f7277da37d21dc3bade5ed6
+Author: Matthew Booth <mbooth at redhat.com>
+Date: Fri Nov 12 11:24:30 2010 +0000
+
+ Fix crasher in ast.c:dict_pos on i686 with gcc 4.5 and -O2
+
+ This patch works around what appears to be an optimization bug in gcc 4.5. The
+ symptom of the bug is that dict_pos, called from dict_lookup, receives an
+ invalid value when accessing dict->used. The following ticket describes the bug,
+ and includes a simple test case:
+
+ https://fedorahosted.org/augeas/ticket/149
+
+ Adding a printf to dict_lookup immediately before the dict_pos call reveals that
+ dict->used has a value of 30 in the crashing case on my F14 system. A printf
+ added to the first line of dict_pos shows dict->used has an apparent value of
+ 16777246. This causes an invalid array lookup shortly afterwards, which causes
+ the crash. 16777246, interestingly, is 2^24 + 30, where 24 is the size of the
+ dict->used bitfield. This should obviously not be possible, suggesting either a
+ compiler bug or undefined behaviour due in incorrect use of the language. Having
+ re-read the relevant section of K&R, I can't see anything about this use of
+ bitfields which might be a problem, except that: 'Fields may be declared only as
+ ints; for portability, specify signed or unsigned explicitly.' uint32_t resolves
+ to 'unsigned int' on i686, and in any case, replacing it with 'unsigned int'
+ does not solve the problem. As it stands, I believe this is a bug in the
+ optimizer.
+
+ The above ticket contains an alternate patch which copies dict in dict_pos,
+ which also prevents the crash. However, adding anything to dict_pos which
+ prevents the compiler from optimising dict away achieves the same result. For
+ example:
+
+ printf("%p", dict);
+
+ This patch instead removes the bitfields in struct dict. While this is a
+ workaround, these bitfields save at most 1 word of memory per struct, but at the
+ cost of mis-aligned access. The patch does not increase the size of
+ dict_max_size to UINT32_MAX, as the lower maximum serves as a better guard
+ against runaway memory allocation.
+
+diff --git a/src/ast.c b/src/ast.c
+index 4a3402d..6efcc3e 100644
+--- a/src/ast.c
++++ b/src/ast.c
+@@ -54,9 +54,9 @@ struct dict_node {
+ string */
+ struct dict {
+ struct dict_node **nodes;
+- uint32_t size : 24;
+- uint32_t used : 24;
+- uint32_t marked : 1;
++ uint32_t size;
++ uint32_t used;
++ bool marked;
+ };
+
+ static const int dict_initial_size = 2;
diff --git a/augeas.spec b/augeas.spec
index 75c6df7..3793b48 100644
--- a/augeas.spec
+++ b/augeas.spec
@@ -1,12 +1,18 @@
Name: augeas
Version: 0.7.3
-Release: 1%{?dist}
+Release: 2%{?dist}
Summary: A library for changing configuration files
Group: System Environment/Libraries
License: LGPLv2+
URL: http://augeas.net/
Source0: http://augeas.net/download/%{name}-%{version}.tar.gz
+# Format of the patch name is augeas-VERSION-NUMBER-HASH where VERSION
+# gives the first version where this patch was applied, NUMBER orders patches
+# against the same version, and HASH is the git commit hash from upstream
+# Fix crasher in ast.c:dict_pos on i686 with gcc 4.5 and -O2
+Patch0: augeas-0.7.3-01-c17cd53d.patch
+
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
BuildRequires: readline-devel libselinux-devel
@@ -43,6 +49,7 @@ The libraries for %{name}.
%prep
%setup -q
+%patch0 -p1
%build
%configure --disable-static
@@ -85,6 +92,9 @@ rm -rf $RPM_BUILD_ROOT
%{_libdir}/pkgconfig/augeas.pc
%changelog
+* Thu Nov 18 2010 Matthew Booth <mbooth at redhat.com> - 0.7.3-2
+- Fix crasher on i686 when compiled with gcc 4.5 (RHBZ#651992)
+
* Fri Aug 6 2010 David Lutterkort <lutter at redhat.com> - 0.7.3-1
- Remove upstream patches
More information about the scm-commits
mailing list