Update to version 0.7.4

This commit is contained in:
Matthew Booth 2010-11-22 09:34:28 +00:00
parent 2621968999
commit 27e45fb286
4 changed files with 12 additions and 71 deletions

1
.gitignore vendored
View File

@ -1 +1,2 @@
augeas-0.7.3.tar.gz augeas-0.7.3.tar.gz
/augeas-0.7.4.tar.gz

View File

@ -1,62 +0,0 @@
From c17cd53d8d4a643e4f7277da37d21dc3bade5ed6 Mon Sep 17 00:00:00 2001
From: Matthew Booth <mbooth@redhat.com>
Date: Fri, 12 Nov 2010 11:24:30 +0000
Subject: [PATCH] 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.
---
src/ast.c | 6 +++---
1 files changed, 3 insertions(+), 3 deletions(-)
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;
--
1.5.5.6

View File

@ -1,21 +1,22 @@
Name: augeas Name: augeas
Version: 0.7.3 Version: 0.7.4
Release: 2%{?dist} Release: 1%{?dist}
Summary: A library for changing configuration files Summary: A library for changing configuration files
Group: System Environment/Libraries Group: System Environment/Libraries
License: LGPLv2+ License: LGPLv2+
URL: http://augeas.net/ URL: http://augeas.net/
Source0: http://augeas.net/download/%{name}-%{version}.tar.gz 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
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
BuildRequires: readline-devel libselinux-devel BuildRequires: readline-devel libselinux-devel
Requires: %{name}-libs = %{version}-%{release} Requires: %{name}-libs = %{version}-%{release}
# Upstream patch proposed to fix GCC optimization bug:
# https://bugzilla.redhat.com/show_bug.cgi?id=651992
Patch0: augeas.git-c17cd53d8d4a643e4f7277da37d21dc3bade5ed6.patch
%description %description
A library for programmatically editing configuration files. Augeas parses A library for programmatically editing configuration files. Augeas parses
configuration files into a tree structure, which it exposes through its configuration files into a tree structure, which it exposes through its
@ -48,8 +49,6 @@ The libraries for %{name}.
%prep %prep
%setup -q %setup -q
%patch0 -p1
%build %build
%configure --disable-static %configure --disable-static
make %{?_smp_mflags} make %{?_smp_mflags}
@ -91,6 +90,9 @@ rm -rf $RPM_BUILD_ROOT
%{_libdir}/pkgconfig/augeas.pc %{_libdir}/pkgconfig/augeas.pc
%changelog %changelog
* Mon Nov 22 2010 Matthew Booth <mbooth@redhat.com> - 0.7.4-1
- Update to version 0.7.4
* Thu Nov 18 2010 Richard W.M. Jones <rjones@redhat.com> - 0.7.3-2 * Thu Nov 18 2010 Richard W.M. Jones <rjones@redhat.com> - 0.7.3-2
- Upstream patch proposed to fix GCC optimization bug (RHBZ#651992). - Upstream patch proposed to fix GCC optimization bug (RHBZ#651992).

View File

@ -1 +1 @@
d907943fc21c2d1db5dc8d97ec02a9e5 augeas-0.7.3.tar.gz e3ddce5305a15bdb876ef7feec9214d1 augeas-0.7.4.tar.gz