1 |
commit: 76c0287bfb98ed25b63c9ad892fa6a1ee1c87dc0 |
2 |
Author: Sam James <sam <AT> gentoo <DOT> org> |
3 |
AuthorDate: Fri Oct 29 15:26:36 2021 +0000 |
4 |
Commit: Sam James <sam <AT> gentoo <DOT> org> |
5 |
CommitDate: Fri Oct 29 15:28:24 2021 +0000 |
6 |
URL: https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=76c0287b |
7 |
|
8 |
dev-libs/libxslt: fix tests with newer libxml2; patch CVE-2021-30560 |
9 |
|
10 |
Note that we're now depending on >= .11 of libxml2 just to be safe, |
11 |
even though some of the patches seem to have compatibility guards, |
12 |
not all do - and upstream develop these in tandem anyway. |
13 |
|
14 |
Closes: https://bugs.gentoo.org/790218 |
15 |
Bug: https://bugs.gentoo.org/820722 |
16 |
Signed-off-by: Sam James <sam <AT> gentoo.org> |
17 |
|
18 |
.../files/libxslt-1.1.34-CVE-2021-30560.patch | 194 +++++++++++++++++++++ |
19 |
.../files/libxslt-1.1.34-libxml2-2.9.12.patch | 120 +++++++++++++ |
20 |
dev-libs/libxslt/libxslt-1.1.34-r2.ebuild | 72 ++++++++ |
21 |
3 files changed, 386 insertions(+) |
22 |
|
23 |
diff --git a/dev-libs/libxslt/files/libxslt-1.1.34-CVE-2021-30560.patch b/dev-libs/libxslt/files/libxslt-1.1.34-CVE-2021-30560.patch |
24 |
new file mode 100644 |
25 |
index 00000000000..dcda176c513 |
26 |
--- /dev/null |
27 |
+++ b/dev-libs/libxslt/files/libxslt-1.1.34-CVE-2021-30560.patch |
28 |
@@ -0,0 +1,194 @@ |
29 |
+https://gitlab.gnome.org/GNOME/libxslt/-/issues/56 |
30 |
+https://gitlab.gnome.org/GNOME/libxslt/-/commit/50f9c9cd3b7dfe9b3c8c795247752d1fdcadcac8 |
31 |
+https://gitlab.gnome.org/GNOME/libxslt/-/issues/51 |
32 |
+https://bugs.gentoo.org/790218 |
33 |
+ |
34 |
+From: Nick Wellnhofer <wellnhofer@×××××.de> |
35 |
+Date: Sat, 12 Jun 2021 20:02:53 +0200 |
36 |
+Subject: [PATCH] Fix use-after-free in xsltApplyTemplates |
37 |
+ |
38 |
+xsltApplyTemplates without a select expression could delete nodes in |
39 |
+the source document. |
40 |
+ |
41 |
+1. Text nodes with strippable whitespace |
42 |
+ |
43 |
+Whitespace from input documents is already stripped, so there's no |
44 |
+need to strip it again. Under certain circumstances, xsltApplyTemplates |
45 |
+could be fooled into deleting text nodes that are still referenced, |
46 |
+resulting in a use-after-free. |
47 |
+ |
48 |
+2. The DTD |
49 |
+ |
50 |
+The DTD was only unlinked, but there's no good reason to do this just |
51 |
+now. Maybe it was meant as a micro-optimization. |
52 |
+ |
53 |
+3. Unknown nodes |
54 |
+ |
55 |
+Useless and dangerous as well, especially with XInclude nodes. |
56 |
+See https://gitlab.gnome.org/GNOME/libxml2/-/issues/268 |
57 |
+ |
58 |
+Simply stop trying to uselessly delete nodes when applying a template. |
59 |
+This part of the code is probably a leftover from a time where |
60 |
+xsltApplyStripSpaces wasn't implemented yet. Also note that |
61 |
+xsltApplyTemplates with a select expression never tried to delete |
62 |
+nodes. |
63 |
+ |
64 |
+Also stop xsltDefaultProcessOneNode from deleting nodes for the same |
65 |
+reasons. |
66 |
+ |
67 |
+This fixes CVE-2021-30560. |
68 |
+--- a/libxslt/transform.c |
69 |
++++ b/libxslt/transform.c |
70 |
+@@ -1895,7 +1895,7 @@ static void |
71 |
+ xsltDefaultProcessOneNode(xsltTransformContextPtr ctxt, xmlNodePtr node, |
72 |
+ xsltStackElemPtr params) { |
73 |
+ xmlNodePtr copy; |
74 |
+- xmlNodePtr delete = NULL, cur; |
75 |
++ xmlNodePtr cur; |
76 |
+ int nbchild = 0, oldSize; |
77 |
+ int childno = 0, oldPos; |
78 |
+ xsltTemplatePtr template; |
79 |
+@@ -1968,54 +1968,13 @@ xsltDefaultProcessOneNode(xsltTransformContextPtr ctxt, xmlNodePtr node, |
80 |
+ return; |
81 |
+ } |
82 |
+ /* |
83 |
+- * Handling of Elements: first pass, cleanup and counting |
84 |
++ * Handling of Elements: first pass, counting |
85 |
+ */ |
86 |
+ cur = node->children; |
87 |
+ while (cur != NULL) { |
88 |
+- switch (cur->type) { |
89 |
+- case XML_TEXT_NODE: |
90 |
+- case XML_CDATA_SECTION_NODE: |
91 |
+- case XML_DOCUMENT_NODE: |
92 |
+- case XML_HTML_DOCUMENT_NODE: |
93 |
+- case XML_ELEMENT_NODE: |
94 |
+- case XML_PI_NODE: |
95 |
+- case XML_COMMENT_NODE: |
96 |
+- nbchild++; |
97 |
+- break; |
98 |
+- case XML_DTD_NODE: |
99 |
+- /* Unlink the DTD, it's still reachable using doc->intSubset */ |
100 |
+- if (cur->next != NULL) |
101 |
+- cur->next->prev = cur->prev; |
102 |
+- if (cur->prev != NULL) |
103 |
+- cur->prev->next = cur->next; |
104 |
+- break; |
105 |
+- default: |
106 |
+-#ifdef WITH_XSLT_DEBUG_PROCESS |
107 |
+- XSLT_TRACE(ctxt,XSLT_TRACE_PROCESS_NODE,xsltGenericDebug(xsltGenericDebugContext, |
108 |
+- "xsltDefaultProcessOneNode: skipping node type %d\n", |
109 |
+- cur->type)); |
110 |
+-#endif |
111 |
+- delete = cur; |
112 |
+- } |
113 |
++ if (IS_XSLT_REAL_NODE(cur)) |
114 |
++ nbchild++; |
115 |
+ cur = cur->next; |
116 |
+- if (delete != NULL) { |
117 |
+-#ifdef WITH_XSLT_DEBUG_PROCESS |
118 |
+- XSLT_TRACE(ctxt,XSLT_TRACE_PROCESS_NODE,xsltGenericDebug(xsltGenericDebugContext, |
119 |
+- "xsltDefaultProcessOneNode: removing ignorable blank node\n")); |
120 |
+-#endif |
121 |
+- xmlUnlinkNode(delete); |
122 |
+- xmlFreeNode(delete); |
123 |
+- delete = NULL; |
124 |
+- } |
125 |
+- } |
126 |
+- if (delete != NULL) { |
127 |
+-#ifdef WITH_XSLT_DEBUG_PROCESS |
128 |
+- XSLT_TRACE(ctxt,XSLT_TRACE_PROCESS_NODE,xsltGenericDebug(xsltGenericDebugContext, |
129 |
+- "xsltDefaultProcessOneNode: removing ignorable blank node\n")); |
130 |
+-#endif |
131 |
+- xmlUnlinkNode(delete); |
132 |
+- xmlFreeNode(delete); |
133 |
+- delete = NULL; |
134 |
+ } |
135 |
+ |
136 |
+ /* |
137 |
+@@ -4864,7 +4823,7 @@ xsltApplyTemplates(xsltTransformContextPtr ctxt, xmlNodePtr node, |
138 |
+ xsltStylePreCompPtr comp = (xsltStylePreCompPtr) castedComp; |
139 |
+ #endif |
140 |
+ int i; |
141 |
+- xmlNodePtr cur, delNode = NULL, oldContextNode; |
142 |
++ xmlNodePtr cur, oldContextNode; |
143 |
+ xmlNodeSetPtr list = NULL, oldList; |
144 |
+ xsltStackElemPtr withParams = NULL; |
145 |
+ int oldXPProximityPosition, oldXPContextSize; |
146 |
+@@ -4998,73 +4957,9 @@ xsltApplyTemplates(xsltTransformContextPtr ctxt, xmlNodePtr node, |
147 |
+ else |
148 |
+ cur = NULL; |
149 |
+ while (cur != NULL) { |
150 |
+- switch (cur->type) { |
151 |
+- case XML_TEXT_NODE: |
152 |
+- if ((IS_BLANK_NODE(cur)) && |
153 |
+- (cur->parent != NULL) && |
154 |
+- (cur->parent->type == XML_ELEMENT_NODE) && |
155 |
+- (ctxt->style->stripSpaces != NULL)) { |
156 |
+- const xmlChar *val; |
157 |
+- |
158 |
+- if (cur->parent->ns != NULL) { |
159 |
+- val = (const xmlChar *) |
160 |
+- xmlHashLookup2(ctxt->style->stripSpaces, |
161 |
+- cur->parent->name, |
162 |
+- cur->parent->ns->href); |
163 |
+- if (val == NULL) { |
164 |
+- val = (const xmlChar *) |
165 |
+- xmlHashLookup2(ctxt->style->stripSpaces, |
166 |
+- BAD_CAST "*", |
167 |
+- cur->parent->ns->href); |
168 |
+- } |
169 |
+- } else { |
170 |
+- val = (const xmlChar *) |
171 |
+- xmlHashLookup2(ctxt->style->stripSpaces, |
172 |
+- cur->parent->name, NULL); |
173 |
+- } |
174 |
+- if ((val != NULL) && |
175 |
+- (xmlStrEqual(val, (xmlChar *) "strip"))) { |
176 |
+- delNode = cur; |
177 |
+- break; |
178 |
+- } |
179 |
+- } |
180 |
+- /* Intentional fall-through */ |
181 |
+- case XML_ELEMENT_NODE: |
182 |
+- case XML_DOCUMENT_NODE: |
183 |
+- case XML_HTML_DOCUMENT_NODE: |
184 |
+- case XML_CDATA_SECTION_NODE: |
185 |
+- case XML_PI_NODE: |
186 |
+- case XML_COMMENT_NODE: |
187 |
+- xmlXPathNodeSetAddUnique(list, cur); |
188 |
+- break; |
189 |
+- case XML_DTD_NODE: |
190 |
+- /* Unlink the DTD, it's still reachable |
191 |
+- * using doc->intSubset */ |
192 |
+- if (cur->next != NULL) |
193 |
+- cur->next->prev = cur->prev; |
194 |
+- if (cur->prev != NULL) |
195 |
+- cur->prev->next = cur->next; |
196 |
+- break; |
197 |
+- case XML_NAMESPACE_DECL: |
198 |
+- break; |
199 |
+- default: |
200 |
+-#ifdef WITH_XSLT_DEBUG_PROCESS |
201 |
+- XSLT_TRACE(ctxt,XSLT_TRACE_APPLY_TEMPLATES,xsltGenericDebug(xsltGenericDebugContext, |
202 |
+- "xsltApplyTemplates: skipping cur type %d\n", |
203 |
+- cur->type)); |
204 |
+-#endif |
205 |
+- delNode = cur; |
206 |
+- } |
207 |
++ if (IS_XSLT_REAL_NODE(cur)) |
208 |
++ xmlXPathNodeSetAddUnique(list, cur); |
209 |
+ cur = cur->next; |
210 |
+- if (delNode != NULL) { |
211 |
+-#ifdef WITH_XSLT_DEBUG_PROCESS |
212 |
+- XSLT_TRACE(ctxt,XSLT_TRACE_APPLY_TEMPLATES,xsltGenericDebug(xsltGenericDebugContext, |
213 |
+- "xsltApplyTemplates: removing ignorable blank cur\n")); |
214 |
+-#endif |
215 |
+- xmlUnlinkNode(delNode); |
216 |
+- xmlFreeNode(delNode); |
217 |
+- delNode = NULL; |
218 |
+- } |
219 |
+ } |
220 |
+ } |
221 |
+ |
222 |
+GitLab |
223 |
|
224 |
diff --git a/dev-libs/libxslt/files/libxslt-1.1.34-libxml2-2.9.12.patch b/dev-libs/libxslt/files/libxslt-1.1.34-libxml2-2.9.12.patch |
225 |
new file mode 100644 |
226 |
index 00000000000..635fb576d3d |
227 |
--- /dev/null |
228 |
+++ b/dev-libs/libxslt/files/libxslt-1.1.34-libxml2-2.9.12.patch |
229 |
@@ -0,0 +1,120 @@ |
230 |
+https://gitlab.gnome.org/GNOME/libxslt/-/commit/9ae2f94df1721e002941b40665efb762aefcea1a |
231 |
+https://gitlab.gnome.org/GNOME/libxslt/-/commit/824657768aea2cce9c23e72ba8085cb5e44350c7 |
232 |
+https://gitlab.gnome.org/GNOME/libxslt/-/commit/77c26bad0433541f486b1e7ced44ca9979376908 |
233 |
+ |
234 |
+From: Nick Wellnhofer <wellnhofer@×××××.de> |
235 |
+Date: Mon, 17 Aug 2020 03:42:11 +0200 |
236 |
+Subject: [PATCH] Stop using maxParserDepth XPath limit |
237 |
+ |
238 |
+This will be removed again from libxml2. |
239 |
+--- a/tests/fuzz/fuzz.c |
240 |
++++ b/tests/fuzz/fuzz.c |
241 |
+@@ -183,8 +183,7 @@ xsltFuzzXPathInit(int *argc_p ATTRIBUTE_UNUSED, char ***argv_p, |
242 |
+ xpctxt = tctxt->xpathCtxt; |
243 |
+ |
244 |
+ /* Resource limits to avoid timeouts and call stack overflows */ |
245 |
+- xpctxt->maxParserDepth = 15; |
246 |
+- xpctxt->maxDepth = 100; |
247 |
++ xpctxt->maxDepth = 500; |
248 |
+ xpctxt->opLimit = 500000; |
249 |
+ |
250 |
+ /* Test namespaces used in xpath.xml */ |
251 |
+@@ -317,8 +316,7 @@ xsltFuzzXsltInit(int *argc_p ATTRIBUTE_UNUSED, char ***argv_p, |
252 |
+ |
253 |
+ static void |
254 |
+ xsltSetXPathResourceLimits(xmlXPathContextPtr ctxt) { |
255 |
+- ctxt->maxParserDepth = 15; |
256 |
+- ctxt->maxDepth = 100; |
257 |
++ ctxt->maxDepth = 200; |
258 |
+ ctxt->opLimit = 100000; |
259 |
+ } |
260 |
+ |
261 |
+From: Nick Wellnhofer <wellnhofer@×××××.de> |
262 |
+Date: Mon, 17 Aug 2020 04:27:13 +0200 |
263 |
+Subject: [PATCH] Transfer XPath limits to XPtr context |
264 |
+ |
265 |
+Expressions like document('doc.xml#xpointer(evil_expr)') ignored the |
266 |
+XPath limits. |
267 |
+--- a/libxslt/functions.c |
268 |
++++ b/libxslt/functions.c |
269 |
+@@ -178,10 +178,22 @@ xsltDocumentFunctionLoadDocument(xmlXPathParserContextPtr ctxt, xmlChar* URI) |
270 |
+ goto out_fragment; |
271 |
+ } |
272 |
+ |
273 |
++#if LIBXML_VERSION >= 20911 || \ |
274 |
++ defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) |
275 |
++ xptrctxt->opLimit = ctxt->context->opLimit; |
276 |
++ xptrctxt->opCount = ctxt->context->opCount; |
277 |
++ xptrctxt->maxDepth = ctxt->context->maxDepth - ctxt->context->depth; |
278 |
++ |
279 |
++ resObj = xmlXPtrEval(fragment, xptrctxt); |
280 |
++ |
281 |
++ ctxt->context->opCount = xptrctxt->opCount; |
282 |
++#else |
283 |
+ resObj = xmlXPtrEval(fragment, xptrctxt); |
284 |
+- xmlXPathFreeContext(xptrctxt); |
285 |
+ #endif |
286 |
+ |
287 |
++ xmlXPathFreeContext(xptrctxt); |
288 |
++#endif /* LIBXML_XPTR_ENABLED */ |
289 |
++ |
290 |
+ if (resObj == NULL) |
291 |
+ goto out_fragment; |
292 |
+ |
293 |
+From: Nick Wellnhofer <wellnhofer@×××××.de> |
294 |
+Date: Wed, 26 Aug 2020 00:34:38 +0200 |
295 |
+Subject: [PATCH] Don't set maxDepth in XPath contexts |
296 |
+ |
297 |
+The maximum recursion depth is hardcoded in libxml2 now. |
298 |
+--- a/libxslt/functions.c |
299 |
++++ b/libxslt/functions.c |
300 |
+@@ -182,7 +182,7 @@ xsltDocumentFunctionLoadDocument(xmlXPathParserContextPtr ctxt, xmlChar* URI) |
301 |
+ defined(FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) |
302 |
+ xptrctxt->opLimit = ctxt->context->opLimit; |
303 |
+ xptrctxt->opCount = ctxt->context->opCount; |
304 |
+- xptrctxt->maxDepth = ctxt->context->maxDepth - ctxt->context->depth; |
305 |
++ xptrctxt->depth = ctxt->context->depth; |
306 |
+ |
307 |
+ resObj = xmlXPtrEval(fragment, xptrctxt); |
308 |
+ |
309 |
+--- a/tests/fuzz/fuzz.c |
310 |
++++ b/tests/fuzz/fuzz.c |
311 |
+@@ -183,7 +183,6 @@ xsltFuzzXPathInit(int *argc_p ATTRIBUTE_UNUSED, char ***argv_p, |
312 |
+ xpctxt = tctxt->xpathCtxt; |
313 |
+ |
314 |
+ /* Resource limits to avoid timeouts and call stack overflows */ |
315 |
+- xpctxt->maxDepth = 500; |
316 |
+ xpctxt->opLimit = 500000; |
317 |
+ |
318 |
+ /* Test namespaces used in xpath.xml */ |
319 |
+@@ -314,12 +313,6 @@ xsltFuzzXsltInit(int *argc_p ATTRIBUTE_UNUSED, char ***argv_p, |
320 |
+ return 0; |
321 |
+ } |
322 |
+ |
323 |
+-static void |
324 |
+-xsltSetXPathResourceLimits(xmlXPathContextPtr ctxt) { |
325 |
+- ctxt->maxDepth = 200; |
326 |
+- ctxt->opLimit = 100000; |
327 |
+-} |
328 |
+- |
329 |
+ xmlChar * |
330 |
+ xsltFuzzXslt(const char *data, size_t size) { |
331 |
+ xmlDocPtr xsltDoc; |
332 |
+@@ -349,7 +342,7 @@ xsltFuzzXslt(const char *data, size_t size) { |
333 |
+ xmlFreeDoc(xsltDoc); |
334 |
+ return NULL; |
335 |
+ } |
336 |
+- xsltSetXPathResourceLimits(sheet->xpathCtxt); |
337 |
++ sheet->xpathCtxt->opLimit = 100000; |
338 |
+ sheet->xpathCtxt->opCount = 0; |
339 |
+ if (xsltParseStylesheetUser(sheet, xsltDoc) != 0) { |
340 |
+ xsltFreeStylesheet(sheet); |
341 |
+@@ -361,7 +354,7 @@ xsltFuzzXslt(const char *data, size_t size) { |
342 |
+ xsltSetCtxtSecurityPrefs(sec, ctxt); |
343 |
+ ctxt->maxTemplateDepth = 100; |
344 |
+ ctxt->opLimit = 20000; |
345 |
+- xsltSetXPathResourceLimits(ctxt->xpathCtxt); |
346 |
++ ctxt->xpathCtxt->opLimit = 100000; |
347 |
+ ctxt->xpathCtxt->opCount = sheet->xpathCtxt->opCount; |
348 |
+ |
349 |
+ result = xsltApplyStylesheetUser(sheet, doc, NULL, NULL, NULL, ctxt); |
350 |
|
351 |
diff --git a/dev-libs/libxslt/libxslt-1.1.34-r2.ebuild b/dev-libs/libxslt/libxslt-1.1.34-r2.ebuild |
352 |
new file mode 100644 |
353 |
index 00000000000..df1a9b5e042 |
354 |
--- /dev/null |
355 |
+++ b/dev-libs/libxslt/libxslt-1.1.34-r2.ebuild |
356 |
@@ -0,0 +1,72 @@ |
357 |
+# Copyright 1999-2021 Gentoo Authors |
358 |
+# Distributed under the terms of the GNU General Public License v2 |
359 |
+ |
360 |
+EAPI=7 |
361 |
+ |
362 |
+VERIFY_SIG_OPENPGP_KEY_PATH=${BROOT}/usr/share/openpgp-keys/danielveillard.asc |
363 |
+inherit libtool multilib-minimal verify-sig |
364 |
+ |
365 |
+# Note: Please bump this in sync with dev-libs/libxml2. |
366 |
+DESCRIPTION="XSLT libraries and tools" |
367 |
+HOMEPAGE="http://www.xmlsoft.org/ https://gitlab.gnome.org/GNOME/libxslt" |
368 |
+SRC_URI="ftp://xmlsoft.org/${PN}/${P}.tar.gz" |
369 |
+SRC_URI+=" verify-sig? ( ftp://xmlsoft.org/${PN}/${P}.tar.gz.asc )" |
370 |
+ |
371 |
+LICENSE="MIT" |
372 |
+SLOT="0" |
373 |
+KEYWORDS="~alpha ~amd64 ~arm ~arm64 ~hppa ~ia64 ~m68k ~mips ~ppc ~ppc64 ~riscv ~s390 ~sparc ~x86 ~x64-cygwin ~amd64-linux ~x86-linux ~ppc-macos ~x64-macos ~sparc-solaris ~sparc64-solaris ~x64-solaris ~x86-solaris" |
374 |
+IUSE="crypt debug examples static-libs elibc_Darwin" |
375 |
+ |
376 |
+BDEPEND=">=virtual/pkgconfig-1 |
377 |
+ verify-sig? ( app-crypt/openpgp-keys-danielveillard )" |
378 |
+RDEPEND=" |
379 |
+ >=dev-libs/libxml2-2.9.11:2[${MULTILIB_USEDEP}] |
380 |
+ crypt? ( >=dev-libs/libgcrypt-1.5.3:0=[${MULTILIB_USEDEP}] ) |
381 |
+" |
382 |
+DEPEND="${RDEPEND}" |
383 |
+ |
384 |
+MULTILIB_CHOST_TOOLS=( |
385 |
+ /usr/bin/xslt-config |
386 |
+) |
387 |
+ |
388 |
+MULTILIB_WRAPPED_HEADERS=( |
389 |
+ /usr/include/libxslt/xsltconfig.h |
390 |
+) |
391 |
+ |
392 |
+PATCHES=( |
393 |
+ "${FILESDIR}"/${P}-libxml2-2.9.12.patch |
394 |
+ "${FILESDIR}"/${P}-CVE-2021-30560.patch |
395 |
+) |
396 |
+ |
397 |
+src_prepare() { |
398 |
+ default |
399 |
+ |
400 |
+ DOCS=( AUTHORS ChangeLog FEATURES NEWS README TODO ) |
401 |
+ |
402 |
+ # Prefix always needs elibtoolize if not eautoreconf'd. |
403 |
+ elibtoolize |
404 |
+} |
405 |
+ |
406 |
+multilib_src_configure() { |
407 |
+ # Python bindings were dropped as they were Python 2 only at the time |
408 |
+ ECONF_SOURCE="${S}" econf \ |
409 |
+ --with-html-dir="${EPREFIX}"/usr/share/doc/${PF} \ |
410 |
+ --with-html-subdir=html \ |
411 |
+ --without-python \ |
412 |
+ $(use_with crypt crypto) \ |
413 |
+ $(use_with debug) \ |
414 |
+ $(use_with debug mem-debug) \ |
415 |
+ $(use_enable static-libs static) \ |
416 |
+ "$@" |
417 |
+} |
418 |
+ |
419 |
+multilib_src_install() { |
420 |
+ # "default" does not work here - docs are installed by multilib_src_install_all |
421 |
+ emake DESTDIR="${D}" install |
422 |
+} |
423 |
+ |
424 |
+multilib_src_install_all() { |
425 |
+ einstalldocs |
426 |
+ |
427 |
+ find "${ED}" -type f -name "*.la" -delete || die |
428 |
+} |