]> git.pld-linux.org Git - packages/acpica.git/blob - 0045-CSRT-fixed-use-of-optional-ResourceInfo.patch
201e19b151a373346f2dc856793fcd3481ad92c5
[packages/acpica.git] / 0045-CSRT-fixed-use-of-optional-ResourceInfo.patch
1 From 0d87ee42adda7837bec3cc0ff86e40c2f2e8dc4f Mon Sep 17 00:00:00 2001
2 From: Al Stone <ahs3@redhat.com>
3 Date: Fri, 9 Jul 2021 14:52:55 -0600
4 Subject: [PATCH 45/45] CSRT: fixed use of optional ResourceInfo
5
6 In a resource sub-sub-table, there may be a ResourceInfo entry.  Neither
7 the compiler nor disassembler accounted for that possibility properly.
8
9 Signed-off-by: Al Stone <ahs3@redhat.com>
10 ---
11  source/common/dmtbdump1.c  | 43 +++++++++++++++++++++-----------------
12  source/compiler/dttable1.c | 28 +++++++++++++------------
13  2 files changed, 39 insertions(+), 32 deletions(-)
14
15 Index: acpica-unix2-20220331/source/common/dmtbdump1.c
16 ===================================================================
17 --- acpica-unix2-20220331.orig/source/common/dmtbdump1.c
18 +++ acpica-unix2-20220331/source/common/dmtbdump1.c
19 @@ -669,11 +669,13 @@ AcpiDmDumpCsrt (
20      ACPI_CSRT_GROUP         *Subtable;
21      ACPI_CSRT_SHARED_INFO   *SharedInfoTable;
22      ACPI_CSRT_DESCRIPTOR    *SubSubtable;
23 -    UINT32                  Length = AcpiUtReadUint32 (&Table->Length);
24 +    UINT32                  TableLength = AcpiUtReadUint32 (&Table->Length);
25      UINT32                  Offset = sizeof (ACPI_TABLE_CSRT);
26      UINT32                  SubOffset;
27      UINT32                  SubSubOffset;
28      UINT32                  InfoLength;
29 +    UINT32                  SubtableLength;
30 +    UINT32                  SubSubtableLength;
31  
32  
33      /* The main table only contains the ACPI header, thus already handled */
34 @@ -681,13 +683,14 @@ AcpiDmDumpCsrt (
35      /* Subtables (Resource Groups) */
36  
37      Subtable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Table, Offset);
38 -    while (Offset < Length)
39 +    while (Offset < TableLength)
40      {
41          /* Resource group subtable */
42  
43 +        SubtableLength = AcpiUtReadUint32 (&Subtable->Length);
44          AcpiOsPrintf ("\n");
45 -        Status = AcpiDmDumpTable (Length, Offset, Subtable,
46 -            Subtable->Length, AcpiDmTableInfoCsrt0);
47 +        Status = AcpiDmDumpTable (TableLength, Offset, Subtable,
48 +            SubtableLength, AcpiDmTableInfoCsrt0);
49          if (ACPI_FAILURE (Status))
50          {
51              return;
52 @@ -700,26 +703,28 @@ AcpiDmDumpCsrt (
53              Offset + SubOffset);
54  
55          AcpiOsPrintf ("\n");
56 -        Status = AcpiDmDumpTable (Length, Offset + SubOffset, SharedInfoTable,
57 -            sizeof (ACPI_CSRT_SHARED_INFO), AcpiDmTableInfoCsrt1);
58 +        Status = AcpiDmDumpTable (TableLength, Offset + SubOffset,
59 +           SharedInfoTable, sizeof (ACPI_CSRT_SHARED_INFO),
60 +           AcpiDmTableInfoCsrt1);
61          if (ACPI_FAILURE (Status))
62          {
63              return;
64          }
65  
66 -        SubOffset += Subtable->SharedInfoLength;
67 +        SubOffset += AcpiUtReadUint32 (&Subtable->SharedInfoLength);
68  
69          /* Sub-Subtables (Resource Descriptors) */
70  
71          SubSubtable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, Table,
72              Offset + SubOffset);
73  
74 -        while ((SubOffset < Subtable->Length) &&
75 -              ((Offset + SubOffset) < Length))
76 +        while ((SubOffset < SubtableLength) &&
77 +              ((Offset + SubOffset) < TableLength))
78          {
79 +           SubSubtableLength = AcpiUtReadUint32 (&SubSubtable->Length);
80              AcpiOsPrintf ("\n");
81 -            Status = AcpiDmDumpTable (Length, Offset + SubOffset, SubSubtable,
82 -                SubSubtable->Length, AcpiDmTableInfoCsrt2);
83 +            Status = AcpiDmDumpTable (TableLength, Offset + SubOffset,
84 +               SubSubtable, SubSubtableLength, AcpiDmTableInfoCsrt2);
85              if (ACPI_FAILURE (Status))
86              {
87                  return;
88 @@ -729,11 +734,12 @@ AcpiDmDumpCsrt (
89  
90              /* Resource-specific info buffer */
91  
92 -            InfoLength = SubSubtable->Length - SubSubOffset;
93 +            InfoLength = SubSubtableLength - SubSubOffset;
94              if (InfoLength)
95              {
96 -                Status = AcpiDmDumpTable (Length,
97 -                    Offset + SubOffset + SubSubOffset, Table,
98 +                Status = AcpiDmDumpTable (TableLength,
99 +                   Offset + SubOffset + SubSubOffset,
100 +                   (UINT8 *)SubSubtable + SubSubOffset,
101                      InfoLength, AcpiDmTableInfoCsrt2a);
102                  if (ACPI_FAILURE (Status))
103                  {
104 @@ -743,16 +749,15 @@ AcpiDmDumpCsrt (
105  
106              /* Point to next sub-subtable */
107  
108 -            SubOffset += SubSubtable->Length;
109 +            SubOffset += SubSubtableLength;
110              SubSubtable = ACPI_ADD_PTR (ACPI_CSRT_DESCRIPTOR, SubSubtable,
111 -                SubSubtable->Length);
112 +                SubSubtableLength);
113          }
114  
115          /* Point to next subtable */
116  
117 -        Offset += Subtable->Length;
118 -        Subtable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Subtable,
119 -            Subtable->Length);
120 +        Offset += SubtableLength;
121 +        Subtable = ACPI_ADD_PTR (ACPI_CSRT_GROUP, Subtable, SubtableLength);
122      }
123  }
124  
125 Index: acpica-unix2-20220331/source/compiler/dttable1.c
126 ===================================================================
127 --- acpica-unix2-20220331.orig/source/compiler/dttable1.c
128 +++ acpica-unix2-20220331/source/compiler/dttable1.c
129 @@ -716,14 +716,16 @@ DtCompileCsrt (
130      DT_SUBTABLE             *Subtable;
131      DT_SUBTABLE             *ParentTable;
132      DT_FIELD                **PFieldList = (DT_FIELD **) List;
133 -    UINT32                  DescriptorCount;
134 +    UINT32                  DescriptorLength;
135      UINT32                  GroupLength;
136      UINT32                  Tmp;
137 +    UINT32                  Offset;
138  
139  
140      /* Subtables (Resource Groups) */
141  
142      ParentTable = DtPeekSubtable ();
143 +                               
144      while (*PFieldList)
145      {
146          /* Resource group subtable */
147 @@ -738,16 +740,13 @@ DtCompileCsrt (
148          /* Compute the number of resource descriptors */
149  
150          Tmp = AcpiUtReadUint32 (&(ACPI_CAST_PTR (ACPI_CSRT_GROUP,
151 -                                Subtable->Buffer))->Length);
152 +                  Subtable->Buffer))->Length);
153          GroupLength = Tmp;
154          Tmp = AcpiUtReadUint32 (&(ACPI_CAST_PTR (ACPI_CSRT_GROUP,
155 -                                Subtable->Buffer))->SharedInfoLength);
156 +                  Subtable->Buffer))->SharedInfoLength);
157          GroupLength -= Tmp;
158          GroupLength -= sizeof (ACPI_CSRT_GROUP);
159  
160 -        DescriptorCount = (GroupLength  /
161 -            sizeof (ACPI_CSRT_DESCRIPTOR));
162 -
163          DtInsertSubtable (ParentTable, Subtable);
164          DtPushSubtable (Subtable);
165          ParentTable = DtPeekSubtable ();
166 @@ -762,10 +761,13 @@ DtCompileCsrt (
167          }
168  
169          DtInsertSubtable (ParentTable, Subtable);
170 +        DtPushSubtable (Subtable);
171 +        ParentTable = DtPeekSubtable ();
172  
173          /* Sub-Subtables (Resource Descriptors) */
174  
175 -        while (*PFieldList && DescriptorCount)
176 +        Offset = 0;
177 +        while (*PFieldList && (Offset < GroupLength))
178          {
179  
180              Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt2,
181 @@ -774,6 +776,10 @@ DtCompileCsrt (
182              {
183                  return (Status);
184              }
185 +           DescriptorLength = AcpiUtReadUint32 (
186 +                                  &(ACPI_CAST_PTR (ACPI_CSRT_GROUP,
187 +                                   Subtable->Buffer))->Length);
188 +
189  
190              DtInsertSubtable (ParentTable, Subtable);
191  
192 @@ -783,11 +789,7 @@ DtCompileCsrt (
193              {
194                  Status = DtCompileTable (PFieldList, AcpiDmTableInfoCsrt2a,
195                      &Subtable);
196 -                if (ACPI_FAILURE (Status))
197 -                {
198 -                    return (Status);
199 -                }
200 -                if (Subtable)
201 +                if (ACPI_SUCCESS (Status) && Subtable)
202                  {
203                      DtInsertSubtable (ParentTable, Subtable);
204                  }
205 @@ -795,7 +797,7 @@ DtCompileCsrt (
206  
207              DtPopSubtable ();
208              ParentTable = DtPeekSubtable ();
209 -            DescriptorCount--;
210 +            Offset += DescriptorLength;
211          }
212  
213          DtPopSubtable ();
This page took 0.090253 seconds and 3 git commands to generate.