From: charlet Date: Wed, 16 Jul 2014 13:52:30 +0000 (+0000) Subject: 2014-07-16 Ed Schonberg X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2f272fcccff111b2d76d3fa5b99b14f92f8747fb;p=thirdparty%2Fgcc.git 2014-07-16 Ed Schonberg * a-coinho-shared.adb, a-coinho-shared.ads: Proper structures for tampering checks. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@212642 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index eebff9e128b0..e18dff08d6be 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,8 @@ +2014-07-16 Ed Schonberg + + * a-coinho-shared.adb, a-coinho-shared.ads: Proper structures for + tampering checks. + 2014-07-16 Ed Schonberg * a-coinho-shared.adb: Fix spurious accessibility check. diff --git a/gcc/ada/a-coinho-shared.adb b/gcc/ada/a-coinho-shared.adb index 4bcfb71518d7..c9f117ebcfea 100644 --- a/gcc/ada/a-coinho-shared.adb +++ b/gcc/ada/a-coinho-shared.adb @@ -65,7 +65,12 @@ package body Ada.Containers.Indefinite_Holders is overriding procedure Adjust (Control : in out Reference_Control_Type) is begin if Control.Container /= null then - Reference (Control.Container); + Reference (Control.Container.Reference); + declare + B : Natural renames Control.Container.Busy; + begin + B := B + 1; + end; end if; end Adjust; @@ -115,9 +120,12 @@ package body Ada.Containers.Indefinite_Holders is is Ref : constant Constant_Reference_Type := (Element => Container.Reference.Element.all'Access, - Control => (Controlled with Container.Reference)); + Control => (Controlled with Container'Unrestricted_Access)); + B : Natural renames Ref.Control.Container.Busy; + begin - Reference (Ref.Control.Container); + Reference (Ref.Control.Container.Reference); + B := B + 1; return Ref; end Constant_Reference; @@ -168,7 +176,8 @@ package body Ada.Containers.Indefinite_Holders is overriding procedure Finalize (Control : in out Reference_Control_Type) is begin if Control.Container /= null then - Unreference (Control.Container); + Unreference (Control.Container.Reference); + Control.Container.Busy := Control.Container.Busy - 1; end if; Control.Container := null; @@ -284,9 +293,10 @@ package body Ada.Containers.Indefinite_Holders is is Ref : constant Reference_Type := (Element => Container.Reference.Element.all'Access, - Control => (Controlled with Container.Reference)); + Control => (Controlled with Container'Unrestricted_Access)); begin - Reference (Ref.Control.Container); + Reference (Ref.Control.Container.Reference); + Container.Busy := Container.Busy + 1; return Ref; end Reference; diff --git a/gcc/ada/a-coinho-shared.ads b/gcc/ada/a-coinho-shared.ads index e97a64af6554..8294d8e6a270 100644 --- a/gcc/ada/a-coinho-shared.ads +++ b/gcc/ada/a-coinho-shared.ads @@ -97,6 +97,7 @@ private use Ada.Streams; type Element_Access is access all Element_Type; + type Holder_Access is access all Holder; type Shared_Holder is record Counter : System.Atomic_Counters.Atomic_Counter; @@ -131,7 +132,7 @@ private type Reference_Control_Type is new Controlled with record - Container : Shared_Holder_Access; + Container : Holder_Access; end record; overriding procedure Adjust (Control : in out Reference_Control_Type);