mirror of
https://git.yoctoproject.org/poky
synced 2026-02-21 17:09:42 +01:00
Compare commits
108 Commits
yocto-4.0.
...
yocto-4.0.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
78c9cb3eaf | ||
|
|
f66b3ae543 | ||
|
|
ac03ee2932 | ||
|
|
6964579627 | ||
|
|
9bc0069f8b | ||
|
|
104f728b65 | ||
|
|
753ec02637 | ||
|
|
b4284b3eb2 | ||
|
|
09407f375d | ||
|
|
3aa44948cb | ||
|
|
6a19b931f0 | ||
|
|
467cc32439 | ||
|
|
16168960c4 | ||
|
|
f9f25b4fd6 | ||
|
|
f9ae7a93d4 | ||
|
|
3fc748ecd7 | ||
|
|
64327d7000 | ||
|
|
41197b0df6 | ||
|
|
52b3a3b7c5 | ||
|
|
207921bcca | ||
|
|
70473efe13 | ||
|
|
7e68f78b6e | ||
|
|
d76598e8aa | ||
|
|
395879fd14 | ||
|
|
614a3abb3a | ||
|
|
548a08daab | ||
|
|
5cb3b16aa9 | ||
|
|
cdd974ba56 | ||
|
|
a9b8182e89 | ||
|
|
218c9ec684 | ||
|
|
d2ca3a347e | ||
|
|
c0a8db39ed | ||
|
|
0101023c28 | ||
|
|
91d538d055 | ||
|
|
cf89524072 | ||
|
|
aa3a15a8bf | ||
|
|
1f73cf5b98 | ||
|
|
bb706cfe48 | ||
|
|
cecdcf3428 | ||
|
|
dd4d1b28e3 | ||
|
|
c2489908d7 | ||
|
|
4976dc40af | ||
|
|
8bce7467dc | ||
|
|
ca51d99bf3 | ||
|
|
07f522869c | ||
|
|
f49fc9966d | ||
|
|
523a48d5c8 | ||
|
|
d5fa84385a | ||
|
|
241a617374 | ||
|
|
58c95e1d4c | ||
|
|
0d1428e5b8 | ||
|
|
1df4bec5eb | ||
|
|
a2dd4be796 | ||
|
|
63073ee1c1 | ||
|
|
e3d5f852f6 | ||
|
|
8fc7f29255 | ||
|
|
8cd040c218 | ||
|
|
57421fdde6 | ||
|
|
50475a377a | ||
|
|
145b1ddb2b | ||
|
|
c6848d874c | ||
|
|
87267b3370 | ||
|
|
775ca31829 | ||
|
|
0f3339f7ff | ||
|
|
34bb2a2900 | ||
|
|
9f5df97f5c | ||
|
|
179c5dc17f | ||
|
|
9a368c7b92 | ||
|
|
e35c7960a7 | ||
|
|
5b18890ace | ||
|
|
81e0dc80d7 | ||
|
|
0238a535e8 | ||
|
|
ad8045d76f | ||
|
|
d30dba501a | ||
|
|
ec1ed4896c | ||
|
|
59b2c2c7d8 | ||
|
|
b3b9ac7edc | ||
|
|
6fceeca067 | ||
|
|
14d260ab25 | ||
|
|
94dea33c75 | ||
|
|
3810d71ad8 | ||
|
|
14ad855916 | ||
|
|
c90ab351eb | ||
|
|
c5b17456e6 | ||
|
|
9fe29f2369 | ||
|
|
304b1b285b | ||
|
|
7dfd7de941 | ||
|
|
d2de20a4b6 | ||
|
|
32712b2a6b | ||
|
|
38e33dedee | ||
|
|
40232dc020 | ||
|
|
7888d6459e | ||
|
|
ac7af3f00b | ||
|
|
36432822b1 | ||
|
|
72c9483d9d | ||
|
|
ce1cefc347 | ||
|
|
c6cd61f1a2 | ||
|
|
aee1d45a83 | ||
|
|
32d2b233c6 | ||
|
|
097732e057 | ||
|
|
ef632f4693 | ||
|
|
cbbea14280 | ||
|
|
d8278fd9f9 | ||
|
|
21bb9c063b | ||
|
|
0f58759f1b | ||
|
|
23a8405509 | ||
|
|
7f043fb4bb | ||
|
|
0fa8a4465e |
@@ -429,5 +429,22 @@ both the Yocto Project and BitBake manuals:
|
||||
Submitting documentation changes
|
||||
================================
|
||||
|
||||
Please see the top level README file in this repository for details of where
|
||||
to send patches.
|
||||
Please refer to our contributor guide here: https://docs.yoctoproject.org/contributor-guide/
|
||||
for full details on how to submit changes.
|
||||
|
||||
As a quick guide, patches should be sent to docs@lists.yoctoproject.org
|
||||
The git command to do that would be:
|
||||
|
||||
git send-email -M -1 --to docs@lists.yoctoproject.org
|
||||
|
||||
The 'To' header can be set as default for this repository:
|
||||
|
||||
git config sendemail.to docs@lists.yoctoproject.org
|
||||
|
||||
Now you can just do 'git send-email origin/master..' to send all local patches.
|
||||
|
||||
Read the other sections in this document and documentation/standards.md for
|
||||
rules to follow when contributing to the documentation.
|
||||
|
||||
Git repository: https://git.yoctoproject.org/yocto-docs
|
||||
Mailing list: docs@lists.yoctoproject.org
|
||||
|
||||
@@ -57,7 +57,7 @@ following requirements:
|
||||
:ref:`dev-manual/start:preparing the build host`
|
||||
section in the Yocto Project Development Tasks Manual.
|
||||
|
||||
-
|
||||
- Ensure that the following utilities have these minimum version numbers:
|
||||
|
||||
- Git &MIN_GIT_VERSION; or greater
|
||||
- tar &MIN_TAR_VERSION; or greater
|
||||
@@ -65,7 +65,7 @@ following requirements:
|
||||
- gcc &MIN_GCC_VERSION; or greater.
|
||||
- GNU make &MIN_MAKE_VERSION; or greater
|
||||
|
||||
If your build host does not meet any of these three listed version
|
||||
If your build host does not satisfy all of the above version
|
||||
requirements, you can take steps to prepare the system so that you
|
||||
can still use the Yocto Project. See the
|
||||
:ref:`ref-manual/system-requirements:required git, tar, python, make and gcc versions`
|
||||
@@ -182,7 +182,7 @@ an entire Linux distribution, including the toolchain, from source.
|
||||
page of the Yocto Project Wiki.
|
||||
|
||||
#. **Initialize the Build Environment:** From within the ``poky``
|
||||
directory, run the :ref:`ref-manual/structure:\`\`oe-init-build-env\`\``
|
||||
directory, run the :ref:`ref-manual/structure:``oe-init-build-env```
|
||||
environment
|
||||
setup script to define Yocto Project's build environment on your
|
||||
build host.
|
||||
@@ -252,7 +252,7 @@ an entire Linux distribution, including the toolchain, from source.
|
||||
file in the :term:`Build Directory`::
|
||||
|
||||
BB_HASHSERVE_UPSTREAM = "hashserv.yoctoproject.org:8686"
|
||||
SSTATE_MIRRORS ?= "file://.* http://cdn.jsdelivr.net/yocto/sstate/all/PATH;downloadfilename=PATH"
|
||||
SSTATE_MIRRORS ?= "file://.* http://sstate.yoctoproject.org/all/PATH;downloadfilename=PATH"
|
||||
BB_HASHSERVE = "auto"
|
||||
BB_SIGNATURE_HANDLER = "OEEquivHash"
|
||||
|
||||
|
||||
@@ -81,7 +81,7 @@ directory of that Layer. This directory is what you add to the
|
||||
``conf/bblayers.conf`` file found in your
|
||||
:term:`Build Directory`, which is
|
||||
established after you run the OpenEmbedded build environment setup
|
||||
script (i.e. :ref:`ref-manual/structure:\`\`oe-init-build-env\`\``).
|
||||
script (i.e. :ref:`ref-manual/structure:``oe-init-build-env```).
|
||||
Adding the root directory allows the :term:`OpenEmbedded Build System`
|
||||
to recognize the BSP
|
||||
layer and from it build an image. Here is an example::
|
||||
@@ -230,7 +230,7 @@ section.
|
||||
|
||||
#. *Initialize the Build Environment:* While in the root directory of
|
||||
the Source Directory (i.e. ``poky``), run the
|
||||
:ref:`ref-manual/structure:\`\`oe-init-build-env\`\`` environment
|
||||
:ref:`ref-manual/structure:``oe-init-build-env``` environment
|
||||
setup script to define the OpenEmbedded build environment on your
|
||||
build host. ::
|
||||
|
||||
@@ -675,21 +675,21 @@ to the kernel recipe by using a similarly named append file, which is
|
||||
located in the BSP Layer for your target device (e.g. the
|
||||
``meta-bsp_root_name/recipes-kernel/linux`` directory).
|
||||
|
||||
Suppose you are using the ``linux-yocto_4.4.bb`` recipe to build the
|
||||
Suppose you are using the ``linux-yocto_6.12.bb`` recipe to build the
|
||||
kernel. In other words, you have selected the kernel in your
|
||||
``"bsp_root_name".conf`` file by adding
|
||||
:term:`PREFERRED_PROVIDER` and :term:`PREFERRED_VERSION`
|
||||
statements as follows::
|
||||
|
||||
PREFERRED_PROVIDER_virtual/kernel ?= "linux-yocto"
|
||||
PREFERRED_VERSION_linux-yocto ?= "4.4%"
|
||||
PREFERRED_VERSION_linux-yocto ?= "6.12%"
|
||||
|
||||
.. note::
|
||||
|
||||
When the preferred provider is assumed by default, the :term:`PREFERRED_PROVIDER`
|
||||
statement does not appear in the ``"bsp_root_name".conf`` file.
|
||||
|
||||
You would use the ``linux-yocto_4.4.bbappend`` file to append specific
|
||||
You would use the ``linux-yocto_6.12.bbappend`` file to append specific
|
||||
BSP settings to the kernel, thus configuring the kernel for your
|
||||
particular BSP.
|
||||
|
||||
@@ -699,14 +699,19 @@ in the Yocto Project Linux Kernel Development Manual.
|
||||
|
||||
An alternate scenario is when you create your own kernel recipe for the
|
||||
BSP. A good example of this is the Raspberry Pi BSP. If you examine the
|
||||
``recipes-kernel/linux`` directory you see the following::
|
||||
``recipes-kernel/linux`` directory in that layer you see the following
|
||||
Raspberry Pi-specific recipes and associated files::
|
||||
|
||||
files/
|
||||
linux-raspberrypi_6.12.bb
|
||||
linux-raspberrypi_6.1.bb
|
||||
linux-raspberrypi_6.6.bb
|
||||
linux-raspberrypi-dev.bb
|
||||
linux-raspberrypi.inc
|
||||
linux-raspberrypi_4.14.bb
|
||||
linux-raspberrypi_4.9.bb
|
||||
|
||||
The directory contains three kernel recipes and a common include file.
|
||||
linux-raspberrypi-v7_6.12.bb
|
||||
linux-raspberrypi-v7_6.1.bb
|
||||
linux-raspberrypi-v7_6.6.bb
|
||||
linux-raspberrypi-v7.inc
|
||||
|
||||
Developing a Board Support Package (BSP)
|
||||
========================================
|
||||
@@ -1179,7 +1184,7 @@ Use these steps to create a BSP layer:
|
||||
|
||||
- *Create a Kernel Recipe:* Create a kernel recipe in
|
||||
``recipes-kernel/linux`` by either using a kernel append file or a
|
||||
new custom kernel recipe file (e.g. ``linux-yocto_4.12.bb``). The BSP
|
||||
new custom kernel recipe file (e.g. ``linux-yocto_6.12.bb``). The BSP
|
||||
layers mentioned in the previous step also contain different kernel
|
||||
examples. See the ":ref:`kernel-dev/common:modifying an existing recipe`"
|
||||
section in the Yocto Project Linux Kernel Development Manual for
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
||||
#
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
import datetime
|
||||
try:
|
||||
@@ -165,6 +166,24 @@ latex_elements = {
|
||||
'preamble': '\\setcounter{tocdepth}{2}',
|
||||
}
|
||||
|
||||
|
||||
from sphinx.search import SearchEnglish
|
||||
from sphinx.search import languages
|
||||
class DashFriendlySearchEnglish(SearchEnglish):
|
||||
|
||||
# Accept words that can include hyphens
|
||||
_word_re = re.compile(r'[\w\-]+')
|
||||
|
||||
js_splitter_code = r"""
|
||||
function splitQuery(query) {
|
||||
return query
|
||||
.split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}-]+/gu)
|
||||
.filter(term => term.length > 0);
|
||||
}
|
||||
"""
|
||||
|
||||
languages['en'] = DashFriendlySearchEnglish
|
||||
|
||||
# Make the EPUB builder prefer PNG to SVG because of issues rendering Inkscape SVG
|
||||
from sphinx.builders.epub3 import Epub3Builder
|
||||
Epub3Builder.supported_image_types = ['image/png', 'image/gif', 'image/jpeg']
|
||||
|
||||
@@ -735,6 +735,38 @@ argument to ``git format-patch`` with a version number::
|
||||
|
||||
git format-patch -v2 <ref-branch>
|
||||
|
||||
|
||||
After generating updated patches (v2, v3, and so on) via ``git
|
||||
format-patch``, ideally developers will add a patch version changelog
|
||||
to each patch that describes what has changed between each revision of
|
||||
the patch. Add patch version changelogs after the ``---`` marker in the
|
||||
patch, indicating that this information is part of this patch, but is not
|
||||
suitable for inclusion in the commit message (i.e. the git history) itself.
|
||||
Providing a patch version changelog makes it easier for maintainers and
|
||||
reviewers to succinctly understand what changed in all versions of the
|
||||
patch, without having to consult alternate sources of information, such as
|
||||
searching through messages on a mailing list. For example::
|
||||
|
||||
<patch title>
|
||||
|
||||
<commit message>
|
||||
|
||||
<Signed-off-by/other trailers>
|
||||
---
|
||||
changes in v4:
|
||||
- provide a clearer commit message
|
||||
- fix spelling mistakes
|
||||
|
||||
changes in v3:
|
||||
- replace func() to use other_func() instead
|
||||
|
||||
changes in v2:
|
||||
- this patch was added in v2
|
||||
---
|
||||
<diffstat output>
|
||||
|
||||
<unified diff>
|
||||
|
||||
Lastly please ensure that you also test your revised changes. In particular
|
||||
please don't just edit the patch file written out by ``git format-patch`` and
|
||||
resend it.
|
||||
|
||||
@@ -36,7 +36,7 @@ section:
|
||||
use the BitBake ``-e`` option to examine variable values after a
|
||||
recipe has been parsed.
|
||||
|
||||
- ":ref:`dev-manual/debugging:viewing package information with \`\`oe-pkgdata-util\`\``"
|
||||
- ":ref:`dev-manual/debugging:viewing package information with ``oe-pkgdata-util```"
|
||||
describes how to use the ``oe-pkgdata-util`` utility to query
|
||||
:term:`PKGDATA_DIR` and
|
||||
display package-related information for built packages.
|
||||
|
||||
@@ -56,7 +56,7 @@ necessary when adding a recipe to build a new piece of software to be
|
||||
included in a build.
|
||||
|
||||
You can find a complete description of the ``devtool add`` command in
|
||||
the ":ref:`sdk-manual/extensible:a closer look at \`\`devtool add\`\``" section
|
||||
the ":ref:`sdk-manual/extensible:a closer look at ``devtool add```" section
|
||||
in the Yocto Project Application Development and the Extensible Software
|
||||
Development Kit (eSDK) manual.
|
||||
|
||||
|
||||
@@ -30,16 +30,9 @@ To make this happen, you must inherit the
|
||||
|
||||
INHERIT += "create-spdx"
|
||||
|
||||
Upon building an image, you will then get:
|
||||
|
||||
- :term:`SPDX` output in JSON format as an ``IMAGE-MACHINE.spdx.json`` file in
|
||||
``tmp/deploy/images/MACHINE/`` inside the :term:`Build Directory`.
|
||||
|
||||
- This toplevel file is accompanied by an ``IMAGE-MACHINE.spdx.index.json``
|
||||
containing an index of JSON :term:`SPDX` files for individual recipes.
|
||||
|
||||
- The compressed archive ``IMAGE-MACHINE.spdx.tar.zst`` contains the index
|
||||
and the files for the single recipes.
|
||||
Upon building an image, you will then get the compressed archive
|
||||
``IMAGE-MACHINE.spdx.tar.zst`` contains the index and the files for the single
|
||||
recipes.
|
||||
|
||||
The :ref:`ref-classes-create-spdx` class offers options to include
|
||||
more information in the output :term:`SPDX` data:
|
||||
@@ -56,7 +49,7 @@ more information in the output :term:`SPDX` data:
|
||||
|
||||
Though the toplevel :term:`SPDX` output is available in
|
||||
``tmp/deploy/images/MACHINE/`` inside the :term:`Build Directory`, ancillary
|
||||
generated files are available in ``tmp/deploy/spdx/MACHINE`` too, such as:
|
||||
generated files are available in ``tmp/deploy/spdx`` too, such as:
|
||||
|
||||
- The individual :term:`SPDX` JSON files in the ``IMAGE-MACHINE.spdx.tar.zst``
|
||||
archive.
|
||||
|
||||
@@ -333,7 +333,7 @@ Manually Upgrading a Recipe
|
||||
|
||||
If for some reason you choose not to upgrade recipes using
|
||||
:ref:`dev-manual/upgrading-recipes:Using the Auto Upgrade Helper (AUH)` or
|
||||
by :ref:`dev-manual/upgrading-recipes:Using \`\`devtool upgrade\`\``,
|
||||
by :ref:`dev-manual/upgrading-recipes:Using ``devtool upgrade```,
|
||||
you can manually edit the recipe files to upgrade the versions.
|
||||
|
||||
.. note::
|
||||
|
||||
@@ -514,7 +514,7 @@ or ::
|
||||
|
||||
For more information on how to use the ``bmaptool``
|
||||
to flash a device with an image, see the
|
||||
":ref:`dev-manual/bmaptool:flashing images using \`\`bmaptool\`\``"
|
||||
":ref:`dev-manual/bmaptool:flashing images using ``bmaptool```"
|
||||
section.
|
||||
|
||||
Using a Modified Kickstart File
|
||||
|
||||
@@ -746,7 +746,7 @@ the extensible SDK and ``devtool``.
|
||||
|
||||
Before attempting this procedure, be sure you have performed the
|
||||
steps to get ready for updating the kernel as described in the
|
||||
":ref:`kernel-dev/common:getting ready to develop using \`\`devtool\`\``"
|
||||
":ref:`kernel-dev/common:getting ready to develop using ``devtool```"
|
||||
section.
|
||||
|
||||
Patching the kernel involves changing or adding configurations to an
|
||||
@@ -759,7 +759,7 @@ output at boot time through ``printk`` statements in the kernel's
|
||||
``calibrate.c`` source code file. Applying the patch and booting the
|
||||
modified image causes the added messages to appear on the emulator's
|
||||
console. The example is a continuation of the setup procedure found in
|
||||
the ":ref:`kernel-dev/common:getting ready to develop using \`\`devtool\`\``" Section.
|
||||
the ":ref:`kernel-dev/common:getting ready to develop using ``devtool```" Section.
|
||||
|
||||
1. *Check Out the Kernel Source Files:* First you must use ``devtool``
|
||||
to checkout the kernel source code in its workspace. Be sure you are
|
||||
@@ -768,7 +768,7 @@ the ":ref:`kernel-dev/common:getting ready to develop using \`\`devtool\`\``" Se
|
||||
.. note::
|
||||
|
||||
See this step in the
|
||||
":ref:`kernel-dev/common:getting ready to develop using \`\`devtool\`\``"
|
||||
":ref:`kernel-dev/common:getting ready to develop using ``devtool```"
|
||||
section for more information.
|
||||
|
||||
Use the following ``devtool`` command to check out the code::
|
||||
@@ -883,7 +883,7 @@ the ":ref:`kernel-dev/common:getting ready to develop using \`\`devtool\`\``" Se
|
||||
.. note::
|
||||
|
||||
See Step 3 of the
|
||||
":ref:`kernel-dev/common:getting ready to develop using \`\`devtool\`\``"
|
||||
":ref:`kernel-dev/common:getting ready to develop using ``devtool```"
|
||||
section for information on setting up this layer.
|
||||
|
||||
Once the command
|
||||
@@ -1271,7 +1271,7 @@ appear in the ``.config`` file, which is in the :term:`Build Directory`.
|
||||
|
||||
For more information about where the ``.config`` file is located, see the
|
||||
example in the
|
||||
":ref:`kernel-dev/common:using \`\`menuconfig\`\``"
|
||||
":ref:`kernel-dev/common:using ``menuconfig```"
|
||||
section.
|
||||
|
||||
It is simple to create a configuration fragment. One method is to use
|
||||
@@ -1367,7 +1367,7 @@ when you override a policy configuration in a hardware configuration
|
||||
fragment.
|
||||
|
||||
In order to run this task, you must have an existing ``.config`` file.
|
||||
See the ":ref:`kernel-dev/common:using \`\`menuconfig\`\``" section for
|
||||
See the ":ref:`kernel-dev/common:using ``menuconfig```" section for
|
||||
information on how to create a configuration file.
|
||||
|
||||
Here is sample output from the ``do_kernel_configcheck`` task:
|
||||
@@ -1440,7 +1440,7 @@ and
|
||||
tasks until they produce no warnings.
|
||||
|
||||
For more information on how to use the ``menuconfig`` tool, see the
|
||||
:ref:`kernel-dev/common:using \`\`menuconfig\`\`` section.
|
||||
:ref:`kernel-dev/common:using ``menuconfig``` section.
|
||||
|
||||
Fine-Tuning the Kernel Configuration File
|
||||
-----------------------------------------
|
||||
|
||||
@@ -122,7 +122,7 @@ general information and references for further information.
|
||||
Using ``devtool`` and the eSDK requires that you have a clean build
|
||||
of the image and that you are set up with the appropriate eSDK. For
|
||||
more information, see the
|
||||
":ref:`kernel-dev/common:getting ready to develop using \`\`devtool\`\``"
|
||||
":ref:`kernel-dev/common:getting ready to develop using ``devtool```"
|
||||
section.
|
||||
|
||||
Using traditional kernel development requires that you have the
|
||||
|
||||
@@ -143,7 +143,7 @@ Python changes
|
||||
The new Python packaging classes that should be used are
|
||||
:ref:`python_flit_core <ref-classes-python_flit_core>`,
|
||||
:ref:`python_setuptools_build_meta <ref-classes-python_setuptools_build_meta>`
|
||||
and :ref:`python_poetry_core <ref-classes-python_poetry_core>`.
|
||||
and :ref:`python_poetry_core <ref-classes-python_poetry_core>`.
|
||||
|
||||
- The :ref:`setuptools3 <ref-classes-setuptools3>` class ``do_install()`` task now
|
||||
installs the ``wheel`` binary archive. In current versions of ``setuptools`` the
|
||||
|
||||
@@ -32,3 +32,5 @@ Release 4.0 (kirkstone)
|
||||
release-notes-4.0.23
|
||||
release-notes-4.0.24
|
||||
release-notes-4.0.25
|
||||
release-notes-4.0.26
|
||||
release-notes-4.0.27
|
||||
|
||||
263
documentation/migration-guides/release-notes-4.0.26.rst
Normal file
263
documentation/migration-guides/release-notes-4.0.26.rst
Normal file
@@ -0,0 +1,263 @@
|
||||
Release notes for Yocto-4.0.26 (Kirkstone)
|
||||
------------------------------------------
|
||||
|
||||
Security Fixes in Yocto-4.0.26
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
|
||||
- bind: Fix :cve_nist:`2024-11187` and :cve_nist:`2024-12705`
|
||||
- binutils: Fix :cve_nist:`2025-0840`
|
||||
- elfutils: Fix :cve_nist:`2025-1352` and :cve_nist:`2025-1372`
|
||||
- ffmpeg: Fix CVE-2024-28661, :cve_nist:`2024-35369`, :cve_nist:`2024-36613`, :cve_nist:`2024-36616`,
|
||||
:cve_nist:`2024-36617`, :cve_nist:`2024-36618`, :cve_nist:`2025-0518` and :cve_nist:`2025-25473`
|
||||
- ffmpeg: Ignore :cve_nist:`2023-46407`, :cve_nist:`2023-47470`, :cve_nist:`2024-7272`,
|
||||
:cve_nist:`2024-22860`, :cve_nist:`2024-22861` and :cve_nist:`2024-22862`
|
||||
- freetype: Fix :cve_nist:`2025-27363`
|
||||
- gnutls: Fix :cve_nist:`2024-12243`
|
||||
- grub: Fix :cve_nist:`2024-45774`, :cve_nist:`2024-45775`, :cve_nist:`2024-45776`,
|
||||
:cve_nist:`2024-45777`, :cve_nist:`2024-45778`, :cve_nist:`2024-45779`, :cve_nist:`2024-45780`,
|
||||
:cve_nist:`2024-45781`, :cve_nist:`2024-45782`, :cve_nist:`2024-45783`, :cve_nist:`2024-56737`,
|
||||
:cve_nist:`2025-0622`, :cve_nist:`2025-0624`, :cve_nist:`2025-0677`, :cve_nist:`2025-0684`,
|
||||
:cve_nist:`2025-0685`, :cve_nist:`2025-0686`, :cve_nist:`2025-0689`, :cve_nist:`2025-0678`,
|
||||
:cve_nist:`2025-0690`, :cve_nist:`2025-1118` and :cve_nist:`2025-1125`
|
||||
- gstreamer1.0-rtsp-server: fix :cve_nist:`2024-44331`
|
||||
- libarchive: Fix :cve_nist:`2025-25724`
|
||||
- libarchive: Ignore :cve_nist:`2025-1632`
|
||||
- libcap: Fix :cve_nist:`2025-1390`
|
||||
- linux-yocto/5.10: Fix :cve_nist:`2024-36476`, :cve_nist:`2024-43098`, :cve_nist:`2024-47143`,
|
||||
:cve_nist:`2024-48881`, :cve_nist:`2024-50051`, :cve_nist:`2024-50074`, :cve_nist:`2024-50082`,
|
||||
:cve_nist:`2024-50083`, :cve_nist:`2024-50099`, :cve_nist:`2024-50115`, :cve_nist:`2024-50116`,
|
||||
:cve_nist:`2024-50117`, :cve_nist:`2024-50142`, :cve_nist:`2024-50148`, :cve_nist:`2024-50150`,
|
||||
:cve_nist:`2024-50151`, :cve_nist:`2024-50167`, :cve_nist:`2024-50168`, :cve_nist:`2024-50171`,
|
||||
:cve_nist:`2024-50185`, :cve_nist:`2024-50192`, :cve_nist:`2024-50193`, :cve_nist:`2024-50194`,
|
||||
:cve_nist:`2024-50195`, :cve_nist:`2024-50198`, :cve_nist:`2024-50201`, :cve_nist:`2024-50202`,
|
||||
:cve_nist:`2024-50205`, :cve_nist:`2024-50208`, :cve_nist:`2024-50209`, :cve_nist:`2024-50229`,
|
||||
:cve_nist:`2024-50230`, :cve_nist:`2024-50233`, :cve_nist:`2024-50234`, :cve_nist:`2024-50236`,
|
||||
:cve_nist:`2024-50237`, :cve_nist:`2024-50251`, :cve_nist:`2024-50262`, :cve_nist:`2024-50264`,
|
||||
:cve_nist:`2024-50265`, :cve_nist:`2024-50267`, :cve_nist:`2024-50268`, :cve_nist:`2024-50269`,
|
||||
:cve_nist:`2024-50273`, :cve_nist:`2024-50278`, :cve_nist:`2024-50279`, :cve_nist:`2024-50282`,
|
||||
:cve_nist:`2024-50287`, :cve_nist:`2024-50292`, :cve_nist:`2024-50296`, :cve_nist:`2024-50299`,
|
||||
:cve_nist:`2024-50301`, :cve_nist:`2024-50302`, :cve_nist:`2024-53042`, :cve_nist:`2024-53052`,
|
||||
:cve_nist:`2024-53057`, :cve_nist:`2024-53059`, :cve_nist:`2024-53060`, :cve_nist:`2024-53061`,
|
||||
:cve_nist:`2024-53063`, :cve_nist:`2024-53066`, :cve_nist:`2024-53096`, :cve_nist:`2024-53097`,
|
||||
:cve_nist:`2024-53101`, :cve_nist:`2024-53103`, :cve_nist:`2024-53104`, :cve_nist:`2024-53145`,
|
||||
:cve_nist:`2024-53146`, :cve_nist:`2024-53150`, :cve_nist:`2024-53155`, :cve_nist:`2024-53156`,
|
||||
:cve_nist:`2024-53157`, :cve_nist:`2024-53161`, :cve_nist:`2024-53165`, :cve_nist:`2024-53171`,
|
||||
:cve_nist:`2024-53173`, :cve_nist:`2024-53174`, :cve_nist:`2024-53194`, :cve_nist:`2024-53197`,
|
||||
:cve_nist:`2024-53217`, :cve_nist:`2024-53226`, :cve_nist:`2024-53227`, :cve_nist:`2024-53237`,
|
||||
:cve_nist:`2024-53239`, :cve_nist:`2024-55916`, :cve_nist:`2024-56548`, :cve_nist:`2024-56558`,
|
||||
:cve_nist:`2024-56567`, :cve_nist:`2024-56568`, :cve_nist:`2024-56569`, :cve_nist:`2024-56572`,
|
||||
:cve_nist:`2024-56574`, :cve_nist:`2024-56581`, :cve_nist:`2024-56587`, :cve_nist:`2024-56593`,
|
||||
:cve_nist:`2024-56595`, :cve_nist:`2024-56596`, :cve_nist:`2024-56598`, :cve_nist:`2024-56600`,
|
||||
:cve_nist:`2024-56601`, :cve_nist:`2024-56602`, :cve_nist:`2024-56603`, :cve_nist:`2024-56605`,
|
||||
:cve_nist:`2024-56606`, :cve_nist:`2024-56615`, :cve_nist:`2024-56619`, :cve_nist:`2024-56623`,
|
||||
:cve_nist:`2024-56629`, :cve_nist:`2024-56634`, :cve_nist:`2024-56642`, :cve_nist:`2024-56643`,
|
||||
:cve_nist:`2024-56648`, :cve_nist:`2024-56650`, :cve_nist:`2024-56659`, :cve_nist:`2024-56662`,
|
||||
:cve_nist:`2024-56670`, :cve_nist:`2024-56688`, :cve_nist:`2024-56698`, :cve_nist:`2024-56704`,
|
||||
:cve_nist:`2024-56716`, :cve_nist:`2024-56720`, :cve_nist:`2024-56723`, :cve_nist:`2024-56724`,
|
||||
:cve_nist:`2024-56728`, :cve_nist:`2024-56739`, :cve_nist:`2024-56746`, :cve_nist:`2024-56747`,
|
||||
:cve_nist:`2024-56748`, :cve_nist:`2024-56754`, :cve_nist:`2024-56756`, :cve_nist:`2024-56770`,
|
||||
:cve_nist:`2024-56779`, :cve_nist:`2024-56780`, :cve_nist:`2024-56781`, :cve_nist:`2024-56785`,
|
||||
:cve_nist:`2024-57802`, :cve_nist:`2024-57807`, :cve_nist:`2024-57850`, :cve_nist:`2024-57874`,
|
||||
:cve_nist:`2024-57890`, :cve_nist:`2024-57896`, :cve_nist:`2024-57900`, :cve_nist:`2024-57901`,
|
||||
:cve_nist:`2024-57902`, :cve_nist:`2024-57910`, :cve_nist:`2024-57911`, :cve_nist:`2024-57913`,
|
||||
:cve_nist:`2024-57922`, :cve_nist:`2024-57938`, :cve_nist:`2024-57939`, :cve_nist:`2024-57946`,
|
||||
:cve_nist:`2024-57951`, :cve_nist:`2025-21638`, :cve_nist:`2025-21687`, :cve_nist:`2025-21689`,
|
||||
:cve_nist:`2025-21692`, :cve_nist:`2025-21694`, :cve_nist:`2025-21697` and :cve_nist:`2025-21699`
|
||||
- linux-yocto/5.15: Fix :cve_nist:`2024-57979`, :cve_nist:`2024-58034`, :cve_nist:`2024-58052`,
|
||||
:cve_nist:`2024-58055`, :cve_nist:`2024-58058`, :cve_nist:`2024-58063`, :cve_nist:`2024-58069`,
|
||||
:cve_nist:`2024-58071`, :cve_nist:`2024-58076`, :cve_nist:`2024-58083`, :cve_nist:`2025-21700`,
|
||||
:cve_nist:`2025-21703`, :cve_nist:`2025-21715`, :cve_nist:`2025-21722`, :cve_nist:`2025-21727`,
|
||||
:cve_nist:`2025-21731`, :cve_nist:`2025-21753`, :cve_nist:`2025-21756`, :cve_nist:`2025-21760`,
|
||||
:cve_nist:`2025-21761`, :cve_nist:`2025-21762`, :cve_nist:`2025-21763`, :cve_nist:`2025-21764`,
|
||||
:cve_nist:`2025-21796`, :cve_nist:`2025-21811`, :cve_nist:`2025-21887`, :cve_nist:`2025-21898`,
|
||||
:cve_nist:`2025-21904`, :cve_nist:`2025-21905`, :cve_nist:`2025-21912`, :cve_nist:`2025-21917`,
|
||||
:cve_nist:`2025-21919`, :cve_nist:`2025-21920`, :cve_nist:`2025-21922`, :cve_nist:`2025-21934`,
|
||||
:cve_nist:`2025-21943`, :cve_nist:`2025-21948` and :cve_nist:`2025-21951`
|
||||
- libpcre2: Ignore :cve_nist:`2022-1586`
|
||||
- libtasn1: Fix :cve_nist:`2024-12133`
|
||||
- libxml2: Fix :cve_nist:`2022-49043`, :cve_nist:`2024-56171`, :cve_nist:`2025-24928` and
|
||||
:cve_nist:`2025-27113`
|
||||
- libxslt: Fix :cve_nist:`2024-55549` and :cve_nist:`2025-24855`
|
||||
- llvm: Fix :cve_nist:`2024-0151`
|
||||
- mpg123: Fix :cve_nist:`2024-10573`
|
||||
- openssh: Fix :cve_nist:`2025-26465`
|
||||
- ovmf: Revert Fix for CVE-2023-45236 :cve_nist:`2023-45237`
|
||||
- perl: Ignore :cve_nist:`2023-47038`
|
||||
- puzzles: Ignore :cve_nist:`2024-13769`, :cve_nist:`2024-13770` and :cve_nist:`2025-0837`
|
||||
- python3: Fix :cve_nist:`2025-0938`
|
||||
- ruby: Fix :cve_nist:`2024-41946`, :cve_nist:`2025-27219` and :cve_nist:`2025-27220`
|
||||
- subversion: Ignore :cve_nist:`2024-45720`
|
||||
- systemd: Fix :cve_nist:`2022-3821`, :cve_nist:`2022-4415`, :cve_nist:`2022-45873` and
|
||||
:cve_nist:`2023-7008`
|
||||
- tiff: mark :cve_nist:`2023-30774` as patched with existing patch
|
||||
- u-boot: Fix :cve_nist:`2022-2347`, :cve_nist:`2022-30767`, :cve_nist:`2022-30790`,
|
||||
:cve_nist:`2024-57254`, :cve_nist:`2024-57255`, :cve_nist:`2024-57256`, :cve_nist:`2024-57257`,
|
||||
:cve_nist:`2024-57258` and :cve_nist:`2024-57259`
|
||||
- vim: Fix :cve_nist:`2025-1215`, :cve_nist:`2025-22134`, :cve_nist:`2025-24014`,
|
||||
:cve_nist:`2025-26603`, :cve_nist:`2025-27423` and :cve_nist:`2025-29768`
|
||||
- xserver-xorg: Fix :cve_nist:`2022-49737`, :cve_nist:`2025-26594`, :cve_nist:`2025-26595`,
|
||||
:cve_nist:`2025-26596`, :cve_nist:`2025-26597`, :cve_nist:`2025-26598`, :cve_nist:`2025-26599`,
|
||||
:cve_nist:`2025-26600` and :cve_nist:`2025-26601`
|
||||
- xwayland: Fix :cve_nist:`2022-49737`, :cve_nist:`2024-9632`, :cve_nist:`2024-21885`,
|
||||
:cve_nist:`2024-21886`, :cve_nist:`2024-31080`, :cve_nist:`2024-31081`, :cve_nist:`2024-31083`,
|
||||
:cve_nist:`2025-26594`, :cve_nist:`2025-26595`, :cve_nist:`2025-26596`, :cve_nist:`2025-26597`,
|
||||
:cve_nist:`2025-26598`, :cve_nist:`2025-26599`, :cve_nist:`2025-26600` and :cve_nist:`2025-26601`
|
||||
- zlib: Fix :cve_nist:`2014-9485`
|
||||
|
||||
|
||||
|
||||
Fixes in Yocto-4.0.26
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- bind: Upgrade to 9.18.33
|
||||
- bitbake: cache: bump cache version
|
||||
- bitbake: siggen.py: Improve taskhash reproducibility
|
||||
- boost: fix do_fetch error
|
||||
- build-appliance-image: Update to kirkstone head revision
|
||||
- contributor-guide/submit-changes: add policy on AI generated code
|
||||
- cve-update-nvd2-native: handle missing vulnStatus
|
||||
- docs: Add favicon for the documentation html
|
||||
- docs: Remove all mention of core-image-lsb
|
||||
- libtasn1: upgrade to 4.20.0
|
||||
- libxcrypt-compat: Remove libcrypt.so to fix conflict with libcrypt
|
||||
- libxml2: fix compilation of explicit child axis in pattern
|
||||
- linux-yocto/5.10: update to v5.10.234
|
||||
- linux-yocto/5.15: update to v5.15.179
|
||||
- mesa: Fix missing GLES3 headers in SDK sysroot
|
||||
- mesa: Update :term:`SRC_URI`
|
||||
- meta: Enable '-o pipefail' for the SDK installer
|
||||
- migration-guides: add release notes for 4.0.25
|
||||
- poky.conf: add ubuntu2404 to :term:`SANITY_TESTED_DISTROS`
|
||||
- poky.conf: bump version for 4.0.26
|
||||
- procps: replaced one use of fputs(3) with a write(2) call
|
||||
- ref-manual: don't refer to poky-lsb
|
||||
- scripts/install-buildtools: Update to 4.0.24
|
||||
- scritps/runqemu: Ensure we only have two serial ports
|
||||
- systemd: upgrade to 250.14
|
||||
- tzcode-native: Fix compiler setting from 2023d version
|
||||
- tzcode: Update :term:`SRC_URI`
|
||||
- tzdata/tzcode-native: upgrade 2025a
|
||||
- vim: Upgrade to 9.1.1198
|
||||
- virglrenderer: fix do_fetch error
|
||||
- vulnerabilities/classes: remove references to cve-check text format
|
||||
- xz: Update :term:`SRC_URI`
|
||||
- yocto-uninative: Update to 4.7 for glibc 2.41
|
||||
|
||||
|
||||
Known Issues in Yocto-4.0.26
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- N/A
|
||||
|
||||
|
||||
Contributors to Yocto-4.0.26
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Thanks to the following people who contributed to this release:
|
||||
|
||||
- Aleksandar Nikolic
|
||||
- Alessio Cascone
|
||||
- Antonin Godard
|
||||
- Archana Polampalli
|
||||
- Ashish Sharma
|
||||
- Bruce Ashfield
|
||||
- Carlos Dominguez
|
||||
- Deepesh Varatharajan
|
||||
- Divya Chellam
|
||||
- Guocai He
|
||||
- Hitendra Prajapati
|
||||
- Hongxu Jia
|
||||
- Jiaying Song
|
||||
- Johannes Kauffmann
|
||||
- Kai Kang
|
||||
- Lee Chee Yang
|
||||
- Libo Chen
|
||||
- Marta Rybczynska
|
||||
- Michael Halstead
|
||||
- Mingli Yu
|
||||
- Moritz Haase
|
||||
- Narpat Mali
|
||||
- Paulo Neves
|
||||
- Peter Marko
|
||||
- Priyal Doshi
|
||||
- Richard Purdie
|
||||
- Robert Yang
|
||||
- Ross Burton
|
||||
- Sakib Sajal
|
||||
- Steve Sakoman
|
||||
- Vijay Anusuri
|
||||
- Yogita Urade
|
||||
- Zhang Peng
|
||||
|
||||
|
||||
Repositories / Downloads for Yocto-4.0.26
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
poky
|
||||
|
||||
- Repository Location: :yocto_git:`/poky`
|
||||
- Branch: :yocto_git:`kirkstone </poky/log/?h=kirkstone>`
|
||||
- Tag: :yocto_git:`yocto-4.0.26 </poky/log/?h=yocto-4.0.26>`
|
||||
- Git Revision: :yocto_git:`d70d287a77d5026b698ac237ab865b2dafd36bb8 </poky/commit/?id=d70d287a77d5026b698ac237ab865b2dafd36bb8>`
|
||||
- Release Artefact: poky-d70d287a77d5026b698ac237ab865b2dafd36bb8
|
||||
- sha: 3ebfadb8bff4c1ca12b3cf3e4ef6e3ac2ce52b73570266daa98436c9959249f2
|
||||
- Download Locations:
|
||||
https://downloads.yoctoproject.org/releases/yocto/yocto-4.0.26/poky-d70d287a77d5026b698ac237ab865b2dafd36bb8.tar.bz2
|
||||
https://mirrors.kernel.org/yocto/yocto/yocto-4.0.26/poky-d70d287a77d5026b698ac237ab865b2dafd36bb8.tar.bz2
|
||||
|
||||
openembedded-core
|
||||
|
||||
- Repository Location: :oe_git:`/openembedded-core`
|
||||
- Branch: :oe_git:`kirkstone </openembedded-core/log/?h=kirkstone>`
|
||||
- Tag: :oe_git:`yocto-4.0.26 </openembedded-core/log/?h=yocto-4.0.26>`
|
||||
- Git Revision: :oe_git:`1efbe1004bc82e7c14c1e8bd4ce644f5015c3346 </openembedded-core/commit/?id=1efbe1004bc82e7c14c1e8bd4ce644f5015c3346>`
|
||||
- Release Artefact: oecore-1efbe1004bc82e7c14c1e8bd4ce644f5015c3346
|
||||
- sha: d3805e034dabd0865dbf55488b2c16d4ea0351d37aa826f0054a6bfdde5a8be9
|
||||
- Download Locations:
|
||||
https://downloads.yoctoproject.org/releases/yocto/yocto-4.0.26/oecore-1efbe1004bc82e7c14c1e8bd4ce644f5015c3346.tar.bz2
|
||||
https://mirrors.kernel.org/yocto/yocto/yocto-4.0.26/oecore-1efbe1004bc82e7c14c1e8bd4ce644f5015c3346.tar.bz2
|
||||
|
||||
meta-mingw
|
||||
|
||||
- Repository Location: :yocto_git:`/meta-mingw`
|
||||
- Branch: :yocto_git:`kirkstone </meta-mingw/log/?h=kirkstone>`
|
||||
- Tag: :yocto_git:`yocto-4.0.26 </meta-mingw/log/?h=yocto-4.0.26>`
|
||||
- Git Revision: :yocto_git:`87c22abb1f11be430caf4372e6b833dc7d77564e </meta-mingw/commit/?id=87c22abb1f11be430caf4372e6b833dc7d77564e>`
|
||||
- Release Artefact: meta-mingw-87c22abb1f11be430caf4372e6b833dc7d77564e
|
||||
- sha: f0bc4873e2e0319fb9d6d6ab9b98eb3f89664d4339a167d2db6a787dd12bc1a8
|
||||
- Download Locations:
|
||||
https://downloads.yoctoproject.org/releases/yocto/yocto-4.0.26/meta-mingw-87c22abb1f11be430caf4372e6b833dc7d77564e.tar.bz2
|
||||
https://mirrors.kernel.org/yocto/yocto/yocto-4.0.26/meta-mingw-87c22abb1f11be430caf4372e6b833dc7d77564e.tar.bz2
|
||||
|
||||
meta-gplv2
|
||||
|
||||
- Repository Location: :yocto_git:`/meta-gplv2`
|
||||
- Branch: :yocto_git:`kirkstone </meta-gplv2/log/?h=kirkstone>`
|
||||
- Tag: :yocto_git:`yocto-4.0.26 </meta-gplv2/log/?h=yocto-4.0.26>`
|
||||
- Git Revision: :yocto_git:`d2f8b5cdb285b72a4ed93450f6703ca27aa42e8a </meta-gplv2/commit/?id=d2f8b5cdb285b72a4ed93450f6703ca27aa42e8a>`
|
||||
- Release Artefact: meta-gplv2-d2f8b5cdb285b72a4ed93450f6703ca27aa42e8a
|
||||
- sha: c386f59f8a672747dc3d0be1d4234b6039273d0e57933eb87caa20f56b9cca6d
|
||||
- Download Locations:
|
||||
https://downloads.yoctoproject.org/releases/yocto/yocto-4.0.26/meta-gplv2-d2f8b5cdb285b72a4ed93450f6703ca27aa42e8a.tar.bz2
|
||||
https://mirrors.kernel.org/yocto/yocto/yocto-4.0.26/meta-gplv2-d2f8b5cdb285b72a4ed93450f6703ca27aa42e8a.tar.bz2
|
||||
|
||||
bitbake
|
||||
|
||||
- Repository Location: :oe_git:`/bitbake`
|
||||
- Branch: :oe_git:`2.0 </bitbake/log/?h=2.0>`
|
||||
- Tag: :oe_git:`yocto-4.0.26 </bitbake/log/?h=yocto-4.0.26>`
|
||||
- Git Revision: :oe_git:`046871d9fd76efdca7b72718b328d8f545523f7e </bitbake/commit/?id=046871d9fd76efdca7b72718b328d8f545523f7e>`
|
||||
- Release Artefact: bitbake-046871d9fd76efdca7b72718b328d8f545523f7e
|
||||
- sha: e9df0a9f5921b583b539188d66b23f120e1751000e7822e76c3391d5c76ee21a
|
||||
- Download Locations:
|
||||
https://downloads.yoctoproject.org/releases/yocto/yocto-4.0.26/bitbake-046871d9fd76efdca7b72718b328d8f545523f7e.tar.bz2
|
||||
https://mirrors.kernel.org/yocto/yocto/yocto-4.0.26/bitbake-046871d9fd76efdca7b72718b328d8f545523f7e.tar.bz2
|
||||
|
||||
yocto-docs
|
||||
|
||||
- Repository Location: :yocto_git:`/yocto-docs`
|
||||
- Branch: :yocto_git:`kirkstone </yocto-docs/log/?h=kirkstone>`
|
||||
- Tag: :yocto_git:`yocto-4.0.26 </yocto-docs/log/?h=yocto-4.0.26>`
|
||||
- Git Revision: :yocto_git:`9b4c36f7b02dd4bedfec90206744a1e90e37733c </yocto-docs/commit/?id=9b4c36f7b02dd4bedfec90206744a1e90e37733c>`
|
||||
|
||||
153
documentation/migration-guides/release-notes-4.0.27.rst
Normal file
153
documentation/migration-guides/release-notes-4.0.27.rst
Normal file
@@ -0,0 +1,153 @@
|
||||
Release notes for Yocto-4.0.27 (Kirkstone)
|
||||
------------------------------------------
|
||||
|
||||
Security Fixes in Yocto-4.0.27
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- binutils: Fix :cve_nist:`2025-1178`
|
||||
- busybox: fix :cve_nist:`2023-39810`
|
||||
- connman :fix :cve_nist:`2025-32743`
|
||||
- curl: Ignore :cve_nist:`2025-0725`
|
||||
- ghostscript: Fix :cve_nist:`2025-27830`, :cve_nist:`2025-27831`, :cve_nist:`2025-27832`,
|
||||
:cve_nist:`2025-27834`, :cve_nist:`2025-27835` and :cve_nist:`2025-27836`
|
||||
- ghostscript: Ignore :cve_nist:`2024-29507`, :cve_nist:`2025-27833` and :cve_nist:`2025-27837`
|
||||
- glib-2.0: Fix :cve_nist:`2025-3360`
|
||||
- go: Fix :cve_nist:`2025-22871`
|
||||
- libarchive: Ignore :cve_nist:`2024-48615`
|
||||
- libpam: Fix :cve_nist:`2024-10041`
|
||||
- libsoup-2.4: Fix :cve_nist:`2024-52532`, :cve_nist:`2025-32906` and :cve_nist:`2025-32909`
|
||||
- libsoup: Fix :cve_nist:`2024-52532`, :cve_nist:`2025-32906`, :cve_nist:`2025-32909`,
|
||||
:cve_nist:`2025-32910`, :cve_nist:`2025-32911`, :cve_nist:`2025-32912`, :cve_nist:`2025-32913`
|
||||
and :cve_nist:`2025-32914`
|
||||
- libxml2: Fix :cve_nist:`2025-32414` and :cve_nist:`2025-32415`
|
||||
- ofono: Fix :cve_nist:`2024-7537`
|
||||
- perl: Fix :cve_nist:`2024-56406`
|
||||
- ppp: Fix :cve_nist:`2024-58250`
|
||||
- python3-setuptools: Fix :cve_nist:`2024-6345`
|
||||
- qemu: Ignore :cve_nist:`2023-1386`
|
||||
- ruby: Fix :cve_nist:`2024-43398`
|
||||
- sqlite3: Fix :cve_nist:`2025-29088`
|
||||
- systemd: Ignore :cve_nist:`2022-3821`, :cve_nist:`2022-4415` and :cve_nist:`2022-45873`
|
||||
|
||||
|
||||
Fixes in Yocto-4.0.27
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- Revert "cve-update-nvd2-native: Tweak to work better with NFS DL_DIR"
|
||||
- build-appliance-image: Update to kirkstone head revision
|
||||
- cve-update-nvd2-native: add workaround for json5 style list
|
||||
- docs: Fix dead links that use the :term:`DISTRO` macro
|
||||
- docs: manuals: remove repeated word
|
||||
- docs: poky.yaml: introduce DISTRO_LATEST_TAG
|
||||
- glibc: Add single-threaded fast path to rand()
|
||||
- glibc: stable 2.35 branch updates
|
||||
- module.bbclass: add KBUILD_EXTRA_SYMBOLS to install
|
||||
- perl: enable _GNU_SOURCE define via d_gnulibc
|
||||
- poky.conf: bump version for 4.0.27
|
||||
- ref-manual/variables.rst: document autotools class related variables
|
||||
- scripts/install-buildtools: Update to 4.0.26
|
||||
- systemd: backport patch to fix journal issue
|
||||
- systemd: systemd-journald fails to setup LogNamespace
|
||||
- tzdata/tzcode-native: upgrade to 2025b
|
||||
|
||||
|
||||
Known Issues in Yocto-4.0.27
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- N/A
|
||||
|
||||
|
||||
Contributors to Yocto-4.0.27
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- Aleksandar Nikolic
|
||||
- Alexander Kanavin
|
||||
- Alon Bar-Lev
|
||||
- Andrew Kreimer
|
||||
- Antonin Godard
|
||||
- Chen Qi
|
||||
- Deepesh Varatharajan
|
||||
- Divya Chellam
|
||||
- Haitao Liu
|
||||
- Haixiao Yan
|
||||
- Hitendra Prajapati
|
||||
- Peter Marko
|
||||
- Praveen Kumar
|
||||
- Priyal Doshi
|
||||
- Shubham Kulkarni
|
||||
- Soumya Sambu
|
||||
- Steve Sakoman
|
||||
- Vijay Anusuri
|
||||
- Yogita Urade
|
||||
|
||||
|
||||
Repositories / Downloads for Yocto-4.0.27
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
poky
|
||||
|
||||
- Repository Location: :yocto_git:`/poky`
|
||||
- Branch: :yocto_git:`kirkstone </poky/log/?h=kirkstone>`
|
||||
- Tag: :yocto_git:`yocto-4.0.27 </poky/log/?h=yocto-4.0.27>`
|
||||
- Git Revision: :yocto_git:`ab9a994a8cd8e06b519a693db444030999d273b7 </poky/commit/?id=ab9a994a8cd8e06b519a693db444030999d273b7>`
|
||||
- Release Artefact: poky-ab9a994a8cd8e06b519a693db444030999d273b7
|
||||
- sha: 77a366c17cf29eef15c6ff3f44e73f81c07288c723fd4a6dbd8c7ee9b79933f3
|
||||
- Download Locations:
|
||||
https://downloads.yoctoproject.org/releases/yocto/yocto-4.0.27/poky-ab9a994a8cd8e06b519a693db444030999d273b7.tar.bz2
|
||||
https://mirrors.kernel.org/yocto/yocto/yocto-4.0.27/poky-ab9a994a8cd8e06b519a693db444030999d273b7.tar.bz2
|
||||
|
||||
openembedded-core
|
||||
|
||||
- Repository Location: :oe_git:`/openembedded-core`
|
||||
- Branch: :oe_git:`kirkstone </openembedded-core/log/?h=kirkstone>`
|
||||
- Tag: :oe_git:`yocto-4.0.27 </openembedded-core/log/?h=yocto-4.0.27>`
|
||||
- Git Revision: :oe_git:`e8be08a624b2d024715a5c8b0c37f2345a02336b </openembedded-core/commit/?id=e8be08a624b2d024715a5c8b0c37f2345a02336b>`
|
||||
- Release Artefact: oecore-e8be08a624b2d024715a5c8b0c37f2345a02336b
|
||||
- sha: cc5b0fadab021c6dc61f37fc4ff01a1cf657e7c219488ce264bede42f7f6212f
|
||||
- Download Locations:
|
||||
https://downloads.yoctoproject.org/releases/yocto/yocto-4.0.27/oecore-e8be08a624b2d024715a5c8b0c37f2345a02336b.tar.bz2
|
||||
https://mirrors.kernel.org/yocto/yocto/yocto-4.0.27/oecore-e8be08a624b2d024715a5c8b0c37f2345a02336b.tar.bz2
|
||||
|
||||
meta-mingw
|
||||
|
||||
- Repository Location: :yocto_git:`/meta-mingw`
|
||||
- Branch: :yocto_git:`kirkstone </meta-mingw/log/?h=kirkstone>`
|
||||
- Tag: :yocto_git:`yocto-4.0.27 </meta-mingw/log/?h=yocto-4.0.27>`
|
||||
- Git Revision: :yocto_git:`87c22abb1f11be430caf4372e6b833dc7d77564e </meta-mingw/commit/?id=87c22abb1f11be430caf4372e6b833dc7d77564e>`
|
||||
- Release Artefact: meta-mingw-87c22abb1f11be430caf4372e6b833dc7d77564e
|
||||
- sha: f0bc4873e2e0319fb9d6d6ab9b98eb3f89664d4339a167d2db6a787dd12bc1a8
|
||||
- Download Locations:
|
||||
https://downloads.yoctoproject.org/releases/yocto/yocto-4.0.27/meta-mingw-87c22abb1f11be430caf4372e6b833dc7d77564e.tar.bz2
|
||||
https://mirrors.kernel.org/yocto/yocto/yocto-4.0.27/meta-mingw-87c22abb1f11be430caf4372e6b833dc7d77564e.tar.bz2
|
||||
|
||||
meta-gplv2
|
||||
|
||||
- Repository Location: :yocto_git:`/meta-gplv2`
|
||||
- Branch: :yocto_git:`kirkstone </meta-gplv2/log/?h=kirkstone>`
|
||||
- Tag: :yocto_git:`yocto-4.0.27 </meta-gplv2/log/?h=yocto-4.0.27>`
|
||||
- Git Revision: :yocto_git:`d2f8b5cdb285b72a4ed93450f6703ca27aa42e8a </meta-gplv2/commit/?id=d2f8b5cdb285b72a4ed93450f6703ca27aa42e8a>`
|
||||
- Release Artefact: meta-gplv2-d2f8b5cdb285b72a4ed93450f6703ca27aa42e8a
|
||||
- sha: c386f59f8a672747dc3d0be1d4234b6039273d0e57933eb87caa20f56b9cca6d
|
||||
- Download Locations:
|
||||
https://downloads.yoctoproject.org/releases/yocto/yocto-4.0.27/meta-gplv2-d2f8b5cdb285b72a4ed93450f6703ca27aa42e8a.tar.bz2
|
||||
https://mirrors.kernel.org/yocto/yocto/yocto-4.0.27/meta-gplv2-d2f8b5cdb285b72a4ed93450f6703ca27aa42e8a.tar.bz2
|
||||
|
||||
bitbake
|
||||
|
||||
- Repository Location: :oe_git:`/bitbake`
|
||||
- Branch: :oe_git:`2.0 </bitbake/log/?h=2.0>`
|
||||
- Tag: :oe_git:`yocto-4.0.27 </bitbake/log/?h=yocto-4.0.27>`
|
||||
- Git Revision: :oe_git:`046871d9fd76efdca7b72718b328d8f545523f7e </bitbake/commit/?id=046871d9fd76efdca7b72718b328d8f545523f7e>`
|
||||
- Release Artefact: bitbake-046871d9fd76efdca7b72718b328d8f545523f7e
|
||||
- sha: e9df0a9f5921b583b539188d66b23f120e1751000e7822e76c3391d5c76ee21a
|
||||
- Download Locations:
|
||||
https://downloads.yoctoproject.org/releases/yocto/yocto-4.0.27/bitbake-046871d9fd76efdca7b72718b328d8f545523f7e.tar.bz2
|
||||
https://mirrors.kernel.org/yocto/yocto/yocto-4.0.27/bitbake-046871d9fd76efdca7b72718b328d8f545523f7e.tar.bz2
|
||||
|
||||
yocto-docs
|
||||
|
||||
- Repository Location: :yocto_git:`/yocto-docs`
|
||||
- Branch: :yocto_git:`kirkstone </yocto-docs/log/?h=kirkstone>`
|
||||
- Tag: :yocto_git:`yocto-4.0.27 </yocto-docs/log/?h=yocto-4.0.27>`
|
||||
- Git Revision: :yocto_git:`0d51e553d5f83eea6634e03ddc9c7740bf72fcea </yocto-docs/commit/?id=0d51e553d5f83eea6634e03ddc9c7740bf72fcea>`
|
||||
|
||||
@@ -983,7 +983,7 @@ package.
|
||||
|
||||
For more information on the ``oe-pkgdata-util`` utility, see the section
|
||||
:ref:`dev-manual/debugging:Viewing Package Information with
|
||||
\`\`oe-pkgdata-util\`\`` of the Yocto Project Development Tasks Manual.
|
||||
``oe-pkgdata-util``` of the Yocto Project Development Tasks Manual.
|
||||
|
||||
To add a custom package variant of the ``${PN}`` recipe named
|
||||
``${PN}-extra`` (name is arbitrary), one can add it to the
|
||||
|
||||
@@ -1855,7 +1855,8 @@ a couple different ways:
|
||||
Not using this naming convention can lead to subtle problems
|
||||
caused by existing code that depends on that naming convention.
|
||||
|
||||
- Create or modify a target recipe that contains the following::
|
||||
- Or, create a :ref:`ref-classes-native` variant of any target recipe (e.g.
|
||||
``myrecipe.bb``) by adding the following to the recipe::
|
||||
|
||||
BBCLASSEXTEND = "native"
|
||||
|
||||
@@ -1886,7 +1887,18 @@ couple different ways:
|
||||
inherit statement in the recipe after all other inherit statements so
|
||||
that the :ref:`ref-classes-nativesdk` class is inherited last.
|
||||
|
||||
- Create a :ref:`ref-classes-nativesdk` variant of any recipe by adding the following::
|
||||
.. note::
|
||||
|
||||
When creating a recipe, you must follow this naming convention::
|
||||
|
||||
nativesdk-myrecipe.bb
|
||||
|
||||
|
||||
Not doing so can lead to subtle problems because there is code that
|
||||
depends on the naming convention.
|
||||
|
||||
- Or, create a :ref:`ref-classes-nativesdk` variant of any target recipe (e.g.
|
||||
``myrecipe.bb``) by adding the following to the recipe::
|
||||
|
||||
BBCLASSEXTEND = "nativesdk"
|
||||
|
||||
@@ -1895,16 +1907,6 @@ couple different ways:
|
||||
specify any functionality specific to the respective SDK machine or
|
||||
target case.
|
||||
|
||||
.. note::
|
||||
|
||||
When creating a recipe, you must follow this naming convention::
|
||||
|
||||
nativesdk-myrecipe.bb
|
||||
|
||||
|
||||
Not doing so can lead to subtle problems because there is code that
|
||||
depends on the naming convention.
|
||||
|
||||
Although applied differently, the :ref:`ref-classes-nativesdk` class is used with both
|
||||
methods. The advantage of the second method is that you do not need to
|
||||
have two separate recipes (assuming you need both) for the SDK machine
|
||||
|
||||
@@ -432,7 +432,7 @@ You can read more on the ``devtool upgrade`` workflow in the
|
||||
":ref:`sdk-manual/extensible:use \`\`devtool upgrade\`\` to create a version of the recipe that supports a newer version of the software`"
|
||||
section in the Yocto Project Application Development and the Extensible
|
||||
Software Development Kit (eSDK) manual. You can also see an example of
|
||||
how to use ``devtool upgrade`` in the ":ref:`dev-manual/upgrading-recipes:using \`\`devtool upgrade\`\``"
|
||||
how to use ``devtool upgrade`` in the ":ref:`dev-manual/upgrading-recipes:using ``devtool upgrade```"
|
||||
section in the Yocto Project Development Tasks Manual.
|
||||
|
||||
.. _devtool-resetting-a-recipe:
|
||||
|
||||
@@ -498,7 +498,7 @@ generated during the :ref:`ref-tasks-packagedata` task. The files stored in this
|
||||
directory contain information about each output package produced by the
|
||||
OpenEmbedded build system, and are used in different ways by the build system
|
||||
such as ":ref:`dev-manual/debugging:viewing package information with
|
||||
\`\`oe-pkgdata-util\`\``".
|
||||
``oe-pkgdata-util```".
|
||||
|
||||
.. _structure-build-tmp-sstate-control:
|
||||
|
||||
|
||||
@@ -2,11 +2,11 @@
|
||||
<svg
|
||||
version="1.1"
|
||||
id="svg2"
|
||||
width="1523.001"
|
||||
height="504.30499"
|
||||
viewBox="0 0 1523.001 504.30497"
|
||||
width="1992.7236"
|
||||
height="613.35602"
|
||||
viewBox="0 0 1992.7236 613.35599"
|
||||
sodipodi:docname="releases.svg"
|
||||
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)"
|
||||
inkscape:version="1.4.1 (93de688d07, 2025-03-30)"
|
||||
inkscape:export-filename="../../../../../../../../tmp/releases.png"
|
||||
inkscape:export-xdpi="96"
|
||||
inkscape:export-ydpi="96"
|
||||
@@ -70,7 +70,7 @@
|
||||
scale_width="1"
|
||||
end_linecap_type="zerowidth"
|
||||
not_jump="false"
|
||||
message="<b>Ctrl + click</b> on existing node and move it" />
|
||||
message="" />
|
||||
<marker
|
||||
style="overflow:visible"
|
||||
id="marker5783"
|
||||
@@ -412,9 +412,9 @@
|
||||
inkscape:window-height="2069"
|
||||
id="namedview4"
|
||||
showgrid="true"
|
||||
inkscape:zoom="2.1971372"
|
||||
inkscape:cx="1068.2082"
|
||||
inkscape:cy="287.87461"
|
||||
inkscape:zoom="1.5536106"
|
||||
inkscape:cx="1158.2696"
|
||||
inkscape:cy="273.55632"
|
||||
inkscape:window-x="2256"
|
||||
inkscape:window-y="60"
|
||||
inkscape:window-maximized="1"
|
||||
@@ -433,8 +433,8 @@
|
||||
<inkscape:grid
|
||||
type="xygrid"
|
||||
id="grid1257"
|
||||
originx="-289.99936"
|
||||
originy="369.99997"
|
||||
originx="-289.06071"
|
||||
originy="478.43017"
|
||||
spacingy="1"
|
||||
spacingx="1"
|
||||
units="px"
|
||||
@@ -444,66 +444,90 @@
|
||||
inkscape:groupmode="layer"
|
||||
inkscape:label="Image"
|
||||
id="g10"
|
||||
transform="translate(-289.99936,370.00003)">
|
||||
transform="translate(-289.06072,478.43022)">
|
||||
<rect
|
||||
style="fill:#333333;fill-opacity:0;stroke:#000000;stroke-width:0.713896;stroke-linejoin:bevel;stroke-miterlimit:0;stroke-opacity:0"
|
||||
id="rect1"
|
||||
width="1992.0098"
|
||||
height="612.64215"
|
||||
x="289.41766"
|
||||
y="-478.07327"
|
||||
ry="24.97636" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.449183;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 563.40434,64.000628 v -415.635938 0 0"
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.50455;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 563.40434,64.000628 v -524.414808 0 0"
|
||||
id="path207708" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.449183;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 683.40434,64.000628 v -415.635938 0 0"
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.50455;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 683.40434,64.000628 v -524.414808 0 0"
|
||||
id="path207708-4" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.449183;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 803.40434,64.000628 v -415.635938 0 0"
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.50455;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 803.40434,64.000628 v -524.414808 0 0"
|
||||
id="path207708-4-3" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.449183;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 923.40434,64.000588 v -415.635898 0 0"
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.50455;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 923.40434,64.000577 v -524.414757 0 0"
|
||||
id="path207708-4-3-6" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.449183;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1043.4043,64.000588 v -415.635898 0 0"
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.50455;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1043.4043,64.000577 v -524.414757 0 0"
|
||||
id="path207708-4-3-6-2" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.449183;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1163.4043,64.000588 v -415.635898 0 0"
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.50455;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1163.4043,64.000577 v -524.414757 0 0"
|
||||
id="path207708-4-3-6-2-8" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.449183;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1283.4043,64.000588 v -415.635898 0 0"
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.50455;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1283.4043,64.000577 v -524.414757 0 0"
|
||||
id="path207708-4-3-6-2-8-4" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.449183;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1403.4043,64.000588 v -415.635898 0 0"
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.50455;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1403.4043,64.000577 v -524.414757 0 0"
|
||||
id="path207708-4-3-6-2-8-4-3" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.475347;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1523.4043,64.000568 v -415.757648 0 0"
|
||||
id="path207708-4-3-6-2-8-4-3-8" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.449183;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1523.4043,64.000588 v -415.635898 0 0"
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.50455;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1523.4043,64.000577 v -524.414757 0 0"
|
||||
id="path207708-4-3-6-2-8-4-3-8-0" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.449183;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1643.3583,64.000578 v -415.635868 0 0"
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.50455;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1643.3583,64.000565 v -524.414715 0 0"
|
||||
id="path207708-4-3-6-2-8-4-3-8-4" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.449183;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1763.4043,64.000578 v -415.635868 0 0"
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.50455;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1763.4043,64.000565 v -524.414715 0 0"
|
||||
id="path207708-4-3-6-2-8-4-3-8-4-0" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.449183;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 443.40434,64.000628 v -415.635938 0 0"
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.50455;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1883.7877,64.878769 v -524.414709 0 0"
|
||||
id="path207708-4-3-6-2-8-4-3-8-4-0-8" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.50455;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 2002.9599,64.984489 v -524.414709 0 0"
|
||||
id="path207708-4-3-6-2-8-4-3-8-4-0-8-8" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.50455;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 2123.2232,62.984489 v -524.414709 0 0"
|
||||
id="path207708-4-3-6-2-8-4-3-8-4-0-8-8-1" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.50455;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 2243.313,63.984489 v -524.414709 0 0"
|
||||
id="path207708-4-3-6-2-8-4-3-8-4-0-8-8-1-9" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.50455;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 443.40434,64.000628 v -524.414808 0 0"
|
||||
id="path207708-9" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 323.40434,64.000608 v -375.000008 0 0"
|
||||
id="path207708-9-6" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.449183;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 323.40434,64.000618 v -415.635908 0 0"
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:0.50455;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 323.40434,64.000616 v -524.414766 0 0"
|
||||
id="path207708-9-6-2" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
@@ -536,7 +560,7 @@
|
||||
x="-59.575905"
|
||||
y="580.05695" /></text>
|
||||
<rect
|
||||
style="fill:#333333;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-opacity:1;opacity:0.5"
|
||||
style="opacity:0.5;fill:#333333;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-opacity:1"
|
||||
id="rect917-0-0-4-4-9-4"
|
||||
width="160.00002"
|
||||
height="45.000004"
|
||||
@@ -583,14 +607,6 @@
|
||||
y="-73.501534"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:13.3333px;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans Bold';text-align:center;text-anchor:middle;fill:#fffefe;fill-opacity:1;stroke:none"
|
||||
id="tspan10317-2-9-1-4">4.2</tspan></text>
|
||||
<rect
|
||||
style="opacity:0.75;fill:#251f32;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-opacity:1"
|
||||
id="rect917-0-0-4-4-9-4-5-3-9-2-3"
|
||||
width="140"
|
||||
height="45.000004"
|
||||
x="1043.132"
|
||||
y="-328.2114"
|
||||
ry="2.2558987" />
|
||||
<rect
|
||||
style="opacity:1;fill:#333333;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-opacity:1"
|
||||
id="rect917-0-0-4-4-9-4-5-3-9-2-3-6"
|
||||
@@ -615,22 +631,78 @@
|
||||
y="-238.332"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:13.3333px;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans Bold';text-align:center;text-anchor:middle;fill:#fffefe;fill-opacity:1;stroke:none"
|
||||
id="tspan10317-2-9-1-4-6-5-6">5.1</tspan></text>
|
||||
<rect
|
||||
style="fill:#333333;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-opacity:1"
|
||||
id="rect917-0-0-4-4-9-4-5-3-9-2-3-6-2"
|
||||
width="140"
|
||||
height="45.000004"
|
||||
x="1043.4697"
|
||||
y="-328.48172"
|
||||
ry="2.2558987" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-weight:bold;font-size:13.3333px;line-height:125%;font-family:'Nimbus Roman';-inkscape-font-specification:'Nimbus Roman, Bold';letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#fffefe;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="1094.2197"
|
||||
y="-309.83084"
|
||||
id="text1185-3-55-4-0-0-0-1-1-6-4-3"><tspan
|
||||
x="1090.4542"
|
||||
y="-309.61823"
|
||||
id="text1185-3-55-4-0-0-0-1-1-6-4-7"><tspan
|
||||
sodipodi:role="line"
|
||||
x="1094.2197"
|
||||
y="-309.83084"
|
||||
x="1090.4542"
|
||||
y="-309.61823"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:13.3333px;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans Bold';text-align:center;text-anchor:middle;fill:#fffefe;fill-opacity:1;stroke:none"
|
||||
id="tspan957-2-8-6-3-9-7-4-2-0-5">Walnascar</tspan><tspan
|
||||
id="tspan957-2-8-6-3-9-7-4-2-0-0">Walnascar</tspan><tspan
|
||||
sodipodi:role="line"
|
||||
x="1094.2197"
|
||||
y="-291.83417"
|
||||
x="1090.4542"
|
||||
y="-291.62155"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:13.3333px;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans Bold';text-align:center;text-anchor:middle;fill:#fffefe;fill-opacity:1;stroke:none"
|
||||
id="tspan10317-2-9-1-4-6-5-6-6">5.2</tspan></text>
|
||||
id="tspan10317-2-9-1-4-6-5-6-9">5.2</tspan></text>
|
||||
<rect
|
||||
style="opacity:0.75;fill:#251f32;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:2;stroke-opacity:1"
|
||||
id="rect917-0-0-4-4-9-4-5-3-9-2-3-67"
|
||||
width="140"
|
||||
height="45.000004"
|
||||
x="1163.6425"
|
||||
y="-382.27469"
|
||||
ry="2.2558987" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-weight:bold;font-size:13.3333px;line-height:125%;font-family:'Nimbus Roman';-inkscape-font-specification:'Nimbus Roman, Bold';letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#fffefe;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="1214.9716"
|
||||
y="-363.89413"
|
||||
id="text1185-3-55-4-0-0-0-1-1-6-4-3-53"><tspan
|
||||
sodipodi:role="line"
|
||||
x="1214.9716"
|
||||
y="-363.89413"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:13.3333px;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans Bold';text-align:center;text-anchor:middle;fill:#fffefe;fill-opacity:1;stroke:none"
|
||||
id="tspan957-2-8-6-3-9-7-4-2-0-5-5">Whinlatter</tspan><tspan
|
||||
sodipodi:role="line"
|
||||
x="1214.9716"
|
||||
y="-345.89746"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:13.3333px;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans Bold';text-align:center;text-anchor:middle;fill:#fffefe;fill-opacity:1;stroke:none"
|
||||
id="tspan10317-2-9-1-4-6-5-6-6-6">5.3</tspan></text>
|
||||
<rect
|
||||
style="opacity:0.75;fill:#251f32;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:5.29752;stroke-opacity:1"
|
||||
id="rect917-0-0-4-4-9-4-5-3-9-2-3-67-6"
|
||||
width="982.23163"
|
||||
height="45.000004"
|
||||
x="1283.7023"
|
||||
y="-436.77539"
|
||||
ry="2.2558987" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-weight:bold;font-size:13.3333px;line-height:125%;font-family:'Nimbus Roman';-inkscape-font-specification:'Nimbus Roman, Bold';letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#fffefe;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="1335.1118"
|
||||
y="-418.39484"
|
||||
id="text1185-3-55-4-0-0-0-1-1-6-4-3-53-0"><tspan
|
||||
sodipodi:role="line"
|
||||
x="1335.1118"
|
||||
y="-418.39484"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:13.3333px;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans Bold';text-align:center;text-anchor:middle;fill:#fffefe;fill-opacity:1;stroke:none"
|
||||
id="tspan957-2-8-6-3-9-7-4-2-0-5-5-6">Wrynose</tspan><tspan
|
||||
sodipodi:role="line"
|
||||
x="1335.1118"
|
||||
y="-400.39816"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:13.3333px;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans Bold';text-align:center;text-anchor:middle;fill:#fffefe;fill-opacity:1;stroke:none"
|
||||
id="tspan10317-2-9-1-4-6-5-6-6-6-2">6.0</tspan></text>
|
||||
<g
|
||||
id="g1591"
|
||||
transform="translate(-516.59566,64.000598)">
|
||||
@@ -681,7 +753,7 @@
|
||||
id="tspan10317-2-9-0-1">5.0</tspan></text>
|
||||
<g
|
||||
id="g1125-0"
|
||||
transform="matrix(0.42240595,0,0,0.41654472,330.77064,-441.11721)"
|
||||
transform="matrix(0.42240595,0,0,0.41654472,330.77064,-497.11721)"
|
||||
style="stroke:none;stroke-width:2.38399">
|
||||
<rect
|
||||
style="opacity:1;fill:#333333;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:4.76797;stroke-opacity:1"
|
||||
@@ -923,8 +995,8 @@
|
||||
y="345.7359" /></text>
|
||||
<path
|
||||
id="path29430"
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.72671;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 307.54809,63.999718 H 1783.4043 Z" />
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1.99503;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 307.54809,63.999718 H 2277.72 Z" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 323.40434,64.000618 v 9.99995 0"
|
||||
@@ -1437,50 +1509,324 @@
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1763.4043,64.000578 v 9.99999 0"
|
||||
id="path29548-5-1-3-6-3-1-0-3-4-2-0-0" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-weight:bold;font-size:13.3333px;line-height:125%;font-family:'Nimbus Roman';-inkscape-font-specification:'Nimbus Roman, Bold';letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="1885.6029"
|
||||
y="94.285194"
|
||||
id="text1185-9-7-1-1-8-1-0-4-2-8-2"><tspan
|
||||
sodipodi:role="line"
|
||||
x="1885.6029"
|
||||
y="94.285194"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:13.3333px;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle;stroke:none"
|
||||
id="tspan31345-4-0-4-81-5-2-8">Oct.</tspan><tspan
|
||||
sodipodi:role="line"
|
||||
x="1885.6029"
|
||||
y="112.28188"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:13.3333px;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle;stroke:none"
|
||||
id="tspan49906-7-3-8-2-8-9-9">2028</tspan></text>
|
||||
<g
|
||||
id="g1267-4-5-2-7"
|
||||
transform="translate(563.45518,-155.9782)">
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1200,220.00002 v 9.99999 0"
|
||||
id="path29548-5-1-3-6-3-1-0-3-4-1-3" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1220,219.99997 v 5.00004 0"
|
||||
id="path29548-8-5-0-6-4-6-2-9-0-8-1-3-1-9-6-9-3-4-0-4-6-2-2-7-6-1-9-0-5-0-0-5-6"
|
||||
inkscape:transform-center-x="14.782001"
|
||||
inkscape:transform-center-y="-0.085282837" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1240,219.99997 v 5.00004 0"
|
||||
id="path29548-8-5-0-6-4-6-2-9-0-8-1-3-1-9-6-9-3-4-0-4-6-2-2-7-6-1-9-9-7-5-3-5-9-1"
|
||||
inkscape:transform-center-x="14.782001"
|
||||
inkscape:transform-center-y="-0.085282837" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1260,219.99997 v 5.00004 0"
|
||||
id="path29548-8-5-0-6-4-6-2-9-0-8-1-3-1-9-6-9-3-4-0-4-6-2-2-7-6-1-9-9-1-5-2-0-9-9-2"
|
||||
inkscape:transform-center-x="14.782001"
|
||||
inkscape:transform-center-y="-0.085282837" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1280,219.99997 v 5.00004 0"
|
||||
id="path29548-8-5-0-6-4-6-2-9-0-8-1-3-1-9-6-9-3-4-0-4-6-2-2-7-6-1-9-9-1-4-8-9-9-4-1-9"
|
||||
inkscape:transform-center-x="14.782001"
|
||||
inkscape:transform-center-y="-0.085282837" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1299.7216,219.99997 v 5.00004 0"
|
||||
id="path29548-8-5-0-6-4-6-2-9-0-8-1-3-1-9-6-9-3-4-0-4-6-2-2-7-6-1-9-9-1-4-9-7-0-2-6-4-3"
|
||||
inkscape:transform-center-x="-14.78205"
|
||||
inkscape:transform-center-y="-0.085282837" />
|
||||
</g>
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1883.4551,64.021829 v 9.99999 0"
|
||||
id="path29548-5-1-3-6-3-1-0-3-4-2-0-0-1" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-weight:bold;font-size:13.3333px;line-height:125%;font-family:'Nimbus Roman';-inkscape-font-specification:'Nimbus Roman, Bold';letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="2005.5908"
|
||||
y="94.339828"
|
||||
id="text1185-9-7-1-1-8-1-0-4-2-8-2-4"><tspan
|
||||
sodipodi:role="line"
|
||||
x="2005.5908"
|
||||
y="94.339828"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:13.3333px;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle;stroke:none"
|
||||
id="tspan31345-4-0-4-81-5-2-8-7">Apr.</tspan><tspan
|
||||
sodipodi:role="line"
|
||||
x="2005.5908"
|
||||
y="112.33651"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:13.3333px;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle;stroke:none"
|
||||
id="tspan49906-7-3-8-2-8-9-9-8">2029</tspan></text>
|
||||
<g
|
||||
id="g1267-4-5-2-7-4"
|
||||
transform="translate(683.44312,-155.92356)">
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1200,220.00002 v 9.99999 0"
|
||||
id="path29548-5-1-3-6-3-1-0-3-4-1-3-5" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1220,219.99997 v 5.00004 0"
|
||||
id="path29548-8-5-0-6-4-6-2-9-0-8-1-3-1-9-6-9-3-4-0-4-6-2-2-7-6-1-9-0-5-0-0-5-6-0"
|
||||
inkscape:transform-center-x="14.782001"
|
||||
inkscape:transform-center-y="-0.085282837" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1240,219.99997 v 5.00004 0"
|
||||
id="path29548-8-5-0-6-4-6-2-9-0-8-1-3-1-9-6-9-3-4-0-4-6-2-2-7-6-1-9-9-7-5-3-5-9-1-3"
|
||||
inkscape:transform-center-x="14.782001"
|
||||
inkscape:transform-center-y="-0.085282837" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1260,219.99997 v 5.00004 0"
|
||||
id="path29548-8-5-0-6-4-6-2-9-0-8-1-3-1-9-6-9-3-4-0-4-6-2-2-7-6-1-9-9-1-5-2-0-9-9-2-6"
|
||||
inkscape:transform-center-x="14.782001"
|
||||
inkscape:transform-center-y="-0.085282837" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1280,219.99997 v 5.00004 0"
|
||||
id="path29548-8-5-0-6-4-6-2-9-0-8-1-3-1-9-6-9-3-4-0-4-6-2-2-7-6-1-9-9-1-4-8-9-9-4-1-9-1"
|
||||
inkscape:transform-center-x="14.782001"
|
||||
inkscape:transform-center-y="-0.085282837" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1299.7216,219.99997 v 5.00004 0"
|
||||
id="path29548-8-5-0-6-4-6-2-9-0-8-1-3-1-9-6-9-3-4-0-4-6-2-2-7-6-1-9-9-1-4-9-7-0-2-6-4-3-0"
|
||||
inkscape:transform-center-x="-14.78205"
|
||||
inkscape:transform-center-y="-0.085282837" />
|
||||
</g>
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 2003.443,64.076464 v 9.99999 0"
|
||||
id="path29548-5-1-3-6-3-1-0-3-4-2-0-0-1-6" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-weight:bold;font-size:13.3333px;line-height:125%;font-family:'Nimbus Roman';-inkscape-font-specification:'Nimbus Roman, Bold';letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="2125.6079"
|
||||
y="94.692207"
|
||||
id="text1185-9-7-1-1-8-1-0-4-2-8-2-4-2"><tspan
|
||||
sodipodi:role="line"
|
||||
x="2125.6079"
|
||||
y="94.692207"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:13.3333px;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle;stroke:none"
|
||||
id="tspan31345-4-0-4-81-5-2-8-7-0">Oct.</tspan><tspan
|
||||
sodipodi:role="line"
|
||||
x="2125.6079"
|
||||
y="112.68889"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:13.3333px;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle;stroke:none"
|
||||
id="tspan49906-7-3-8-2-8-9-9-8-6">2029</tspan></text>
|
||||
<g
|
||||
id="g1267-4-5-2-7-4-1"
|
||||
transform="translate(803.46019,-155.57118)">
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1200,220.00002 v 9.99999 0"
|
||||
id="path29548-5-1-3-6-3-1-0-3-4-1-3-5-5" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1220,219.99997 v 5.00004 0"
|
||||
id="path29548-8-5-0-6-4-6-2-9-0-8-1-3-1-9-6-9-3-4-0-4-6-2-2-7-6-1-9-0-5-0-0-5-6-0-5"
|
||||
inkscape:transform-center-x="14.782001"
|
||||
inkscape:transform-center-y="-0.085282837" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1240,219.99997 v 5.00004 0"
|
||||
id="path29548-8-5-0-6-4-6-2-9-0-8-1-3-1-9-6-9-3-4-0-4-6-2-2-7-6-1-9-9-7-5-3-5-9-1-3-4"
|
||||
inkscape:transform-center-x="14.782001"
|
||||
inkscape:transform-center-y="-0.085282837" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1260,219.99997 v 5.00004 0"
|
||||
id="path29548-8-5-0-6-4-6-2-9-0-8-1-3-1-9-6-9-3-4-0-4-6-2-2-7-6-1-9-9-1-5-2-0-9-9-2-6-7"
|
||||
inkscape:transform-center-x="14.782001"
|
||||
inkscape:transform-center-y="-0.085282837" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1280,219.99997 v 5.00004 0"
|
||||
id="path29548-8-5-0-6-4-6-2-9-0-8-1-3-1-9-6-9-3-4-0-4-6-2-2-7-6-1-9-9-1-4-8-9-9-4-1-9-1-6"
|
||||
inkscape:transform-center-x="14.782001"
|
||||
inkscape:transform-center-y="-0.085282837" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1299.7216,219.99997 v 5.00004 0"
|
||||
id="path29548-8-5-0-6-4-6-2-9-0-8-1-3-1-9-6-9-3-4-0-4-6-2-2-7-6-1-9-9-1-4-9-7-0-2-6-4-3-0-5"
|
||||
inkscape:transform-center-x="-14.78205"
|
||||
inkscape:transform-center-y="-0.085282837" />
|
||||
</g>
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 2123.4601,64.428843 v 9.99999 0"
|
||||
id="path29548-5-1-3-6-3-1-0-3-4-2-0-0-1-6-6" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 2123.3825,64.223284 v 9.99999 0"
|
||||
id="path29548-5-1-3-6-3-1-0-3-4-2-0-0-1-6-3" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-weight:bold;font-size:13.3333px;line-height:125%;font-family:'Nimbus Roman';-inkscape-font-specification:'Nimbus Roman, Bold';letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="2245.5474"
|
||||
y="94.839027"
|
||||
id="text1185-9-7-1-1-8-1-0-4-2-8-2-4-2-7"><tspan
|
||||
sodipodi:role="line"
|
||||
x="2245.5474"
|
||||
y="94.839027"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:13.3333px;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle;stroke:none"
|
||||
id="tspan31345-4-0-4-81-5-2-8-7-0-4">Apr.</tspan><tspan
|
||||
sodipodi:role="line"
|
||||
x="2245.5474"
|
||||
y="112.83571"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:13.3333px;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle;stroke:none"
|
||||
id="tspan49906-7-3-8-2-8-9-9-8-6-5">2030</tspan></text>
|
||||
<g
|
||||
id="g1267-4-5-2-7-4-1-2"
|
||||
transform="translate(923.39972,-155.42436)">
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1200,220.00002 v 9.99999 0"
|
||||
id="path29548-5-1-3-6-3-1-0-3-4-1-3-5-5-5" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1220,219.99997 v 5.00004 0"
|
||||
id="path29548-8-5-0-6-4-6-2-9-0-8-1-3-1-9-6-9-3-4-0-4-6-2-2-7-6-1-9-0-5-0-0-5-6-0-5-4"
|
||||
inkscape:transform-center-x="14.782001"
|
||||
inkscape:transform-center-y="-0.085282837" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1240,219.99997 v 5.00004 0"
|
||||
id="path29548-8-5-0-6-4-6-2-9-0-8-1-3-1-9-6-9-3-4-0-4-6-2-2-7-6-1-9-9-7-5-3-5-9-1-3-4-7"
|
||||
inkscape:transform-center-x="14.782001"
|
||||
inkscape:transform-center-y="-0.085282837" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1260,219.99997 v 5.00004 0"
|
||||
id="path29548-8-5-0-6-4-6-2-9-0-8-1-3-1-9-6-9-3-4-0-4-6-2-2-7-6-1-9-9-1-5-2-0-9-9-2-6-7-4"
|
||||
inkscape:transform-center-x="14.782001"
|
||||
inkscape:transform-center-y="-0.085282837" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1280,219.99997 v 5.00004 0"
|
||||
id="path29548-8-5-0-6-4-6-2-9-0-8-1-3-1-9-6-9-3-4-0-4-6-2-2-7-6-1-9-9-1-4-8-9-9-4-1-9-1-6-4"
|
||||
inkscape:transform-center-x="14.782001"
|
||||
inkscape:transform-center-y="-0.085282837" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1299.7216,219.99997 v 5.00004 0"
|
||||
id="path29548-8-5-0-6-4-6-2-9-0-8-1-3-1-9-6-9-3-4-0-4-6-2-2-7-6-1-9-9-1-4-9-7-0-2-6-4-3-0-5-3"
|
||||
inkscape:transform-center-x="-14.78205"
|
||||
inkscape:transform-center-y="-0.085282837" />
|
||||
</g>
|
||||
<g
|
||||
id="g1267-4-5-2-7-4-1-2-0"
|
||||
transform="translate(1043.3579,-155.33829)">
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1200,220.00002 v 9.99999 0"
|
||||
id="path29548-5-1-3-6-3-1-0-3-4-1-3-5-5-5-6" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1220,219.99997 v 5.00004 0"
|
||||
id="path29548-8-5-0-6-4-6-2-9-0-8-1-3-1-9-6-9-3-4-0-4-6-2-2-7-6-1-9-0-5-0-0-5-6-0-5-4-8"
|
||||
inkscape:transform-center-x="14.782001"
|
||||
inkscape:transform-center-y="-0.085282837" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1240,219.99997 v 5.00004 0"
|
||||
id="path29548-8-5-0-6-4-6-2-9-0-8-1-3-1-9-6-9-3-4-0-4-6-2-2-7-6-1-9-9-7-5-3-5-9-1-3-4-7-9"
|
||||
inkscape:transform-center-x="14.782001"
|
||||
inkscape:transform-center-y="-0.085282837" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1260,219.99997 v 5.00004 0"
|
||||
id="path29548-8-5-0-6-4-6-2-9-0-8-1-3-1-9-6-9-3-4-0-4-6-2-2-7-6-1-9-9-1-5-2-0-9-9-2-6-7-4-2"
|
||||
inkscape:transform-center-x="14.782001"
|
||||
inkscape:transform-center-y="-0.085282837" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1280,219.99997 v 5.00004 0"
|
||||
id="path29548-8-5-0-6-4-6-2-9-0-8-1-3-1-9-6-9-3-4-0-4-6-2-2-7-6-1-9-9-1-4-8-9-9-4-1-9-1-6-4-6"
|
||||
inkscape:transform-center-x="14.782001"
|
||||
inkscape:transform-center-y="-0.085282837" />
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 1299.7216,219.99997 v 5.00004 0"
|
||||
id="path29548-8-5-0-6-4-6-2-9-0-8-1-3-1-9-6-9-3-4-0-4-6-2-2-7-6-1-9-9-1-4-9-7-0-2-6-4-3-0-5-3-6"
|
||||
inkscape:transform-center-x="-14.78205"
|
||||
inkscape:transform-center-y="-0.085282837" />
|
||||
</g>
|
||||
<path
|
||||
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="m 2243.3996,64.575663 v 9.99999 0"
|
||||
id="path29548-5-1-3-6-3-1-0-3-4-2-0-0-1-6-6-0" />
|
||||
<rect
|
||||
style="opacity:0.75;fill:#241f31;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.751473;stroke-opacity:1"
|
||||
id="rect917-0-0-4-4-9-4-5-3-9-2-36"
|
||||
width="38.418175"
|
||||
height="23.151052"
|
||||
x="1605.6135"
|
||||
y="-41.172161"
|
||||
x="2047.6135"
|
||||
y="-45.172161"
|
||||
ry="1.1605872" />
|
||||
<rect
|
||||
style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1.98878;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="rect917-0-0-4-4-9-4-5-3-9-2-36-7"
|
||||
width="186.42949"
|
||||
height="110.40546"
|
||||
x="1594.5294"
|
||||
y="-73.753708"
|
||||
x="2036.5294"
|
||||
y="-77.753708"
|
||||
ry="5.5347452" />
|
||||
<rect
|
||||
style="opacity:0.75;fill:#241f31;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.50949;stroke-opacity:1"
|
||||
id="rect917-0-0-4-4-9-4-5-3-9-2-6"
|
||||
width="21.197233"
|
||||
height="19.28739"
|
||||
x="1611.8163"
|
||||
y="-41.883858"
|
||||
x="2053.8164"
|
||||
y="-45.883858"
|
||||
ry="0.96689767" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-weight:bold;font-size:13.3333px;line-height:125%;font-family:'Nimbus Roman';-inkscape-font-specification:'Nimbus Roman, Bold';letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#fffefe;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="1690.4917"
|
||||
y="-53.687912"
|
||||
x="2132.4917"
|
||||
y="-57.687912"
|
||||
id="text1185-3-55-4-0-0-0-1-1-6-4-3-5"><tspan
|
||||
sodipodi:role="line"
|
||||
x="1690.4917"
|
||||
y="-53.687912"
|
||||
x="2132.4917"
|
||||
y="-57.687912"
|
||||
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:13.3333px;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans Bold';text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none"
|
||||
id="tspan10317-2-9-1-4-6-5-6-6-5">Legend</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-weight:bold;font-size:13.3333px;line-height:125%;font-family:'Nimbus Roman';-inkscape-font-specification:'Nimbus Roman, Bold';letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#fffefe;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="1656.0988"
|
||||
y="-27.899874"
|
||||
x="2098.0986"
|
||||
y="-31.899874"
|
||||
id="text1185-3-55-4-0-0-0-1-1-6-4-3-5-2"><tspan
|
||||
sodipodi:role="line"
|
||||
x="1656.0988"
|
||||
y="-27.899874"
|
||||
x="2098.0986"
|
||||
y="-31.899874"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.3333px;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans';text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none"
|
||||
id="tspan10317-2-9-1-4-6-5-6-6-5-9">Future</tspan></text>
|
||||
<rect
|
||||
@@ -1488,38 +1834,38 @@
|
||||
id="rect917-0-0-4-4-9-4-5-3-9-2-6-1"
|
||||
width="21.197233"
|
||||
height="19.28739"
|
||||
x="1611.8671"
|
||||
y="-17.756365"
|
||||
x="2053.8672"
|
||||
y="-21.756365"
|
||||
ry="0.96689767" />
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-weight:bold;font-size:13.3333px;line-height:125%;font-family:'Nimbus Roman';-inkscape-font-specification:'Nimbus Roman, Bold';letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#fffefe;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="1686.7159"
|
||||
y="-3.6722763"
|
||||
x="2128.7158"
|
||||
y="-7.6722765"
|
||||
id="text1185-3-55-4-0-0-0-1-1-6-4-3-5-2-2"><tspan
|
||||
sodipodi:role="line"
|
||||
x="1686.7159"
|
||||
y="-3.6722763"
|
||||
x="2128.7158"
|
||||
y="-7.6722765"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.3333px;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans';text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none"
|
||||
id="tspan10317-2-9-1-4-6-5-6-6-5-9-7">Current (Oct. 24)</tspan></text>
|
||||
id="tspan10317-2-9-1-4-6-5-6-6-5-9-7">Current (Apr. 25)</tspan></text>
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-weight:bold;font-size:13.3333px;line-height:125%;font-family:'Nimbus Roman';-inkscape-font-specification:'Nimbus Roman, Bold';letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;fill:#fffefe;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
x="1667.363"
|
||||
y="20.03771"
|
||||
x="2109.363"
|
||||
y="16.03771"
|
||||
id="text1185-3-55-4-0-0-0-1-1-6-4-3-5-2-2-9"><tspan
|
||||
sodipodi:role="line"
|
||||
x="1667.363"
|
||||
y="20.03771"
|
||||
x="2109.363"
|
||||
y="16.03771"
|
||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.3333px;font-family:'Liberation Sans';-inkscape-font-specification:'Liberation Sans';text-align:center;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none"
|
||||
id="tspan10317-2-9-1-4-6-5-6-6-5-9-7-3">End-of-life</tspan></text>
|
||||
<rect
|
||||
style="fill:#333333;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.50949;stroke-opacity:1;opacity:0.5"
|
||||
style="opacity:0.5;fill:#333333;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.50949;stroke-opacity:1"
|
||||
id="rect917-0-0-4-4-9-4-5-3-9-2-6-1-0"
|
||||
width="21.197233"
|
||||
height="19.28739"
|
||||
x="1612.0239"
|
||||
y="5.9667883"
|
||||
x="2054.0239"
|
||||
y="1.9667883"
|
||||
ry="0.96689767" />
|
||||
<rect
|
||||
style="opacity:0.5;fill:#333333;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1.85786;stroke-opacity:1"
|
||||
|
||||
|
Before Width: | Height: | Size: 93 KiB After Width: | Height: | Size: 117 KiB |
@@ -740,7 +740,7 @@ tool, which you then use to modify the kernel configuration.
|
||||
$ bitbake linux-yocto -c menuconfig
|
||||
|
||||
|
||||
See the ":ref:`kernel-dev/common:using \`\`menuconfig\`\``"
|
||||
See the ":ref:`kernel-dev/common:using ``menuconfig```"
|
||||
section in the Yocto Project Linux Kernel Development Manual for more
|
||||
information on this configuration tool.
|
||||
|
||||
@@ -764,7 +764,7 @@ which can then be applied by subsequent tasks such as
|
||||
|
||||
Runs ``make menuconfig`` for the kernel. For information on
|
||||
``menuconfig``, see the
|
||||
":ref:`kernel-dev/common:using \`\`menuconfig\`\``"
|
||||
":ref:`kernel-dev/common:using ``menuconfig```"
|
||||
section in the Yocto Project Linux Kernel Development Manual.
|
||||
|
||||
.. _ref-tasks-savedefconfig:
|
||||
|
||||
@@ -63,7 +63,7 @@ universal, the list includes them just in case:
|
||||
This term refers to the area used by the OpenEmbedded build system for
|
||||
builds. The area is created when you ``source`` the setup environment
|
||||
script that is found in the Source Directory
|
||||
(i.e. :ref:`ref-manual/structure:\`\`oe-init-build-env\`\``). The
|
||||
(i.e. :ref:`ref-manual/structure:``oe-init-build-env```). The
|
||||
:term:`TOPDIR` variable points to the Build Directory.
|
||||
|
||||
You have a lot of flexibility when creating the :term:`Build Directory`.
|
||||
|
||||
@@ -1806,7 +1806,7 @@ system and gives an overview of their function and contents.
|
||||
``${TMPDIR}/deploy``.
|
||||
|
||||
For more information on the structure of the Build Directory, see
|
||||
":ref:`ref-manual/structure:the build directory --- \`\`build/\`\``" section.
|
||||
":ref:`ref-manual/structure:the build directory --- ``build/```" section.
|
||||
For more detail on the contents of the ``deploy`` directory, see the
|
||||
":ref:`overview-manual/concepts:images`",
|
||||
":ref:`overview-manual/concepts:package feeds`", and
|
||||
@@ -1850,7 +1850,7 @@ system and gives an overview of their function and contents.
|
||||
<ref-classes-image>` class.
|
||||
|
||||
For more information on the structure of the Build Directory, see
|
||||
":ref:`ref-manual/structure:the build directory --- \`\`build/\`\``" section.
|
||||
":ref:`ref-manual/structure:the build directory --- ``build/```" section.
|
||||
For more detail on the contents of the ``deploy`` directory, see the
|
||||
":ref:`overview-manual/concepts:images`" and
|
||||
":ref:`overview-manual/concepts:application development sdk`" sections both in
|
||||
@@ -3617,6 +3617,36 @@ system and gives an overview of their function and contents.
|
||||
|
||||
IMAGE_ROOTFS_EXTRA_SPACE = "41943040"
|
||||
|
||||
:term:`IMAGE_ROOTFS_MAXSIZE`
|
||||
Defines the maximum allowed size of the generated image in kilobytes.
|
||||
The build will fail if the generated image size exceeds this value.
|
||||
|
||||
The generated image size undergoes several calculation steps before being
|
||||
compared to :term:`IMAGE_ROOTFS_MAXSIZE`.
|
||||
In the first step, the size of the directory pointed to by :term:`IMAGE_ROOTFS`
|
||||
is calculated.
|
||||
In the second step, the result from the first step is multiplied
|
||||
by :term:`IMAGE_OVERHEAD_FACTOR`.
|
||||
In the third step, the result from the second step is compared with
|
||||
:term:`IMAGE_ROOTFS_SIZE`. The larger value of these is added to
|
||||
:term:`IMAGE_ROOTFS_EXTRA_SPACE`.
|
||||
In the fourth step, the result from the third step is checked for
|
||||
a decimal part. If it has one, it is rounded up to the next integer.
|
||||
If it does not, it is simply converted into an integer.
|
||||
In the fifth step, the :term:`IMAGE_ROOTFS_ALIGNMENT` is added to the result
|
||||
from the fourth step and "1" is subtracted.
|
||||
In the sixth step, the remainder of the division between the result
|
||||
from the fifth step and :term:`IMAGE_ROOTFS_ALIGNMENT` is subtracted from the
|
||||
result of the fifth step. In this way, the result from the fourth step is
|
||||
rounded up to the nearest multiple of :term:`IMAGE_ROOTFS_ALIGNMENT`.
|
||||
|
||||
Thus, if the :term:`IMAGE_ROOTFS_MAXSIZE` is set, is compared with the result
|
||||
of the above calculations and is independent of the final image type.
|
||||
No default value is set for :term:`IMAGE_ROOTFS_MAXSIZE`.
|
||||
|
||||
It's a good idea to set this variable for images that need to fit on a limited
|
||||
space (e.g. SD card, a fixed-size partition, ...).
|
||||
|
||||
:term:`IMAGE_ROOTFS_SIZE`
|
||||
Defines the size in Kbytes for the generated image. The OpenEmbedded
|
||||
build system determines the final size for the generated image using
|
||||
@@ -3822,6 +3852,23 @@ system and gives an overview of their function and contents.
|
||||
Set the variable to "1" to prevent the default dependencies from
|
||||
being added.
|
||||
|
||||
:term:`INHIBIT_DEFAULT_RUST_DEPS`
|
||||
Prevents the :ref:`ref-classes-rust` class from automatically adding
|
||||
its default build-time dependencies.
|
||||
|
||||
When a recipe inherits the :ref:`ref-classes-rust` class, several
|
||||
tools such as ``rust-native`` and ``${RUSTLIB_DEP}`` (only added when cross-compiling) are added
|
||||
to :term:`DEPENDS` to support the ``rust`` build process.
|
||||
|
||||
To prevent the build system from adding these dependencies automatically,
|
||||
set the :term:`INHIBIT_DEFAULT_RUST_DEPS` variable as follows::
|
||||
|
||||
INHIBIT_DEFAULT_RUST_DEPS = "1"
|
||||
|
||||
By default, the value of :term:`INHIBIT_DEFAULT_RUST_DEPS` is empty. Setting
|
||||
it to "0" does not disable inhibition. Only the empty string will disable
|
||||
inhibition.
|
||||
|
||||
:term:`INHIBIT_PACKAGE_DEBUG_SPLIT`
|
||||
Prevents the OpenEmbedded build system from splitting out debug
|
||||
information during packaging. By default, the build system splits out
|
||||
@@ -3869,6 +3916,25 @@ system and gives an overview of their function and contents.
|
||||
even if the toolchain's binaries are strippable, there are other files
|
||||
needed for the build that are not strippable.
|
||||
|
||||
:term:`INHIBIT_UPDATERCD_BBCLASS`
|
||||
Prevents the :ref:`ref-classes-update-rc.d` class from automatically
|
||||
installing and registering SysV init scripts for packages.
|
||||
|
||||
When a recipe inherits the :ref:`ref-classes-update-rc.d` class, init
|
||||
scripts are typically installed and registered for the packages listed in
|
||||
:term:`INITSCRIPT_PACKAGES`. This ensures that the relevant
|
||||
services are started and stopped at the appropriate runlevels using the
|
||||
traditional SysV init system.
|
||||
|
||||
To prevent the build system from adding these scripts and configurations
|
||||
automatically, set the :term:`INHIBIT_UPDATERCD_BBCLASS` variable as follows::
|
||||
|
||||
INHIBIT_UPDATERCD_BBCLASS = "1"
|
||||
|
||||
By default, the value of :term:`INHIBIT_UPDATERCD_BBCLASS` is empty. Setting
|
||||
it to "0" does not disable inhibition. Only the empty string will disable
|
||||
inhibition.
|
||||
|
||||
:term:`INIT_MANAGER`
|
||||
Specifies the system init manager to use. Available options are:
|
||||
|
||||
@@ -4010,6 +4076,20 @@ system and gives an overview of their function and contents.
|
||||
See the :term:`MACHINE` variable for additional
|
||||
information.
|
||||
|
||||
:term:`INITRAMFS_MAXSIZE`
|
||||
Defines the maximum allowed size of the :term:`Initramfs` image in Kbytes.
|
||||
The build will fail if the :term:`Initramfs` image size exceeds this value.
|
||||
|
||||
The :term:`Initramfs` image size undergoes several calculation steps before
|
||||
being compared to :term:`INITRAMFS_MAXSIZE`.
|
||||
These steps are the same as those used for :term:`IMAGE_ROOTFS_MAXSIZE`
|
||||
and are described in detail in that entry.
|
||||
|
||||
Thus, :term:`INITRAMFS_MAXSIZE` is compared with the result of the calculations
|
||||
and is independent of the final image type (e.g. compressed).
|
||||
A default value for :term:`INITRAMFS_MAXSIZE` is set in
|
||||
:oe_git:`meta/conf/bitbake.conf </openembedded-core/tree/meta/conf/bitbake.conf>`.
|
||||
|
||||
:term:`INITRAMFS_MULTICONFIG`
|
||||
Defines the multiconfig to create a multiconfig dependency to be used by the :ref:`kernel <ref-classes-kernel>` class.
|
||||
|
||||
@@ -4197,15 +4277,8 @@ system and gives an overview of their function and contents.
|
||||
options not explicitly specified will be disabled in the kernel
|
||||
config.
|
||||
|
||||
In case :term:`KCONFIG_MODE` is not set the behaviour will depend on where
|
||||
the ``defconfig`` file is coming from. An "in-tree" ``defconfig`` file
|
||||
will be handled in ``alldefconfig`` mode, a ``defconfig`` file placed
|
||||
in ``${WORKDIR}`` through a meta-layer will be handled in
|
||||
``allnoconfig`` mode.
|
||||
|
||||
An "in-tree" ``defconfig`` file can be selected via the
|
||||
:term:`KBUILD_DEFCONFIG` variable. :term:`KCONFIG_MODE` does not need to
|
||||
be explicitly set.
|
||||
In case :term:`KCONFIG_MODE` is not set the ``defconfig`` file
|
||||
will be handled in ``allnoconfig`` mode.
|
||||
|
||||
A ``defconfig`` file compatible with ``allnoconfig`` mode can be
|
||||
generated by copying the ``.config`` file from a working Linux kernel
|
||||
@@ -6099,7 +6172,7 @@ system and gives an overview of their function and contents.
|
||||
For examples of how this data is used, see the
|
||||
":ref:`overview-manual/concepts:automatically added runtime dependencies`"
|
||||
section in the Yocto Project Overview and Concepts Manual and the
|
||||
":ref:`dev-manual/debugging:viewing package information with \`\`oe-pkgdata-util\`\``"
|
||||
":ref:`dev-manual/debugging:viewing package information with ``oe-pkgdata-util```"
|
||||
section in the Yocto Project Development Tasks Manual. For more
|
||||
information on the shared, global-state directory, see
|
||||
:term:`STAGING_DIR_HOST`.
|
||||
@@ -7717,7 +7790,7 @@ system and gives an overview of their function and contents.
|
||||
class.
|
||||
|
||||
:term:`SPL_SIGN_KEYNAME`
|
||||
The name of keys used by the :ref:`ref-classes-kernel-fitimage` class
|
||||
The name of keys used by the :ref:`ref-classes-uboot-sign` class
|
||||
for signing U-Boot FIT image stored in the :term:`SPL_SIGN_KEYDIR`
|
||||
directory. If we have for example a ``dev.key`` key and a ``dev.crt``
|
||||
certificate stored in the :term:`SPL_SIGN_KEYDIR` directory, you will
|
||||
@@ -7978,7 +8051,7 @@ system and gives an overview of their function and contents.
|
||||
The Yocto Project actually shares the cache data objects built by its
|
||||
autobuilder::
|
||||
|
||||
SSTATE_MIRRORS ?= "file://.* http://cdn.jsdelivr.net/yocto/sstate/all/PATH;downloadfilename=PATH"
|
||||
SSTATE_MIRRORS ?= "file://.* http://sstate.yoctoproject.org/all/PATH;downloadfilename=PATH"
|
||||
|
||||
As such binary artifacts are built for the generic QEMU machines
|
||||
supported by the various Poky releases, they are less likely to be
|
||||
@@ -8004,6 +8077,26 @@ system and gives an overview of their function and contents.
|
||||
For details on the process, see the
|
||||
:ref:`staging <ref-classes-staging>` class.
|
||||
|
||||
:term:`SSTATE_SKIP_CREATION`
|
||||
The :term:`SSTATE_SKIP_CREATION` variable can be used to skip the
|
||||
creation of :ref:`shared state <overview-manual/concepts:shared state cache>`
|
||||
tarball files. It makes sense e.g. for image creation tasks as tarring images
|
||||
and keeping them in sstate would consume a lot of disk space.
|
||||
|
||||
In general it is not recommended to use this variable as missing sstate
|
||||
artefacts adversely impact the build, particularly for entries in the
|
||||
middle of dependency chains. The case it can make sense is where the
|
||||
size and time costs of the artefact are similar to just running the
|
||||
tasks. This generally only applies to end artefact output like images.
|
||||
|
||||
The syntax to disable it for one task is::
|
||||
|
||||
SSTATE_SKIP_CREATION:task-image-complete = "1"
|
||||
|
||||
The syntax to disable it for the whole recipe is::
|
||||
|
||||
SSTATE_SKIP_CREATION = "1"
|
||||
|
||||
:term:`STAGING_BASE_LIBDIR_NATIVE`
|
||||
Specifies the path to the ``/lib`` subdirectory of the sysroot
|
||||
directory for the build host.
|
||||
@@ -8909,7 +9002,7 @@ system and gives an overview of their function and contents.
|
||||
:doc:`/sdk-manual/index` manual.
|
||||
|
||||
Note that this variable applies to building an SDK, not an eSDK,
|
||||
in which case the term:`TOOLCHAIN_HOST_TASK_ESDK` setting should be
|
||||
in which case the :term:`TOOLCHAIN_HOST_TASK_ESDK` setting should be
|
||||
used instead.
|
||||
|
||||
:term:`TOOLCHAIN_HOST_TASK_ESDK`
|
||||
@@ -9579,6 +9672,20 @@ system and gives an overview of their function and contents.
|
||||
can control with this variable, see the
|
||||
":ref:`ref-classes-insane`" section.
|
||||
|
||||
:term:`WIC_CREATE_EXTRA_ARGS`
|
||||
If the :term:`IMAGE_FSTYPES` variable contains "wic", the build
|
||||
will generate a
|
||||
:ref:`Wic image <dev-manual/wic:creating partitioned images using wic>`
|
||||
automatically when BitBake builds an image recipe. As part of
|
||||
this process BitBake will invoke the "`wic create`" command. The
|
||||
:term:`WIC_CREATE_EXTRA_ARGS` variable is placed at the end of this
|
||||
command which allows the user to supply additional arguments.
|
||||
|
||||
One such useful purpose for this mechanism is to add the ``-D`` (or
|
||||
``--debug``) argument to the "`wic create`" command. This increases the
|
||||
amount of debugging information written out to the Wic log during the
|
||||
Wic creation process.
|
||||
|
||||
:term:`WKS_FILE`
|
||||
Specifies the location of the Wic kickstart file that is used by the
|
||||
OpenEmbedded build system to create a partitioned image
|
||||
|
||||
@@ -51,13 +51,11 @@ fashion. Basically, during the development of a Yocto Project release,
|
||||
the Autobuilder tests if things work. The Autobuilder builds all test
|
||||
targets and runs all the tests.
|
||||
|
||||
The Yocto Project uses now uses standard upstream
|
||||
Buildbot (`version 3.8 <https://docs.buildbot.net/3.8.0/>`__) to
|
||||
drive its integration and testing. Buildbot has a plug-in interface
|
||||
that the Yocto Project customizes using code from the
|
||||
``yocto-autobuilder2`` repository, adding its own console UI plugin. The
|
||||
resulting UI plug-in allows you to visualize builds in a way suited to
|
||||
the project's needs.
|
||||
The Yocto Project uses standard upstream Buildbot to drive its integration and
|
||||
testing. Buildbot has a plug-in interface that the Yocto Project customizes
|
||||
using code from the :yocto_git:`yocto-autobuilder2 </yocto-autobuilder2>`
|
||||
repository, adding its own console UI plugin. The resulting UI plug-in allows
|
||||
you to visualize builds in a way suited to the project's needs.
|
||||
|
||||
A ``helper`` layer provides configuration and job management through
|
||||
scripts found in the ``yocto-autobuilder-helper`` repository. The
|
||||
|
||||
@@ -548,7 +548,7 @@ database.
|
||||
|
||||
You need to run the ``buildslist`` command first to identify existing
|
||||
builds in the database before using the
|
||||
:ref:`toaster-manual/reference:\`\`builddelete\`\`` command. Here is an
|
||||
:ref:`toaster-manual/reference:``builddelete``` command. Here is an
|
||||
example that assumes default repository and build directory names:
|
||||
|
||||
.. code-block:: shell
|
||||
@@ -557,7 +557,7 @@ example that assumes default repository and build directory names:
|
||||
$ python ../bitbake/lib/toaster/manage.py buildslist
|
||||
|
||||
If your Toaster database had only one build, the above
|
||||
:ref:`toaster-manual/reference:\`\`buildslist\`\``
|
||||
:ref:`toaster-manual/reference:``buildslist```
|
||||
command would return something like the following::
|
||||
|
||||
1: qemux86 poky core-image-minimal
|
||||
@@ -578,7 +578,7 @@ the database.
|
||||
|
||||
Prior to running the ``builddelete`` command, you need to get the ID
|
||||
associated with builds by using the
|
||||
:ref:`toaster-manual/reference:\`\`buildslist\`\`` command.
|
||||
:ref:`toaster-manual/reference:``buildslist``` command.
|
||||
|
||||
``perf``
|
||||
--------
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
DISTRO = "poky"
|
||||
DISTRO_NAME = "Poky (Yocto Project Reference Distro)"
|
||||
#DISTRO_VERSION = "3.4+snapshot-${METADATA_REVISION}"
|
||||
DISTRO_VERSION = "4.0.27"
|
||||
DISTRO_VERSION = "4.0.28"
|
||||
DISTRO_CODENAME = "kirkstone"
|
||||
SDK_VENDOR = "-pokysdk"
|
||||
SDK_VERSION = "${@d.getVar('DISTRO_VERSION').replace('snapshot-${METADATA_REVISION}', 'snapshot')}"
|
||||
|
||||
@@ -706,9 +706,10 @@ RDEPENDS:${KERNEL_PACKAGE_NAME} = "${KERNEL_PACKAGE_NAME}-base (= ${EXTENDPKGV})
|
||||
# not wanted in images as standard
|
||||
RRECOMMENDS:${KERNEL_PACKAGE_NAME}-base ?= "${KERNEL_PACKAGE_NAME}-image (= ${EXTENDPKGV})"
|
||||
PKG:${KERNEL_PACKAGE_NAME}-image = "${KERNEL_PACKAGE_NAME}-image-${@legitimize_package_name(d.getVar('KERNEL_VERSION'))}"
|
||||
RPROVIDES:${KERNEL_PACKAGE_NAME}-image += "${KERNEL_PACKAGE_NAME}-image"
|
||||
RDEPENDS:${KERNEL_PACKAGE_NAME}-image += "${@oe.utils.conditional('KERNEL_IMAGETYPE', 'vmlinux', '${KERNEL_PACKAGE_NAME}-vmlinux (= ${EXTENDPKGV})', '', d)}"
|
||||
PKG:${KERNEL_PACKAGE_NAME}-base = "${KERNEL_PACKAGE_NAME}-${@legitimize_package_name(d.getVar('KERNEL_VERSION'))}"
|
||||
RPROVIDES:${KERNEL_PACKAGE_NAME}-base += "${KERNEL_PACKAGE_NAME}-${KERNEL_VERSION}"
|
||||
RPROVIDES:${KERNEL_PACKAGE_NAME}-base += "${KERNEL_PACKAGE_NAME}-${KERNEL_VERSION} ${KERNEL_PACKAGE_NAME}-base"
|
||||
ALLOW_EMPTY:${KERNEL_PACKAGE_NAME} = "1"
|
||||
ALLOW_EMPTY:${KERNEL_PACKAGE_NAME}-base = "1"
|
||||
ALLOW_EMPTY:${KERNEL_PACKAGE_NAME}-image = "1"
|
||||
|
||||
@@ -29,7 +29,6 @@ PTESTS_FAST = "\
|
||||
libnl-ptest \
|
||||
libmodule-build-perl-ptest \
|
||||
libpcre-ptest \
|
||||
libpng-ptest \
|
||||
libssh2-ptest \
|
||||
libtimedate-perl-ptest \
|
||||
libtest-needs-perl-ptest \
|
||||
@@ -88,6 +87,7 @@ PTESTS_SLOW = "\
|
||||
glib-2.0-ptest \
|
||||
gstreamer1.0-ptest \
|
||||
libevent-ptest \
|
||||
libpng-ptest \
|
||||
lttng-tools-ptest \
|
||||
openssh-ptest \
|
||||
openssl-ptest \
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
From 8d3be0285f1d4667bfe85dba555c663eb3d704b4 Mon Sep 17 00:00:00 2001
|
||||
From: Yoonje Shin <ioerts@kookmin.ac.kr>
|
||||
Date: Mon, 12 May 2025 10:48:18 +0200
|
||||
Subject: [PATCH] dnsproxy: Address CVE-2025-32366 vulnerability
|
||||
|
||||
In Connman parse_rr in dnsproxy.c has a memcpy length
|
||||
that depends on an RR RDLENGTH value (i.e., *rdlen=ntohs(rr->rdlen)
|
||||
and memcpy(response+offset,*end,*rdlen)). Here, rdlen may be larger
|
||||
than the amount of remaining packet data in the current state of
|
||||
parsing. As a result, values of stack memory locations may be sent
|
||||
over the network in a response.
|
||||
|
||||
This patch adds a check to ensure that (*end + *rdlen) does not exceed
|
||||
the valid range. If the condition is violated, the function returns
|
||||
-EINVAL.
|
||||
|
||||
CVE: CVE-2025-32366
|
||||
|
||||
Upstream-Status: Backport [https://git.kernel.org/pub/scm/network/connman/connman.git/commit/?id=8d3be0285f1d4667bfe85dba555c663eb3d704b4]
|
||||
|
||||
Signed-off-by: Praveen Kumar <praveen.kumar@windriver.com>
|
||||
---
|
||||
src/dnsproxy.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/src/dnsproxy.c b/src/dnsproxy.c
|
||||
index 334dd00..74aed50 100644
|
||||
--- a/src/dnsproxy.c
|
||||
+++ b/src/dnsproxy.c
|
||||
@@ -950,6 +950,9 @@ static int parse_rr(unsigned char *buf, unsigned char *start,
|
||||
if ((unsigned int) (offset + *rdlen) > *response_size)
|
||||
return -ENOBUFS;
|
||||
|
||||
+ if ((*end + *rdlen) > max)
|
||||
+ return -EINVAL;
|
||||
+
|
||||
memcpy(response + offset, *end, *rdlen);
|
||||
|
||||
*end += *rdlen;
|
||||
--
|
||||
2.40.0
|
||||
@@ -10,6 +10,7 @@ SRC_URI = "${KERNELORG_MIRROR}/linux/network/${BPN}/${BP}.tar.xz \
|
||||
file://CVE-2022-32292.patch \
|
||||
file://CVE-2023-28488.patch \
|
||||
file://CVE-2025-32743.patch \
|
||||
file://CVE-2025-32366.patch \
|
||||
"
|
||||
|
||||
SRC_URI:append:libc-musl = " file://0002-resolve-musl-does-not-implement-res_ninit.patch"
|
||||
|
||||
@@ -66,34 +66,14 @@ start_nfsd(){
|
||||
start-stop-daemon --start --exec "$NFS_NFSD" -- "$@"
|
||||
echo done
|
||||
}
|
||||
delay_nfsd(){
|
||||
for delay in 0 1 2 3 4 5 6 7 8 9
|
||||
do
|
||||
if pidof nfsd >/dev/null
|
||||
then
|
||||
echo -n .
|
||||
sleep 1
|
||||
else
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
return 1
|
||||
}
|
||||
stop_nfsd(){
|
||||
# WARNING: this kills any process with the executable
|
||||
# name 'nfsd'.
|
||||
echo -n 'stopping nfsd: '
|
||||
start-stop-daemon --stop --quiet --signal 1 --name nfsd
|
||||
if delay_nfsd || {
|
||||
echo failed
|
||||
echo ' using signal 9: '
|
||||
start-stop-daemon --stop --quiet --signal 9 --name nfsd
|
||||
delay_nfsd
|
||||
}
|
||||
$NFS_NFSD 0
|
||||
if pidof nfsd
|
||||
then
|
||||
echo done
|
||||
else
|
||||
echo failed
|
||||
else
|
||||
echo done
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
From fc86875e6acb36401dfc1dfb6b628a9d1460f367 Mon Sep 17 00:00:00 2001
|
||||
From: "djm@openbsd.org" <djm@openbsd.org>
|
||||
Date: Wed, 9 Apr 2025 07:00:03 +0000
|
||||
Subject: [PATCH] upstream: Fix logic error in DisableForwarding option. This
|
||||
option
|
||||
|
||||
was documented as disabling X11 and agent forwarding but it failed to do so.
|
||||
Spotted by Tim Rice.
|
||||
|
||||
OpenBSD-Commit-ID: fffc89195968f7eedd2fc57f0b1f1ef3193f5ed1
|
||||
|
||||
Upstream-Status: Backport [https://github.com/openssh/openssh-portable/commit/fc86875e6acb36401dfc1dfb6b628a9d1460f367]
|
||||
CVE: CVE-2025-32728
|
||||
Signed-off-by: Vijay Anusuri <vanusuri@mvista.com>
|
||||
---
|
||||
session.c | 5 +++--
|
||||
1 file changed, 3 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/session.c b/session.c
|
||||
index e67d24d..625e97f 100644
|
||||
--- a/session.c
|
||||
+++ b/session.c
|
||||
@@ -2182,7 +2182,8 @@ session_auth_agent_req(struct ssh *ssh, Session *s)
|
||||
if ((r = sshpkt_get_end(ssh)) != 0)
|
||||
sshpkt_fatal(ssh, r, "%s: parse packet", __func__);
|
||||
if (!auth_opts->permit_agent_forwarding_flag ||
|
||||
- !options.allow_agent_forwarding) {
|
||||
+ !options.allow_agent_forwarding ||
|
||||
+ options.disable_forwarding) {
|
||||
debug_f("agent forwarding disabled");
|
||||
return 0;
|
||||
}
|
||||
@@ -2568,7 +2569,7 @@ session_setup_x11fwd(struct ssh *ssh, Session *s)
|
||||
ssh_packet_send_debug(ssh, "X11 forwarding disabled by key options.");
|
||||
return 0;
|
||||
}
|
||||
- if (!options.x11_forwarding) {
|
||||
+ if (!options.x11_forwarding || options.disable_forwarding) {
|
||||
debug("X11 forwarding disabled in server configuration file.");
|
||||
return 0;
|
||||
}
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@@ -38,6 +38,7 @@ SRC_URI = "http://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-${PV}.tar
|
||||
file://CVE-2023-51385.patch \
|
||||
file://CVE-2024-6387.patch \
|
||||
file://CVE-2025-26465.patch \
|
||||
file://CVE-2025-32728.patch \
|
||||
"
|
||||
SRC_URI[sha256sum] = "fd497654b7ab1686dac672fb83dfb4ba4096e8b5ffcdaccd262380ae58bec5e7"
|
||||
|
||||
|
||||
120
meta/recipes-core/glib-2.0/glib-2.0/CVE-2025-4373-01.patch
Normal file
120
meta/recipes-core/glib-2.0/glib-2.0/CVE-2025-4373-01.patch
Normal file
@@ -0,0 +1,120 @@
|
||||
From cc647f9e46d55509a93498af19659baf9c80f2e3 Mon Sep 17 00:00:00 2001
|
||||
From: Michael Catanzaro <mcatanzaro@redhat.com>
|
||||
Date: Thu, 10 Apr 2025 10:57:20 -0500
|
||||
Subject: [PATCH 1/2] gstring: carefully handle gssize parameters
|
||||
|
||||
Wherever we use gssize to allow passing -1, we need to ensure we don't
|
||||
overflow the value by assigning a gsize to it without checking if the
|
||||
size exceeds the maximum gssize. The safest way to do this is to just
|
||||
use normal gsize everywhere instead and use gssize only for the
|
||||
parameter.
|
||||
|
||||
Our computers don't have enough RAM to write tests for this. I tried
|
||||
forcing string->len to high values for test purposes, but this isn't
|
||||
valid and will just cause out of bounds reads/writes due to
|
||||
string->allocated_len being unexpectedly small, so I don't think we can
|
||||
test this easily.
|
||||
|
||||
CVE: CVE-2025-4373
|
||||
|
||||
Upstream-Status: Backport [https://gitlab.gnome.org/GNOME/glib/-/commit/cc647f9e46d55509a93498af19659baf9c80f2e3]
|
||||
|
||||
Signed-off-by: Praveen Kumar <praveen.kumar@windriver.com>
|
||||
---
|
||||
glib/gstring.c | 36 +++++++++++++++++++++++-------------
|
||||
1 file changed, 23 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/glib/gstring.c b/glib/gstring.c
|
||||
index 0a509e5..d6f8735 100644
|
||||
--- a/glib/gstring.c
|
||||
+++ b/glib/gstring.c
|
||||
@@ -424,8 +424,9 @@ g_string_insert_len (GString *string,
|
||||
return string;
|
||||
|
||||
if (len < 0)
|
||||
- len = strlen (val);
|
||||
- len_unsigned = len;
|
||||
+ len_unsigned = strlen (val);
|
||||
+ else
|
||||
+ len_unsigned = len;
|
||||
|
||||
if (pos < 0)
|
||||
pos_unsigned = string->len;
|
||||
@@ -723,10 +724,12 @@ g_string_insert_c (GString *string,
|
||||
g_string_maybe_expand (string, 1);
|
||||
|
||||
if (pos < 0)
|
||||
- pos = string->len;
|
||||
+ pos_unsigned = string->len;
|
||||
else
|
||||
- g_return_val_if_fail ((gsize) pos <= string->len, string);
|
||||
- pos_unsigned = pos;
|
||||
+ {
|
||||
+ pos_unsigned = pos;
|
||||
+ g_return_val_if_fail (pos_unsigned <= string->len, string);
|
||||
+ }
|
||||
|
||||
/* If not just an append, move the old stuff */
|
||||
if (pos_unsigned < string->len)
|
||||
@@ -759,6 +762,7 @@ g_string_insert_unichar (GString *string,
|
||||
gssize pos,
|
||||
gunichar wc)
|
||||
{
|
||||
+ gsize pos_unsigned;
|
||||
gint charlen, first, i;
|
||||
gchar *dest;
|
||||
|
||||
@@ -800,15 +804,18 @@ g_string_insert_unichar (GString *string,
|
||||
g_string_maybe_expand (string, charlen);
|
||||
|
||||
if (pos < 0)
|
||||
- pos = string->len;
|
||||
+ pos_unsigned = string->len;
|
||||
else
|
||||
- g_return_val_if_fail ((gsize) pos <= string->len, string);
|
||||
+ {
|
||||
+ pos_unsigned = pos;
|
||||
+ g_return_val_if_fail (pos_unsigned <= string->len, string);
|
||||
+ }
|
||||
|
||||
/* If not just an append, move the old stuff */
|
||||
- if ((gsize) pos < string->len)
|
||||
- memmove (string->str + pos + charlen, string->str + pos, string->len - pos);
|
||||
+ if (pos_unsigned < string->len)
|
||||
+ memmove (string->str + pos_unsigned + charlen, string->str + pos_unsigned, string->len - pos_unsigned);
|
||||
|
||||
- dest = string->str + pos;
|
||||
+ dest = string->str + pos_unsigned;
|
||||
/* Code copied from g_unichar_to_utf() */
|
||||
for (i = charlen - 1; i > 0; --i)
|
||||
{
|
||||
@@ -866,6 +873,7 @@ g_string_overwrite_len (GString *string,
|
||||
const gchar *val,
|
||||
gssize len)
|
||||
{
|
||||
+ gssize len_unsigned;
|
||||
gsize end;
|
||||
|
||||
g_return_val_if_fail (string != NULL, NULL);
|
||||
@@ -877,14 +885,16 @@ g_string_overwrite_len (GString *string,
|
||||
g_return_val_if_fail (pos <= string->len, string);
|
||||
|
||||
if (len < 0)
|
||||
- len = strlen (val);
|
||||
+ len_unsigned = strlen (val);
|
||||
+ else
|
||||
+ len_unsigned = len;
|
||||
|
||||
- end = pos + len;
|
||||
+ end = pos + len_unsigned;
|
||||
|
||||
if (end > string->len)
|
||||
g_string_maybe_expand (string, end - string->len);
|
||||
|
||||
- memcpy (string->str + pos, val, len);
|
||||
+ memcpy (string->str + pos, val, len_unsigned);
|
||||
|
||||
if (end > string->len)
|
||||
{
|
||||
--
|
||||
2.40.0
|
||||
29
meta/recipes-core/glib-2.0/glib-2.0/CVE-2025-4373-02.patch
Normal file
29
meta/recipes-core/glib-2.0/glib-2.0/CVE-2025-4373-02.patch
Normal file
@@ -0,0 +1,29 @@
|
||||
From 4d435bb4809793c445846db8fb87e3c9184c4703 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Bloomfield <peterbloomfield@bellsouth.net>
|
||||
Date: Fri, 11 Apr 2025 05:52:33 +0000
|
||||
Subject: [PATCH 2/2] gstring: Make len_unsigned unsigned
|
||||
|
||||
CVE: CVE-2025-4373
|
||||
|
||||
Upstream-Status: Backport [https://gitlab.gnome.org/GNOME/glib/-/commit/4d435bb4809793c445846db8fb87e3c9184c4703]
|
||||
|
||||
Signed-off-by: Praveen Kumar <praveen.kumar@windriver.com>
|
||||
---
|
||||
glib/gstring.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/glib/gstring.c b/glib/gstring.c
|
||||
index d6f8735..d097e2f 100644
|
||||
--- a/glib/gstring.c
|
||||
+++ b/glib/gstring.c
|
||||
@@ -873,7 +873,7 @@ g_string_overwrite_len (GString *string,
|
||||
const gchar *val,
|
||||
gssize len)
|
||||
{
|
||||
- gssize len_unsigned;
|
||||
+ gsize len_unsigned;
|
||||
gsize end;
|
||||
|
||||
g_return_val_if_fail (string != NULL, NULL);
|
||||
--
|
||||
2.40.0
|
||||
@@ -60,6 +60,8 @@ SRC_URI = "${GNOME_MIRROR}/glib/${SHRT_VER}/glib-${PV}.tar.xz \
|
||||
file://CVE-2025-3360-04.patch \
|
||||
file://CVE-2025-3360-05.patch \
|
||||
file://CVE-2025-3360-06.patch \
|
||||
file://CVE-2025-4373-01.patch \
|
||||
file://CVE-2025-4373-02.patch \
|
||||
"
|
||||
SRC_URI:append:class-native = " file://relocate-modules.patch"
|
||||
|
||||
|
||||
249
meta/recipes-core/glibc/glibc/0025-CVE-2025-4802.patch
Normal file
249
meta/recipes-core/glibc/glibc/0025-CVE-2025-4802.patch
Normal file
@@ -0,0 +1,249 @@
|
||||
From 32917e7ee972e7a01127a04454f12ef31dc312ed Mon Sep 17 00:00:00 2001
|
||||
From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
||||
Date: Wed, 11 Jun 2025 03:19:10 -0700
|
||||
Subject: [PATCH] elf: Ignore LD_LIBRARY_PATH and debug env var for setuid for
|
||||
static
|
||||
|
||||
It mimics the ld.so behavior.
|
||||
Checked on x86_64-linux-gnu.
|
||||
|
||||
[New Test Case]
|
||||
elf: Test case for bug 32976
|
||||
[https://sourceware.org/bugzilla/show_bug.cgi?id=32976]
|
||||
|
||||
Check that LD_LIBRARY_PATH is ignored for AT_SECURE statically
|
||||
linked binaries, using support_capture_subprogram_self_sgid.
|
||||
|
||||
Upstream-Status: Backport [https://sourceware.org/cgit/glibc/commit/?id=5451fa962cd0a90a0e2ec1d8910a559ace02bba0 &&
|
||||
https://sourceware.org/cgit/glibc/commit/?id=d8f7a79335b0d861c12c42aec94c04cd5bb181e2]
|
||||
|
||||
CVE: CVE-2025-4802
|
||||
|
||||
Co-authored-by: Florian Weimer <fweimer@redhat.com>
|
||||
Signed-off-by: Sunil Dora <sunilkumar.dora@windriver.com>
|
||||
---
|
||||
elf/Makefile | 4 ++
|
||||
elf/dl-support.c | 46 ++++++++---------
|
||||
elf/tst-dlopen-sgid-mod.c | 1 +
|
||||
elf/tst-dlopen-sgid.c | 104 ++++++++++++++++++++++++++++++++++++++
|
||||
4 files changed, 132 insertions(+), 23 deletions(-)
|
||||
create mode 100644 elf/tst-dlopen-sgid-mod.c
|
||||
create mode 100644 elf/tst-dlopen-sgid.c
|
||||
|
||||
diff --git a/elf/Makefile b/elf/Makefile
|
||||
index 61c41ea6..3ad66ab6 100644
|
||||
--- a/elf/Makefile
|
||||
+++ b/elf/Makefile
|
||||
@@ -274,6 +274,7 @@ tests-static-normal := \
|
||||
tst-array1-static \
|
||||
tst-array5-static \
|
||||
tst-dl-iter-static \
|
||||
+ tst-dlopen-sgid \
|
||||
tst-dst-static \
|
||||
tst-env-setuid \
|
||||
tst-env-setuid-tunables \
|
||||
@@ -807,6 +808,7 @@ modules-names = \
|
||||
tst-dlmopen-gethostbyname-mod \
|
||||
tst-dlmopen-twice-mod1 \
|
||||
tst-dlmopen-twice-mod2 \
|
||||
+ tst-dlopen-sgid-mod \
|
||||
tst-dlopenfaillinkmod \
|
||||
tst-dlopenfailmod1 \
|
||||
tst-dlopenfailmod2 \
|
||||
@@ -2913,3 +2915,5 @@ $(objpfx)tst-recursive-tls.out: \
|
||||
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15)
|
||||
$(objpfx)tst-recursive-tlsmod%.os: tst-recursive-tlsmodN.c
|
||||
$(compile-command.c) -DVAR=thread_$* -DFUNC=get_threadvar_$*
|
||||
+
|
||||
+$(objpfx)tst-dlopen-sgid.out: $(objpfx)tst-dlopen-sgid-mod.so
|
||||
diff --git a/elf/dl-support.c b/elf/dl-support.c
|
||||
index 09079c12..c2baed69 100644
|
||||
--- a/elf/dl-support.c
|
||||
+++ b/elf/dl-support.c
|
||||
@@ -272,8 +272,6 @@ _dl_non_dynamic_init (void)
|
||||
_dl_main_map.l_phdr = GL(dl_phdr);
|
||||
_dl_main_map.l_phnum = GL(dl_phnum);
|
||||
|
||||
- _dl_verbose = *(getenv ("LD_WARN") ?: "") == '\0' ? 0 : 1;
|
||||
-
|
||||
/* Set up the data structures for the system-supplied DSO early,
|
||||
so they can influence _dl_init_paths. */
|
||||
setup_vdso (NULL, NULL);
|
||||
@@ -281,27 +279,6 @@ _dl_non_dynamic_init (void)
|
||||
/* With vDSO setup we can initialize the function pointers. */
|
||||
setup_vdso_pointers ();
|
||||
|
||||
- /* Initialize the data structures for the search paths for shared
|
||||
- objects. */
|
||||
- _dl_init_paths (getenv ("LD_LIBRARY_PATH"), "LD_LIBRARY_PATH",
|
||||
- /* No glibc-hwcaps selection support in statically
|
||||
- linked binaries. */
|
||||
- NULL, NULL);
|
||||
-
|
||||
- /* Remember the last search directory added at startup. */
|
||||
- _dl_init_all_dirs = GL(dl_all_dirs);
|
||||
-
|
||||
- _dl_lazy = *(getenv ("LD_BIND_NOW") ?: "") == '\0';
|
||||
-
|
||||
- _dl_bind_not = *(getenv ("LD_BIND_NOT") ?: "") != '\0';
|
||||
-
|
||||
- _dl_dynamic_weak = *(getenv ("LD_DYNAMIC_WEAK") ?: "") == '\0';
|
||||
-
|
||||
- _dl_profile_output = getenv ("LD_PROFILE_OUTPUT");
|
||||
- if (_dl_profile_output == NULL || _dl_profile_output[0] == '\0')
|
||||
- _dl_profile_output
|
||||
- = &"/var/tmp\0/var/profile"[__libc_enable_secure ? 9 : 0];
|
||||
-
|
||||
if (__libc_enable_secure)
|
||||
{
|
||||
static const char unsecure_envvars[] =
|
||||
@@ -324,6 +301,29 @@ _dl_non_dynamic_init (void)
|
||||
#endif
|
||||
}
|
||||
|
||||
+ _dl_verbose = *(getenv ("LD_WARN") ?: "") == '\0' ? 0 : 1;
|
||||
+
|
||||
+ /* Initialize the data structures for the search paths for shared
|
||||
+ objects. */
|
||||
+ _dl_init_paths (getenv ("LD_LIBRARY_PATH"), "LD_LIBRARY_PATH",
|
||||
+ /* No glibc-hwcaps selection support in statically
|
||||
+ linked binaries. */
|
||||
+ NULL, NULL);
|
||||
+
|
||||
+ /* Remember the last search directory added at startup. */
|
||||
+ _dl_init_all_dirs = GL(dl_all_dirs);
|
||||
+
|
||||
+ _dl_lazy = *(getenv ("LD_BIND_NOW") ?: "") == '\0';
|
||||
+
|
||||
+ _dl_bind_not = *(getenv ("LD_BIND_NOT") ?: "") != '\0';
|
||||
+
|
||||
+ _dl_dynamic_weak = *(getenv ("LD_DYNAMIC_WEAK") ?: "") == '\0';
|
||||
+
|
||||
+ _dl_profile_output = getenv ("LD_PROFILE_OUTPUT");
|
||||
+ if (_dl_profile_output == NULL || _dl_profile_output[0] == '\0')
|
||||
+ _dl_profile_output
|
||||
+ = &"/var/tmp\0/var/profile"[__libc_enable_secure ? 9 : 0];
|
||||
+
|
||||
#ifdef DL_PLATFORM_INIT
|
||||
DL_PLATFORM_INIT;
|
||||
#endif
|
||||
diff --git a/elf/tst-dlopen-sgid-mod.c b/elf/tst-dlopen-sgid-mod.c
|
||||
new file mode 100644
|
||||
index 00000000..5eb79eef
|
||||
--- /dev/null
|
||||
+++ b/elf/tst-dlopen-sgid-mod.c
|
||||
@@ -0,0 +1 @@
|
||||
+/* Opening this object should not succeed. */
|
||||
diff --git a/elf/tst-dlopen-sgid.c b/elf/tst-dlopen-sgid.c
|
||||
new file mode 100644
|
||||
index 00000000..47829a40
|
||||
--- /dev/null
|
||||
+++ b/elf/tst-dlopen-sgid.c
|
||||
@@ -0,0 +1,104 @@
|
||||
+/* Test case for ignored LD_LIBRARY_PATH in static startug (bug 32976).
|
||||
+ Copyright (C) 2025 Free Software Foundation, Inc.
|
||||
+ This file is part of the GNU C Library.
|
||||
+
|
||||
+ The GNU C Library is free software; you can redistribute it and/or
|
||||
+ modify it under the terms of the GNU Lesser General Public
|
||||
+ License as published by the Free Software Foundation; either
|
||||
+ version 2.1 of the License, or (at your option) any later version.
|
||||
+
|
||||
+ The GNU C Library is distributed in the hope that it will be useful,
|
||||
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
+ Lesser General Public License for more details.
|
||||
+
|
||||
+ You should have received a copy of the GNU Lesser General Public
|
||||
+ License along with the GNU C Library; if not, see
|
||||
+ <https://www.gnu.org/licenses/>. */
|
||||
+
|
||||
+#include <dlfcn.h>
|
||||
+#include <gnu/lib-names.h>
|
||||
+#include <stddef.h>
|
||||
+#include <stdint.h>
|
||||
+#include <stdlib.h>
|
||||
+#include <string.h>
|
||||
+#include <support/capture_subprocess.h>
|
||||
+#include <support/check.h>
|
||||
+#include <support/support.h>
|
||||
+#include <support/temp_file.h>
|
||||
+#include <unistd.h>
|
||||
+
|
||||
+/* This is the name of our test object. Use a custom module for
|
||||
+ testing, so that this object does not get picked up from the system
|
||||
+ path. */
|
||||
+static const char dso_name[] = "tst-dlopen-sgid-mod.so";
|
||||
+
|
||||
+/* Used to mark the recursive invocation. */
|
||||
+static const char magic_argument[] = "run-actual-test";
|
||||
+
|
||||
+static int
|
||||
+do_test (void)
|
||||
+{
|
||||
+/* Pathname of the directory that receives the shared objects this
|
||||
+ test attempts to load. */
|
||||
+ char *libdir = support_create_temp_directory ("tst-dlopen-sgid-");
|
||||
+
|
||||
+ /* This is supposed to be ignored and stripped. */
|
||||
+ TEST_COMPARE (setenv ("LD_LIBRARY_PATH", libdir, 1), 0);
|
||||
+
|
||||
+ /* Copy of libc.so.6. */
|
||||
+ {
|
||||
+ char *from = xasprintf ("%s/%s", support_objdir_root, LIBC_SO);
|
||||
+ char *to = xasprintf ("%s/%s", libdir, LIBC_SO);
|
||||
+ add_temp_file (to);
|
||||
+ support_copy_file (from, to);
|
||||
+ free (to);
|
||||
+ free (from);
|
||||
+ }
|
||||
+
|
||||
+ /* Copy of the test object. */
|
||||
+ {
|
||||
+ char *from = xasprintf ("%s/elf/%s", support_objdir_root, dso_name);
|
||||
+ char *to = xasprintf ("%s/%s", libdir, dso_name);
|
||||
+ add_temp_file (to);
|
||||
+ support_copy_file (from, to);
|
||||
+ free (to);
|
||||
+ free (from);
|
||||
+ }
|
||||
+
|
||||
+ TEST_COMPARE (support_capture_subprogram_self_sgid (magic_argument), 0);
|
||||
+
|
||||
+ free (libdir);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
+alternative_main (int argc, char **argv)
|
||||
+{
|
||||
+ if (argc == 2 && strcmp (argv[1], magic_argument) == 0)
|
||||
+ {
|
||||
+ if (getgid () == getegid ())
|
||||
+ /* This can happen if the file system is mounted nosuid. */
|
||||
+ FAIL_UNSUPPORTED ("SGID failed: GID and EGID match (%jd)\n",
|
||||
+ (intmax_t) getgid ());
|
||||
+
|
||||
+ /* Should be removed due to SGID. */
|
||||
+ TEST_COMPARE_STRING (getenv ("LD_LIBRARY_PATH"), NULL);
|
||||
+
|
||||
+ TEST_VERIFY (dlopen (dso_name, RTLD_NOW) == NULL);
|
||||
+ {
|
||||
+ const char *message = dlerror ();
|
||||
+ TEST_COMPARE_STRING (message,
|
||||
+ "tst-dlopen-sgid-mod.so:"
|
||||
+ " cannot open shared object file:"
|
||||
+ " No such file or directory");
|
||||
+ }
|
||||
+
|
||||
+ support_record_failure_barrier ();
|
||||
+ exit (EXIT_SUCCESS);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+#define PREPARE alternative_main
|
||||
+#include <support/test-driver.c>
|
||||
--
|
||||
2.49.0
|
||||
|
||||
455
meta/recipes-core/glibc/glibc/0026-PR25847-1.patch
Normal file
455
meta/recipes-core/glibc/glibc/0026-PR25847-1.patch
Normal file
@@ -0,0 +1,455 @@
|
||||
From 31d9848830e496f57d4182b518467c4c63bfd4bd Mon Sep 17 00:00:00 2001
|
||||
From: Frank Barrus <frankbarrus_sw@shaggy.cc>
|
||||
Date: Mon, 16 Jun 2025 22:37:54 -0700
|
||||
Subject: [PATCH] pthreads NPTL: lost wakeup fix 2
|
||||
|
||||
This fixes the lost wakeup (from a bug in signal stealing) with a change
|
||||
in the usage of g_signals[] in the condition variable internal state.
|
||||
It also completely eliminates the concept and handling of signal stealing,
|
||||
as well as the need for signalers to block to wait for waiters to wake
|
||||
up every time there is a G1/G2 switch. This greatly reduces the average
|
||||
and maximum latency for pthread_cond_signal.
|
||||
|
||||
The g_signals[] field now contains a signal count that is relative to
|
||||
the current g1_start value. Since it is a 32-bit field, and the LSB is
|
||||
still reserved (though not currently used anymore), it has a 31-bit value
|
||||
that corresponds to the low 31 bits of the sequence number in g1_start.
|
||||
(since g1_start also has an LSB flag, this means bits 31:1 in g_signals
|
||||
correspond to bits 31:1 in g1_start, plus the current signal count)
|
||||
|
||||
By making the signal count relative to g1_start, there is no longer
|
||||
any ambiguity or A/B/A issue, and thus any checks before blocking,
|
||||
including the futex call itself, are guaranteed not to block if the G1/G2
|
||||
switch occurs, even if the signal count remains the same. This allows
|
||||
initially safely blocking in G2 until the switch to G1 occurs, and
|
||||
then transitioning from G1 to a new G1 or G2, and always being able to
|
||||
distinguish the state change. This removes the race condition and A/B/A
|
||||
problems that otherwise ocurred if a late (pre-empted) waiter were to
|
||||
resume just as the futex call attempted to block on g_signal since
|
||||
otherwise there was no last opportunity to re-check things like whether
|
||||
the current G1 group was already closed.
|
||||
|
||||
By fixing these issues, the signal stealing code can be eliminated,
|
||||
since there is no concept of signal stealing anymore. The code to block
|
||||
for all waiters to exit g_refs can also be removed, since any waiters
|
||||
that are still in the g_refs region can be guaranteed to safely wake
|
||||
up and exit. If there are still any left at this time, they are all
|
||||
sent one final futex wakeup to ensure that they are not blocked any
|
||||
longer, but there is no need for the signaller to block and wait for
|
||||
them to wake up and exit the g_refs region.
|
||||
|
||||
The signal count is then effectively "zeroed" but since it is now
|
||||
relative to g1_start, this is done by advancing it to a new value that
|
||||
can be observed by any pending blocking waiters. Any late waiters can
|
||||
always tell the difference, and can thus just cleanly exit if they are
|
||||
in a stale G1 or G2. They can never steal a signal from the current
|
||||
G1 if they are not in the current G1, since the signal value that has
|
||||
to match in the cmpxchg has the low 31 bits of the g1_start value
|
||||
contained in it, and that's first checked, and then it won't match if
|
||||
there's a G1/G2 change.
|
||||
|
||||
Note: the 31-bit sequence number used in g_signals is designed to
|
||||
handle wrap-around when checking the signal count, but if the entire
|
||||
31-bit wraparound (2 billion signals) occurs while there is still a
|
||||
late waiter that has not yet resumed, and it happens to then match
|
||||
the current g1_start low bits, and the pre-emption occurs after the
|
||||
normal "closed group" checks (which are 64-bit) but then hits the
|
||||
futex syscall and signal consuming code, then an A/B/A issue could
|
||||
still result and cause an incorrect assumption about whether it
|
||||
should block. This particular scenario seems unlikely in practice.
|
||||
Note that once awake from the futex, the waiter would notice the
|
||||
closed group before consuming the signal (since that's still a 64-bit
|
||||
check that would not be aliased in the wrap-around in g_signals),
|
||||
so the biggest impact would be blocking on the futex until the next
|
||||
full wakeup from a G1/G2 switch.
|
||||
|
||||
The following commits have been cherry-picked from Glibc master branch:
|
||||
Bug : https://sourceware.org/bugzilla/show_bug.cgi?id=25847
|
||||
|
||||
Upstream-Status: Backport
|
||||
[https://sourceware.org/git/?p=glibc.git;a=commit;h=1db84775f831a1494993ce9c118deaf9537cc50a]
|
||||
|
||||
Signed-off-by: Sunil Dora <sunilkumar.dora@windriver.com>
|
||||
---
|
||||
nptl/pthread_cond_common.c | 106 +++++++++------------------
|
||||
nptl/pthread_cond_wait.c | 144 ++++++++++++-------------------------
|
||||
2 files changed, 81 insertions(+), 169 deletions(-)
|
||||
|
||||
diff --git a/nptl/pthread_cond_common.c b/nptl/pthread_cond_common.c
|
||||
index fb035f72c3..8dd7037923 100644
|
||||
--- a/nptl/pthread_cond_common.c
|
||||
+++ b/nptl/pthread_cond_common.c
|
||||
@@ -201,7 +201,6 @@ static bool __attribute__ ((unused))
|
||||
__condvar_quiesce_and_switch_g1 (pthread_cond_t *cond, uint64_t wseq,
|
||||
unsigned int *g1index, int private)
|
||||
{
|
||||
- const unsigned int maxspin = 0;
|
||||
unsigned int g1 = *g1index;
|
||||
|
||||
/* If there is no waiter in G2, we don't do anything. The expression may
|
||||
@@ -222,85 +221,46 @@ __condvar_quiesce_and_switch_g1 (pthread_cond_t *cond, uint64_t wseq,
|
||||
* New waiters arriving concurrently with the group switching will all go
|
||||
into G2 until we atomically make the switch. Waiters existing in G2
|
||||
are not affected.
|
||||
- * Waiters in G1 will be closed out immediately by setting a flag in
|
||||
- __g_signals, which will prevent waiters from blocking using a futex on
|
||||
- __g_signals and also notifies them that the group is closed. As a
|
||||
- result, they will eventually remove their group reference, allowing us
|
||||
- to close switch group roles. */
|
||||
-
|
||||
- /* First, set the closed flag on __g_signals. This tells waiters that are
|
||||
- about to wait that they shouldn't do that anymore. This basically
|
||||
- serves as an advance notificaton of the upcoming change to __g1_start;
|
||||
- waiters interpret it as if __g1_start was larger than their waiter
|
||||
- sequence position. This allows us to change __g1_start after waiting
|
||||
- for all existing waiters with group references to leave, which in turn
|
||||
- makes recovery after stealing a signal simpler because it then can be
|
||||
- skipped if __g1_start indicates that the group is closed (otherwise,
|
||||
- we would have to recover always because waiters don't know how big their
|
||||
- groups are). Relaxed MO is fine. */
|
||||
- atomic_fetch_or_relaxed (cond->__data.__g_signals + g1, 1);
|
||||
-
|
||||
- /* Wait until there are no group references anymore. The fetch-or operation
|
||||
- injects us into the modification order of __g_refs; release MO ensures
|
||||
- that waiters incrementing __g_refs after our fetch-or see the previous
|
||||
- changes to __g_signals and to __g1_start that had to happen before we can
|
||||
- switch this G1 and alias with an older group (we have two groups, so
|
||||
- aliasing requires switching group roles twice). Note that nobody else
|
||||
- can have set the wake-request flag, so we do not have to act upon it.
|
||||
-
|
||||
- Also note that it is harmless if older waiters or waiters from this G1
|
||||
- get a group reference after we have quiesced the group because it will
|
||||
- remain closed for them either because of the closed flag in __g_signals
|
||||
- or the later update to __g1_start. New waiters will never arrive here
|
||||
- but instead continue to go into the still current G2. */
|
||||
- unsigned r = atomic_fetch_or_release (cond->__data.__g_refs + g1, 0);
|
||||
- while ((r >> 1) > 0)
|
||||
- {
|
||||
- for (unsigned int spin = maxspin; ((r >> 1) > 0) && (spin > 0); spin--)
|
||||
- {
|
||||
- /* TODO Back off. */
|
||||
- r = atomic_load_relaxed (cond->__data.__g_refs + g1);
|
||||
- }
|
||||
- if ((r >> 1) > 0)
|
||||
- {
|
||||
- /* There is still a waiter after spinning. Set the wake-request
|
||||
- flag and block. Relaxed MO is fine because this is just about
|
||||
- this futex word.
|
||||
-
|
||||
- Update r to include the set wake-request flag so that the upcoming
|
||||
- futex_wait only blocks if the flag is still set (otherwise, we'd
|
||||
- violate the basic client-side futex protocol). */
|
||||
- r = atomic_fetch_or_relaxed (cond->__data.__g_refs + g1, 1) | 1;
|
||||
-
|
||||
- if ((r >> 1) > 0)
|
||||
- futex_wait_simple (cond->__data.__g_refs + g1, r, private);
|
||||
- /* Reload here so we eventually see the most recent value even if we
|
||||
- do not spin. */
|
||||
- r = atomic_load_relaxed (cond->__data.__g_refs + g1);
|
||||
- }
|
||||
- }
|
||||
- /* Acquire MO so that we synchronize with the release operation that waiters
|
||||
- use to decrement __g_refs and thus happen after the waiters we waited
|
||||
- for. */
|
||||
- atomic_thread_fence_acquire ();
|
||||
+ * Waiters in G1 will be closed out immediately by the advancing of
|
||||
+ __g_signals to the next "lowseq" (low 31 bits of the new g1_start),
|
||||
+ which will prevent waiters from blocking using a futex on
|
||||
+ __g_signals since it provides enough signals for all possible
|
||||
+ remaining waiters. As a result, they can each consume a signal
|
||||
+ and they will eventually remove their group reference. */
|
||||
|
||||
/* Update __g1_start, which finishes closing this group. The value we add
|
||||
will never be negative because old_orig_size can only be zero when we
|
||||
switch groups the first time after a condvar was initialized, in which
|
||||
- case G1 will be at index 1 and we will add a value of 1. See above for
|
||||
- why this takes place after waiting for quiescence of the group.
|
||||
+ case G1 will be at index 1 and we will add a value of 1.
|
||||
Relaxed MO is fine because the change comes with no additional
|
||||
constraints that others would have to observe. */
|
||||
__condvar_add_g1_start_relaxed (cond,
|
||||
(old_orig_size << 1) + (g1 == 1 ? 1 : - 1));
|
||||
|
||||
- /* Now reopen the group, thus enabling waiters to again block using the
|
||||
- futex controlled by __g_signals. Release MO so that observers that see
|
||||
- no signals (and thus can block) also see the write __g1_start and thus
|
||||
- that this is now a new group (see __pthread_cond_wait_common for the
|
||||
- matching acquire MO loads). */
|
||||
- atomic_store_release (cond->__data.__g_signals + g1, 0);
|
||||
-
|
||||
+ unsigned int lowseq = ((old_g1_start + old_orig_size) << 1) & ~1U;
|
||||
+
|
||||
+ /* If any waiters still hold group references (and thus could be blocked),
|
||||
+ then wake them all up now and prevent any running ones from blocking.
|
||||
+ This is effectively a catch-all for any possible current or future
|
||||
+ bugs that can allow the group size to reach 0 before all G1 waiters
|
||||
+ have been awakened or at least given signals to consume, or any
|
||||
+ other case that can leave blocked (or about to block) older waiters.. */
|
||||
+ if ((atomic_fetch_or_release (cond->__data.__g_refs + g1, 0) >> 1) > 0)
|
||||
+ {
|
||||
+ /* First advance signals to the end of the group (i.e. enough signals
|
||||
+ for the entire G1 group) to ensure that waiters which have not
|
||||
+ yet blocked in the futex will not block.
|
||||
+ Note that in the vast majority of cases, this should never
|
||||
+ actually be necessary, since __g_signals will have enough
|
||||
+ signals for the remaining g_refs waiters. As an optimization,
|
||||
+ we could check this first before proceeding, although that
|
||||
+ could still leave the potential for futex lost wakeup bugs
|
||||
+ if the signal count was non-zero but the futex wakeup
|
||||
+ was somehow lost. */
|
||||
+ atomic_store_release (cond->__data.__g_signals + g1, lowseq);
|
||||
+
|
||||
+ futex_wake (cond->__data.__g_signals + g1, INT_MAX, private);
|
||||
+ }
|
||||
/* At this point, the old G1 is now a valid new G2 (but not in use yet).
|
||||
No old waiter can neither grab a signal nor acquire a reference without
|
||||
noticing that __g1_start is larger.
|
||||
@@ -311,6 +271,10 @@ __condvar_quiesce_and_switch_g1 (pthread_cond_t *cond, uint64_t wseq,
|
||||
g1 ^= 1;
|
||||
*g1index ^= 1;
|
||||
|
||||
+ /* Now advance the new G1 g_signals to the new lowseq, giving it
|
||||
+ an effective signal count of 0 to start. */
|
||||
+ atomic_store_release (cond->__data.__g_signals + g1, lowseq);
|
||||
+
|
||||
/* These values are just observed by signalers, and thus protected by the
|
||||
lock. */
|
||||
unsigned int orig_size = wseq - (old_g1_start + old_orig_size);
|
||||
diff --git a/nptl/pthread_cond_wait.c b/nptl/pthread_cond_wait.c
|
||||
index 20c348a503..1cb3dbf7b0 100644
|
||||
--- a/nptl/pthread_cond_wait.c
|
||||
+++ b/nptl/pthread_cond_wait.c
|
||||
@@ -238,9 +238,7 @@ __condvar_cleanup_waiting (void *arg)
|
||||
signaled), and a reference count.
|
||||
|
||||
The group reference count is used to maintain the number of waiters that
|
||||
- are using the group's futex. Before a group can change its role, the
|
||||
- reference count must show that no waiters are using the futex anymore; this
|
||||
- prevents ABA issues on the futex word.
|
||||
+ are using the group's futex.
|
||||
|
||||
To represent which intervals in the waiter sequence the groups cover (and
|
||||
thus also which group slot contains G1 or G2), we use a 64b counter to
|
||||
@@ -300,11 +298,12 @@ __condvar_cleanup_waiting (void *arg)
|
||||
last reference.
|
||||
* Reference count used by waiters concurrently with signalers that have
|
||||
acquired the condvar-internal lock.
|
||||
- __g_signals: The number of signals that can still be consumed.
|
||||
+ __g_signals: The number of signals that can still be consumed, relative to
|
||||
+ the current g1_start. (i.e. bits 31 to 1 of __g_signals are bits
|
||||
+ 31 to 1 of g1_start with the signal count added)
|
||||
* Used as a futex word by waiters. Used concurrently by waiters and
|
||||
signalers.
|
||||
- * LSB is true iff this group has been completely signaled (i.e., it is
|
||||
- closed).
|
||||
+ * LSB is currently reserved and 0.
|
||||
__g_size: Waiters remaining in this group (i.e., which have not been
|
||||
signaled yet.
|
||||
* Accessed by signalers and waiters that cancel waiting (both do so only
|
||||
@@ -328,18 +327,6 @@ __condvar_cleanup_waiting (void *arg)
|
||||
sufficient because if a waiter can see a sufficiently large value, it could
|
||||
have also consume a signal in the waiters group.
|
||||
|
||||
- Waiters try to grab a signal from __g_signals without holding a reference
|
||||
- count, which can lead to stealing a signal from a more recent group after
|
||||
- their own group was already closed. They cannot always detect whether they
|
||||
- in fact did because they do not know when they stole, but they can
|
||||
- conservatively add a signal back to the group they stole from; if they
|
||||
- did so unnecessarily, all that happens is a spurious wake-up. To make this
|
||||
- even less likely, __g1_start contains the index of the current g2 too,
|
||||
- which allows waiters to check if there aliasing on the group slots; if
|
||||
- there wasn't, they didn't steal from the current G1, which means that the
|
||||
- G1 they stole from must have been already closed and they do not need to
|
||||
- fix anything.
|
||||
-
|
||||
It is essential that the last field in pthread_cond_t is __g_signals[1]:
|
||||
The previous condvar used a pointer-sized field in pthread_cond_t, so a
|
||||
PTHREAD_COND_INITIALIZER from that condvar implementation might only
|
||||
@@ -435,6 +422,9 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex,
|
||||
{
|
||||
while (1)
|
||||
{
|
||||
+ uint64_t g1_start = __condvar_load_g1_start_relaxed (cond);
|
||||
+ unsigned int lowseq = (g1_start & 1) == g ? signals : g1_start & ~1U;
|
||||
+
|
||||
/* Spin-wait first.
|
||||
Note that spinning first without checking whether a timeout
|
||||
passed might lead to what looks like a spurious wake-up even
|
||||
@@ -446,35 +436,45 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex,
|
||||
having to compare against the current time seems to be the right
|
||||
choice from a performance perspective for most use cases. */
|
||||
unsigned int spin = maxspin;
|
||||
- while (signals == 0 && spin > 0)
|
||||
+ while (spin > 0 && ((int)(signals - lowseq) < 2))
|
||||
{
|
||||
/* Check that we are not spinning on a group that's already
|
||||
closed. */
|
||||
- if (seq < (__condvar_load_g1_start_relaxed (cond) >> 1))
|
||||
- goto done;
|
||||
+ if (seq < (g1_start >> 1))
|
||||
+ break;
|
||||
|
||||
/* TODO Back off. */
|
||||
|
||||
/* Reload signals. See above for MO. */
|
||||
signals = atomic_load_acquire (cond->__data.__g_signals + g);
|
||||
+ g1_start = __condvar_load_g1_start_relaxed (cond);
|
||||
+ lowseq = (g1_start & 1) == g ? signals : g1_start & ~1U;
|
||||
spin--;
|
||||
}
|
||||
|
||||
- /* If our group will be closed as indicated by the flag on signals,
|
||||
- don't bother grabbing a signal. */
|
||||
- if (signals & 1)
|
||||
- goto done;
|
||||
-
|
||||
- /* If there is an available signal, don't block. */
|
||||
- if (signals != 0)
|
||||
+ if (seq < (g1_start >> 1))
|
||||
+ {
|
||||
+ /* If the group is closed already,
|
||||
+ then this waiter originally had enough extra signals to
|
||||
+ consume, up until the time its group was closed. */
|
||||
+ goto done;
|
||||
+ }
|
||||
+
|
||||
+ /* If there is an available signal, don't block.
|
||||
+ If __g1_start has advanced at all, then we must be in G1
|
||||
+ by now, perhaps in the process of switching back to an older
|
||||
+ G2, but in either case we're allowed to consume the available
|
||||
+ signal and should not block anymore. */
|
||||
+ if ((int)(signals - lowseq) >= 2)
|
||||
break;
|
||||
|
||||
/* No signals available after spinning, so prepare to block.
|
||||
We first acquire a group reference and use acquire MO for that so
|
||||
that we synchronize with the dummy read-modify-write in
|
||||
__condvar_quiesce_and_switch_g1 if we read from that. In turn,
|
||||
- in this case this will make us see the closed flag on __g_signals
|
||||
- that designates a concurrent attempt to reuse the group's slot.
|
||||
+ in this case this will make us see the advancement of __g_signals
|
||||
+ to the upcoming new g1_start that occurs with a concurrent
|
||||
+ attempt to reuse the group's slot.
|
||||
We use acquire MO for the __g_signals check to make the
|
||||
__g1_start check work (see spinning above).
|
||||
Note that the group reference acquisition will not mask the
|
||||
@@ -482,15 +482,24 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex,
|
||||
an atomic read-modify-write operation and thus extend the release
|
||||
sequence. */
|
||||
atomic_fetch_add_acquire (cond->__data.__g_refs + g, 2);
|
||||
- if (((atomic_load_acquire (cond->__data.__g_signals + g) & 1) != 0)
|
||||
- || (seq < (__condvar_load_g1_start_relaxed (cond) >> 1)))
|
||||
+ signals = atomic_load_acquire (cond->__data.__g_signals + g);
|
||||
+ g1_start = __condvar_load_g1_start_relaxed (cond);
|
||||
+ lowseq = (g1_start & 1) == g ? signals : g1_start & ~1U;
|
||||
+
|
||||
+ if (seq < (g1_start >> 1))
|
||||
{
|
||||
- /* Our group is closed. Wake up any signalers that might be
|
||||
- waiting. */
|
||||
+ /* group is closed already, so don't block */
|
||||
__condvar_dec_grefs (cond, g, private);
|
||||
goto done;
|
||||
}
|
||||
|
||||
+ if ((int)(signals - lowseq) >= 2)
|
||||
+ {
|
||||
+ /* a signal showed up or G1/G2 switched after we grabbed the refcount */
|
||||
+ __condvar_dec_grefs (cond, g, private);
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
// Now block.
|
||||
struct _pthread_cleanup_buffer buffer;
|
||||
struct _condvar_cleanup_buffer cbuffer;
|
||||
@@ -501,7 +510,7 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex,
|
||||
__pthread_cleanup_push (&buffer, __condvar_cleanup_waiting, &cbuffer);
|
||||
|
||||
err = __futex_abstimed_wait_cancelable64 (
|
||||
- cond->__data.__g_signals + g, 0, clockid, abstime, private);
|
||||
+ cond->__data.__g_signals + g, signals, clockid, abstime, private);
|
||||
|
||||
__pthread_cleanup_pop (&buffer, 0);
|
||||
|
||||
@@ -524,6 +533,8 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex,
|
||||
signals = atomic_load_acquire (cond->__data.__g_signals + g);
|
||||
}
|
||||
|
||||
+ if (seq < (__condvar_load_g1_start_relaxed (cond) >> 1))
|
||||
+ goto done;
|
||||
}
|
||||
/* Try to grab a signal. Use acquire MO so that we see an up-to-date value
|
||||
of __g1_start below (see spinning above for a similar case). In
|
||||
@@ -532,69 +543,6 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex,
|
||||
while (!atomic_compare_exchange_weak_acquire (cond->__data.__g_signals + g,
|
||||
&signals, signals - 2));
|
||||
|
||||
- /* We consumed a signal but we could have consumed from a more recent group
|
||||
- that aliased with ours due to being in the same group slot. If this
|
||||
- might be the case our group must be closed as visible through
|
||||
- __g1_start. */
|
||||
- uint64_t g1_start = __condvar_load_g1_start_relaxed (cond);
|
||||
- if (seq < (g1_start >> 1))
|
||||
- {
|
||||
- /* We potentially stole a signal from a more recent group but we do not
|
||||
- know which group we really consumed from.
|
||||
- We do not care about groups older than current G1 because they are
|
||||
- closed; we could have stolen from these, but then we just add a
|
||||
- spurious wake-up for the current groups.
|
||||
- We will never steal a signal from current G2 that was really intended
|
||||
- for G2 because G2 never receives signals (until it becomes G1). We
|
||||
- could have stolen a signal from G2 that was conservatively added by a
|
||||
- previous waiter that also thought it stole a signal -- but given that
|
||||
- that signal was added unnecessarily, it's not a problem if we steal
|
||||
- it.
|
||||
- Thus, the remaining case is that we could have stolen from the current
|
||||
- G1, where "current" means the __g1_start value we observed. However,
|
||||
- if the current G1 does not have the same slot index as we do, we did
|
||||
- not steal from it and do not need to undo that. This is the reason
|
||||
- for putting a bit with G2's index into__g1_start as well. */
|
||||
- if (((g1_start & 1) ^ 1) == g)
|
||||
- {
|
||||
- /* We have to conservatively undo our potential mistake of stealing
|
||||
- a signal. We can stop trying to do that when the current G1
|
||||
- changes because other spinning waiters will notice this too and
|
||||
- __condvar_quiesce_and_switch_g1 has checked that there are no
|
||||
- futex waiters anymore before switching G1.
|
||||
- Relaxed MO is fine for the __g1_start load because we need to
|
||||
- merely be able to observe this fact and not have to observe
|
||||
- something else as well.
|
||||
- ??? Would it help to spin for a little while to see whether the
|
||||
- current G1 gets closed? This might be worthwhile if the group is
|
||||
- small or close to being closed. */
|
||||
- unsigned int s = atomic_load_relaxed (cond->__data.__g_signals + g);
|
||||
- while (__condvar_load_g1_start_relaxed (cond) == g1_start)
|
||||
- {
|
||||
- /* Try to add a signal. We don't need to acquire the lock
|
||||
- because at worst we can cause a spurious wake-up. If the
|
||||
- group is in the process of being closed (LSB is true), this
|
||||
- has an effect similar to us adding a signal. */
|
||||
- if (((s & 1) != 0)
|
||||
- || atomic_compare_exchange_weak_relaxed
|
||||
- (cond->__data.__g_signals + g, &s, s + 2))
|
||||
- {
|
||||
- /* If we added a signal, we also need to add a wake-up on
|
||||
- the futex. We also need to do that if we skipped adding
|
||||
- a signal because the group is being closed because
|
||||
- while __condvar_quiesce_and_switch_g1 could have closed
|
||||
- the group, it might stil be waiting for futex waiters to
|
||||
- leave (and one of those waiters might be the one we stole
|
||||
- the signal from, which cause it to block using the
|
||||
- futex). */
|
||||
- futex_wake (cond->__data.__g_signals + g, 1, private);
|
||||
- break;
|
||||
- }
|
||||
- /* TODO Back off. */
|
||||
- }
|
||||
- }
|
||||
- }
|
||||
-
|
||||
done:
|
||||
|
||||
/* Confirm that we have been woken. We do that before acquiring the mutex
|
||||
--
|
||||
2.49.0
|
||||
|
||||
144
meta/recipes-core/glibc/glibc/0026-PR25847-2.patch
Normal file
144
meta/recipes-core/glibc/glibc/0026-PR25847-2.patch
Normal file
@@ -0,0 +1,144 @@
|
||||
From 6aab1191e35a3da66e8c49d95178a9d77c119a1f Mon Sep 17 00:00:00 2001
|
||||
From: Malte Skarupke <malteskarupke@fastmail.fm>
|
||||
Date: Mon, 16 Jun 2025 23:17:53 -0700
|
||||
Subject: [PATCH] nptl: Update comments and indentation for new condvar
|
||||
implementation
|
||||
|
||||
Some comments were wrong after the most recent commit. This fixes that.
|
||||
Also fixing indentation where it was using spaces instead of tabs.
|
||||
|
||||
The following commits have been cherry-picked from Glibc master branch:
|
||||
Bug : https://sourceware.org/bugzilla/show_bug.cgi?id=25847
|
||||
|
||||
Upstream-Status: Backport
|
||||
[https://sourceware.org/git/?p=glibc.git;a=commit;h=0cc973160c23bb67f895bc887dd6942d29f8fee3]
|
||||
|
||||
Signed-off-by: Sunil Dora <sunilkumar.dora@windriver.com>
|
||||
---
|
||||
nptl/pthread_cond_common.c | 5 +++--
|
||||
nptl/pthread_cond_wait.c | 39 +++++++++++++++++++-------------------
|
||||
2 files changed, 22 insertions(+), 22 deletions(-)
|
||||
|
||||
diff --git a/nptl/pthread_cond_common.c b/nptl/pthread_cond_common.c
|
||||
index 8dd7037923..306a207dd6 100644
|
||||
--- a/nptl/pthread_cond_common.c
|
||||
+++ b/nptl/pthread_cond_common.c
|
||||
@@ -221,8 +221,9 @@ __condvar_quiesce_and_switch_g1 (pthread_cond_t *cond, uint64_t wseq,
|
||||
* New waiters arriving concurrently with the group switching will all go
|
||||
into G2 until we atomically make the switch. Waiters existing in G2
|
||||
are not affected.
|
||||
- * Waiters in G1 will be closed out immediately by the advancing of
|
||||
- __g_signals to the next "lowseq" (low 31 bits of the new g1_start),
|
||||
+ * Waiters in G1 have already received a signal and been woken. If they
|
||||
+ haven't woken yet, they will be closed out immediately by the advancing
|
||||
+ of __g_signals to the next "lowseq" (low 31 bits of the new g1_start),
|
||||
which will prevent waiters from blocking using a futex on
|
||||
__g_signals since it provides enough signals for all possible
|
||||
remaining waiters. As a result, they can each consume a signal
|
||||
diff --git a/nptl/pthread_cond_wait.c b/nptl/pthread_cond_wait.c
|
||||
index 1cb3dbf7b0..cee1968756 100644
|
||||
--- a/nptl/pthread_cond_wait.c
|
||||
+++ b/nptl/pthread_cond_wait.c
|
||||
@@ -249,7 +249,7 @@ __condvar_cleanup_waiting (void *arg)
|
||||
figure out whether they are in a group that has already been completely
|
||||
signaled (i.e., if the current G1 starts at a later position that the
|
||||
waiter's position). Waiters cannot determine whether they are currently
|
||||
- in G2 or G1 -- but they do not have too because all they are interested in
|
||||
+ in G2 or G1 -- but they do not have to because all they are interested in
|
||||
is whether there are available signals, and they always start in G2 (whose
|
||||
group slot they know because of the bit in the waiter sequence. Signalers
|
||||
will simply fill the right group until it is completely signaled and can
|
||||
@@ -412,7 +412,7 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex,
|
||||
}
|
||||
|
||||
/* Now wait until a signal is available in our group or it is closed.
|
||||
- Acquire MO so that if we observe a value of zero written after group
|
||||
+ Acquire MO so that if we observe (signals == lowseq) after group
|
||||
switching in __condvar_quiesce_and_switch_g1, we synchronize with that
|
||||
store and will see the prior update of __g1_start done while switching
|
||||
groups too. */
|
||||
@@ -422,8 +422,8 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex,
|
||||
{
|
||||
while (1)
|
||||
{
|
||||
- uint64_t g1_start = __condvar_load_g1_start_relaxed (cond);
|
||||
- unsigned int lowseq = (g1_start & 1) == g ? signals : g1_start & ~1U;
|
||||
+ uint64_t g1_start = __condvar_load_g1_start_relaxed (cond);
|
||||
+ unsigned int lowseq = (g1_start & 1) == g ? signals : g1_start & ~1U;
|
||||
|
||||
/* Spin-wait first.
|
||||
Note that spinning first without checking whether a timeout
|
||||
@@ -447,21 +447,21 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex,
|
||||
|
||||
/* Reload signals. See above for MO. */
|
||||
signals = atomic_load_acquire (cond->__data.__g_signals + g);
|
||||
- g1_start = __condvar_load_g1_start_relaxed (cond);
|
||||
- lowseq = (g1_start & 1) == g ? signals : g1_start & ~1U;
|
||||
+ g1_start = __condvar_load_g1_start_relaxed (cond);
|
||||
+ lowseq = (g1_start & 1) == g ? signals : g1_start & ~1U;
|
||||
spin--;
|
||||
}
|
||||
|
||||
- if (seq < (g1_start >> 1))
|
||||
+ if (seq < (g1_start >> 1))
|
||||
{
|
||||
- /* If the group is closed already,
|
||||
+ /* If the group is closed already,
|
||||
then this waiter originally had enough extra signals to
|
||||
consume, up until the time its group was closed. */
|
||||
goto done;
|
||||
- }
|
||||
+ }
|
||||
|
||||
/* If there is an available signal, don't block.
|
||||
- If __g1_start has advanced at all, then we must be in G1
|
||||
+ If __g1_start has advanced at all, then we must be in G1
|
||||
by now, perhaps in the process of switching back to an older
|
||||
G2, but in either case we're allowed to consume the available
|
||||
signal and should not block anymore. */
|
||||
@@ -483,22 +483,23 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex,
|
||||
sequence. */
|
||||
atomic_fetch_add_acquire (cond->__data.__g_refs + g, 2);
|
||||
signals = atomic_load_acquire (cond->__data.__g_signals + g);
|
||||
- g1_start = __condvar_load_g1_start_relaxed (cond);
|
||||
- lowseq = (g1_start & 1) == g ? signals : g1_start & ~1U;
|
||||
+ g1_start = __condvar_load_g1_start_relaxed (cond);
|
||||
+ lowseq = (g1_start & 1) == g ? signals : g1_start & ~1U;
|
||||
|
||||
- if (seq < (g1_start >> 1))
|
||||
+ if (seq < (g1_start >> 1))
|
||||
{
|
||||
- /* group is closed already, so don't block */
|
||||
+ /* group is closed already, so don't block */
|
||||
__condvar_dec_grefs (cond, g, private);
|
||||
goto done;
|
||||
}
|
||||
|
||||
if ((int)(signals - lowseq) >= 2)
|
||||
{
|
||||
- /* a signal showed up or G1/G2 switched after we grabbed the refcount */
|
||||
+ /* a signal showed up or G1/G2 switched after we grabbed the
|
||||
+ refcount */
|
||||
__condvar_dec_grefs (cond, g, private);
|
||||
break;
|
||||
- }
|
||||
+ }
|
||||
|
||||
// Now block.
|
||||
struct _pthread_cleanup_buffer buffer;
|
||||
@@ -536,10 +537,8 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex,
|
||||
if (seq < (__condvar_load_g1_start_relaxed (cond) >> 1))
|
||||
goto done;
|
||||
}
|
||||
- /* Try to grab a signal. Use acquire MO so that we see an up-to-date value
|
||||
- of __g1_start below (see spinning above for a similar case). In
|
||||
- particular, if we steal from a more recent group, we will also see a
|
||||
- more recent __g1_start below. */
|
||||
+ /* Try to grab a signal. See above for MO. (if we do another loop
|
||||
+ iteration we need to see the correct value of g1_start) */
|
||||
while (!atomic_compare_exchange_weak_acquire (cond->__data.__g_signals + g,
|
||||
&signals, signals - 2));
|
||||
|
||||
--
|
||||
2.49.0
|
||||
|
||||
77
meta/recipes-core/glibc/glibc/0026-PR25847-3.patch
Normal file
77
meta/recipes-core/glibc/glibc/0026-PR25847-3.patch
Normal file
@@ -0,0 +1,77 @@
|
||||
From 28a5082045429fdc5a4744d45fdc5b5202528eaa Mon Sep 17 00:00:00 2001
|
||||
From: Malte Skarupke <malteskarupke@fastmail.fm>
|
||||
Date: Mon, 16 Jun 2025 23:29:49 -0700
|
||||
Subject: [PATCH] nptl: Remove unnecessary catch-all-wake in condvar group
|
||||
switch
|
||||
|
||||
This wake is unnecessary. We only switch groups after every sleeper in a group
|
||||
has been woken. Sure, they may take a while to actually wake up and may still
|
||||
hold a reference, but waking them a second time doesn't speed that up. Instead
|
||||
this just makes the code more complicated and may hide problems.
|
||||
|
||||
In particular this safety wake wouldn't even have helped with the bug that was
|
||||
fixed by Barrus' patch: The bug there was that pthread_cond_signal would not
|
||||
switch g1 when it should, so we wouldn't even have entered this code path.
|
||||
|
||||
The following commits have been cherry-picked from Glibc master branch:
|
||||
Bug : https://sourceware.org/bugzilla/show_bug.cgi?id=25847
|
||||
|
||||
Upstream-Status: Backport
|
||||
[https://sourceware.org/git/?p=glibc.git;a=commit;h=b42cc6af11062c260c7dfa91f1c89891366fed3e]
|
||||
|
||||
Signed-off-by: Sunil Dora <sunilkumar.dora@windriver.com>
|
||||
---
|
||||
nptl/pthread_cond_common.c | 30 +-----------------------------
|
||||
1 file changed, 1 insertion(+), 29 deletions(-)
|
||||
|
||||
diff --git a/nptl/pthread_cond_common.c b/nptl/pthread_cond_common.c
|
||||
index 306a207dd6..f976a533a1 100644
|
||||
--- a/nptl/pthread_cond_common.c
|
||||
+++ b/nptl/pthread_cond_common.c
|
||||
@@ -221,13 +221,7 @@ __condvar_quiesce_and_switch_g1 (pthread_cond_t *cond, uint64_t wseq,
|
||||
* New waiters arriving concurrently with the group switching will all go
|
||||
into G2 until we atomically make the switch. Waiters existing in G2
|
||||
are not affected.
|
||||
- * Waiters in G1 have already received a signal and been woken. If they
|
||||
- haven't woken yet, they will be closed out immediately by the advancing
|
||||
- of __g_signals to the next "lowseq" (low 31 bits of the new g1_start),
|
||||
- which will prevent waiters from blocking using a futex on
|
||||
- __g_signals since it provides enough signals for all possible
|
||||
- remaining waiters. As a result, they can each consume a signal
|
||||
- and they will eventually remove their group reference. */
|
||||
+ * Waiters in G1 have already received a signal and been woken. */
|
||||
|
||||
/* Update __g1_start, which finishes closing this group. The value we add
|
||||
will never be negative because old_orig_size can only be zero when we
|
||||
@@ -240,28 +234,6 @@ __condvar_quiesce_and_switch_g1 (pthread_cond_t *cond, uint64_t wseq,
|
||||
|
||||
unsigned int lowseq = ((old_g1_start + old_orig_size) << 1) & ~1U;
|
||||
|
||||
- /* If any waiters still hold group references (and thus could be blocked),
|
||||
- then wake them all up now and prevent any running ones from blocking.
|
||||
- This is effectively a catch-all for any possible current or future
|
||||
- bugs that can allow the group size to reach 0 before all G1 waiters
|
||||
- have been awakened or at least given signals to consume, or any
|
||||
- other case that can leave blocked (or about to block) older waiters.. */
|
||||
- if ((atomic_fetch_or_release (cond->__data.__g_refs + g1, 0) >> 1) > 0)
|
||||
- {
|
||||
- /* First advance signals to the end of the group (i.e. enough signals
|
||||
- for the entire G1 group) to ensure that waiters which have not
|
||||
- yet blocked in the futex will not block.
|
||||
- Note that in the vast majority of cases, this should never
|
||||
- actually be necessary, since __g_signals will have enough
|
||||
- signals for the remaining g_refs waiters. As an optimization,
|
||||
- we could check this first before proceeding, although that
|
||||
- could still leave the potential for futex lost wakeup bugs
|
||||
- if the signal count was non-zero but the futex wakeup
|
||||
- was somehow lost. */
|
||||
- atomic_store_release (cond->__data.__g_signals + g1, lowseq);
|
||||
-
|
||||
- futex_wake (cond->__data.__g_signals + g1, INT_MAX, private);
|
||||
- }
|
||||
/* At this point, the old G1 is now a valid new G2 (but not in use yet).
|
||||
No old waiter can neither grab a signal nor acquire a reference without
|
||||
noticing that __g1_start is larger.
|
||||
--
|
||||
2.49.0
|
||||
|
||||
117
meta/recipes-core/glibc/glibc/0026-PR25847-4.patch
Normal file
117
meta/recipes-core/glibc/glibc/0026-PR25847-4.patch
Normal file
@@ -0,0 +1,117 @@
|
||||
From 16b9af737c77b153fca4f36cbdbe94f7416c0b42 Mon Sep 17 00:00:00 2001
|
||||
From: Malte Skarupke <malteskarupke@fastmail.fm>
|
||||
Date: Mon, 16 Jun 2025 23:38:40 -0700
|
||||
Subject: [PATCH] nptl: Remove unnecessary quadruple check in pthread_cond_wait
|
||||
|
||||
pthread_cond_wait was checking whether it was in a closed group no less than
|
||||
four times. Checking once is enough. Here are the four checks:
|
||||
|
||||
1. While spin-waiting. This was dead code: maxspin is set to 0 and has been
|
||||
for years.
|
||||
2. Before deciding to go to sleep, and before incrementing grefs: I kept this
|
||||
3. After incrementing grefs. There is no reason to think that the group would
|
||||
close while we do an atomic increment. Obviously it could close at any
|
||||
point, but that doesn't mean we have to recheck after every step. This
|
||||
check was equally good as check 2, except it has to do more work.
|
||||
4. When we find ourselves in a group that has a signal. We only get here after
|
||||
we check that we're not in a closed group. There is no need to check again.
|
||||
The check would only have helped in cases where the compare_exchange in the
|
||||
next line would also have failed. Relying on the compare_exchange is fine.
|
||||
|
||||
Removing the duplicate checks clarifies the code.
|
||||
|
||||
The following commits have been cherry-picked from Glibc master branch:
|
||||
Bug : https://sourceware.org/bugzilla/show_bug.cgi?id=25847
|
||||
|
||||
Upstream-Status: Backport
|
||||
[https://sourceware.org/git/?p=glibc.git;a=commit;h=4f7b051f8ee3feff1b53b27a906f245afaa9cee1]
|
||||
|
||||
Signed-off-by: Sunil Dora <sunilkumar.dora@windriver.com>
|
||||
---
|
||||
nptl/pthread_cond_wait.c | 49 ----------------------------------------
|
||||
1 file changed, 49 deletions(-)
|
||||
|
||||
diff --git a/nptl/pthread_cond_wait.c b/nptl/pthread_cond_wait.c
|
||||
index cee1968756..47e834cade 100644
|
||||
--- a/nptl/pthread_cond_wait.c
|
||||
+++ b/nptl/pthread_cond_wait.c
|
||||
@@ -366,7 +366,6 @@ static __always_inline int
|
||||
__pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex,
|
||||
clockid_t clockid, const struct __timespec64 *abstime)
|
||||
{
|
||||
- const int maxspin = 0;
|
||||
int err;
|
||||
int result = 0;
|
||||
|
||||
@@ -425,33 +424,6 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex,
|
||||
uint64_t g1_start = __condvar_load_g1_start_relaxed (cond);
|
||||
unsigned int lowseq = (g1_start & 1) == g ? signals : g1_start & ~1U;
|
||||
|
||||
- /* Spin-wait first.
|
||||
- Note that spinning first without checking whether a timeout
|
||||
- passed might lead to what looks like a spurious wake-up even
|
||||
- though we should return ETIMEDOUT (e.g., if the caller provides
|
||||
- an absolute timeout that is clearly in the past). However,
|
||||
- (1) spurious wake-ups are allowed, (2) it seems unlikely that a
|
||||
- user will (ab)use pthread_cond_wait as a check for whether a
|
||||
- point in time is in the past, and (3) spinning first without
|
||||
- having to compare against the current time seems to be the right
|
||||
- choice from a performance perspective for most use cases. */
|
||||
- unsigned int spin = maxspin;
|
||||
- while (spin > 0 && ((int)(signals - lowseq) < 2))
|
||||
- {
|
||||
- /* Check that we are not spinning on a group that's already
|
||||
- closed. */
|
||||
- if (seq < (g1_start >> 1))
|
||||
- break;
|
||||
-
|
||||
- /* TODO Back off. */
|
||||
-
|
||||
- /* Reload signals. See above for MO. */
|
||||
- signals = atomic_load_acquire (cond->__data.__g_signals + g);
|
||||
- g1_start = __condvar_load_g1_start_relaxed (cond);
|
||||
- lowseq = (g1_start & 1) == g ? signals : g1_start & ~1U;
|
||||
- spin--;
|
||||
- }
|
||||
-
|
||||
if (seq < (g1_start >> 1))
|
||||
{
|
||||
/* If the group is closed already,
|
||||
@@ -482,24 +454,6 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex,
|
||||
an atomic read-modify-write operation and thus extend the release
|
||||
sequence. */
|
||||
atomic_fetch_add_acquire (cond->__data.__g_refs + g, 2);
|
||||
- signals = atomic_load_acquire (cond->__data.__g_signals + g);
|
||||
- g1_start = __condvar_load_g1_start_relaxed (cond);
|
||||
- lowseq = (g1_start & 1) == g ? signals : g1_start & ~1U;
|
||||
-
|
||||
- if (seq < (g1_start >> 1))
|
||||
- {
|
||||
- /* group is closed already, so don't block */
|
||||
- __condvar_dec_grefs (cond, g, private);
|
||||
- goto done;
|
||||
- }
|
||||
-
|
||||
- if ((int)(signals - lowseq) >= 2)
|
||||
- {
|
||||
- /* a signal showed up or G1/G2 switched after we grabbed the
|
||||
- refcount */
|
||||
- __condvar_dec_grefs (cond, g, private);
|
||||
- break;
|
||||
- }
|
||||
|
||||
// Now block.
|
||||
struct _pthread_cleanup_buffer buffer;
|
||||
@@ -533,9 +487,6 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex,
|
||||
/* Reload signals. See above for MO. */
|
||||
signals = atomic_load_acquire (cond->__data.__g_signals + g);
|
||||
}
|
||||
-
|
||||
- if (seq < (__condvar_load_g1_start_relaxed (cond) >> 1))
|
||||
- goto done;
|
||||
}
|
||||
/* Try to grab a signal. See above for MO. (if we do another loop
|
||||
iteration we need to see the correct value of g1_start) */
|
||||
--
|
||||
2.49.0
|
||||
|
||||
105
meta/recipes-core/glibc/glibc/0026-PR25847-5.patch
Normal file
105
meta/recipes-core/glibc/glibc/0026-PR25847-5.patch
Normal file
@@ -0,0 +1,105 @@
|
||||
From d9ffb50dc55f77e584a5d0275eea758c7a6b04e3 Mon Sep 17 00:00:00 2001
|
||||
From: Malte Skarupke <malteskarupke@fastmail.fm>
|
||||
Date: Mon, 16 Jun 2025 23:53:35 -0700
|
||||
Subject: [PATCH] nptl: Use a single loop in pthread_cond_wait instaed of a
|
||||
nested loop
|
||||
|
||||
The loop was a little more complicated than necessary. There was only one
|
||||
break statement out of the inner loop, and the outer loop was nearly empty.
|
||||
So just remove the outer loop, moving its code to the one break statement in
|
||||
the inner loop. This allows us to replace all gotos with break statements.
|
||||
|
||||
The following commits have been cherry-picked from Glibc master branch:
|
||||
Bug : https://sourceware.org/bugzilla/show_bug.cgi?id=25847
|
||||
|
||||
Upstream-Status: Backport
|
||||
[https://sourceware.org/git/?p=glibc.git;a=commit;h=929a4764ac90382616b6a21f099192b2475da674]
|
||||
|
||||
Signed-off-by: Sunil Dora <sunilkumar.dora@windriver.com>
|
||||
---
|
||||
nptl/pthread_cond_wait.c | 41 +++++++++++++++++++---------------------
|
||||
1 file changed, 19 insertions(+), 22 deletions(-)
|
||||
|
||||
diff --git a/nptl/pthread_cond_wait.c b/nptl/pthread_cond_wait.c
|
||||
index 47e834cade..5c86880105 100644
|
||||
--- a/nptl/pthread_cond_wait.c
|
||||
+++ b/nptl/pthread_cond_wait.c
|
||||
@@ -410,17 +410,15 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex,
|
||||
return err;
|
||||
}
|
||||
|
||||
- /* Now wait until a signal is available in our group or it is closed.
|
||||
- Acquire MO so that if we observe (signals == lowseq) after group
|
||||
- switching in __condvar_quiesce_and_switch_g1, we synchronize with that
|
||||
- store and will see the prior update of __g1_start done while switching
|
||||
- groups too. */
|
||||
- unsigned int signals = atomic_load_acquire (cond->__data.__g_signals + g);
|
||||
-
|
||||
- do
|
||||
- {
|
||||
+
|
||||
while (1)
|
||||
{
|
||||
+ /* Now wait until a signal is available in our group or it is closed.
|
||||
+ Acquire MO so that if we observe (signals == lowseq) after group
|
||||
+ switching in __condvar_quiesce_and_switch_g1, we synchronize with that
|
||||
+ store and will see the prior update of __g1_start done while switching
|
||||
+ groups too. */
|
||||
+ unsigned int signals = atomic_load_acquire (cond->__data.__g_signals + g);
|
||||
uint64_t g1_start = __condvar_load_g1_start_relaxed (cond);
|
||||
unsigned int lowseq = (g1_start & 1) == g ? signals : g1_start & ~1U;
|
||||
|
||||
@@ -429,7 +427,7 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex,
|
||||
/* If the group is closed already,
|
||||
then this waiter originally had enough extra signals to
|
||||
consume, up until the time its group was closed. */
|
||||
- goto done;
|
||||
+ break;
|
||||
}
|
||||
|
||||
/* If there is an available signal, don't block.
|
||||
@@ -438,8 +436,16 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex,
|
||||
G2, but in either case we're allowed to consume the available
|
||||
signal and should not block anymore. */
|
||||
if ((int)(signals - lowseq) >= 2)
|
||||
- break;
|
||||
-
|
||||
+ {
|
||||
+ /* Try to grab a signal. See above for MO. (if we do another loop
|
||||
+ iteration we need to see the correct value of g1_start) */
|
||||
+ if (atomic_compare_exchange_weak_acquire (
|
||||
+ cond->__data.__g_signals + g,
|
||||
+ &signals, signals - 2))
|
||||
+ break;
|
||||
+ else
|
||||
+ continue;
|
||||
+ }
|
||||
/* No signals available after spinning, so prepare to block.
|
||||
We first acquire a group reference and use acquire MO for that so
|
||||
that we synchronize with the dummy read-modify-write in
|
||||
@@ -479,21 +485,12 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex,
|
||||
the lock during cancellation is not possible. */
|
||||
__condvar_cancel_waiting (cond, seq, g, private);
|
||||
result = err;
|
||||
- goto done;
|
||||
+ break;
|
||||
}
|
||||
else
|
||||
__condvar_dec_grefs (cond, g, private);
|
||||
|
||||
- /* Reload signals. See above for MO. */
|
||||
- signals = atomic_load_acquire (cond->__data.__g_signals + g);
|
||||
}
|
||||
- }
|
||||
- /* Try to grab a signal. See above for MO. (if we do another loop
|
||||
- iteration we need to see the correct value of g1_start) */
|
||||
- while (!atomic_compare_exchange_weak_acquire (cond->__data.__g_signals + g,
|
||||
- &signals, signals - 2));
|
||||
-
|
||||
- done:
|
||||
|
||||
/* Confirm that we have been woken. We do that before acquiring the mutex
|
||||
to allow for execution of pthread_cond_destroy while having acquired the
|
||||
--
|
||||
2.49.0
|
||||
|
||||
169
meta/recipes-core/glibc/glibc/0026-PR25847-6.patch
Normal file
169
meta/recipes-core/glibc/glibc/0026-PR25847-6.patch
Normal file
@@ -0,0 +1,169 @@
|
||||
From a2faee6d0dac6e5232255da9afda4d9ed6cfb6e5 Mon Sep 17 00:00:00 2001
|
||||
From: Malte Skarupke <malteskarupke@fastmail.fm>
|
||||
Date: Tue, 17 Jun 2025 01:37:12 -0700
|
||||
Subject: [PATCH] nptl: Fix indentation
|
||||
|
||||
In my previous change I turned a nested loop into a simple loop. I'm doing
|
||||
the resulting indentation changes in a separate commit to make the diff on
|
||||
the previous commit easier to review.
|
||||
|
||||
The following commits have been cherry-picked from Glibc master branch:
|
||||
Bug : https://sourceware.org/bugzilla/show_bug.cgi?id=25847
|
||||
|
||||
Upstream-Status: Backport
|
||||
[https://sourceware.org/git/?p=glibc.git;a=commit;h=ee6c14ed59d480720721aaacc5fb03213dc153da]
|
||||
|
||||
Signed-off-by: Sunil Dora <sunilkumar.dora@windriver.com>
|
||||
---
|
||||
nptl/pthread_cond_wait.c | 132 ++++++++++++++++-----------------------
|
||||
1 file changed, 54 insertions(+), 78 deletions(-)
|
||||
|
||||
diff --git a/nptl/pthread_cond_wait.c b/nptl/pthread_cond_wait.c
|
||||
index 5c86880105..104ebd48ca 100644
|
||||
--- a/nptl/pthread_cond_wait.c
|
||||
+++ b/nptl/pthread_cond_wait.c
|
||||
@@ -410,87 +410,63 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex,
|
||||
return err;
|
||||
}
|
||||
|
||||
-
|
||||
- while (1)
|
||||
- {
|
||||
- /* Now wait until a signal is available in our group or it is closed.
|
||||
- Acquire MO so that if we observe (signals == lowseq) after group
|
||||
- switching in __condvar_quiesce_and_switch_g1, we synchronize with that
|
||||
- store and will see the prior update of __g1_start done while switching
|
||||
- groups too. */
|
||||
- unsigned int signals = atomic_load_acquire (cond->__data.__g_signals + g);
|
||||
- uint64_t g1_start = __condvar_load_g1_start_relaxed (cond);
|
||||
- unsigned int lowseq = (g1_start & 1) == g ? signals : g1_start & ~1U;
|
||||
-
|
||||
- if (seq < (g1_start >> 1))
|
||||
- {
|
||||
- /* If the group is closed already,
|
||||
- then this waiter originally had enough extra signals to
|
||||
- consume, up until the time its group was closed. */
|
||||
- break;
|
||||
- }
|
||||
-
|
||||
- /* If there is an available signal, don't block.
|
||||
- If __g1_start has advanced at all, then we must be in G1
|
||||
- by now, perhaps in the process of switching back to an older
|
||||
- G2, but in either case we're allowed to consume the available
|
||||
- signal and should not block anymore. */
|
||||
- if ((int)(signals - lowseq) >= 2)
|
||||
- {
|
||||
- /* Try to grab a signal. See above for MO. (if we do another loop
|
||||
- iteration we need to see the correct value of g1_start) */
|
||||
- if (atomic_compare_exchange_weak_acquire (
|
||||
- cond->__data.__g_signals + g,
|
||||
+ while (1)
|
||||
+ {
|
||||
+ /* Now wait until a signal is available in our group or it is closed.
|
||||
+ Acquire MO so that if we observe (signals == lowseq) after group
|
||||
+ switching in __condvar_quiesce_and_switch_g1, we synchronize with that
|
||||
+ store and will see the prior update of __g1_start done while switching
|
||||
+ groups too. */
|
||||
+ unsigned int signals = atomic_load_acquire (cond->__data.__g_signals + g);
|
||||
+ uint64_t g1_start = __condvar_load_g1_start_relaxed (cond);
|
||||
+ unsigned int lowseq = (g1_start & 1) == g ? signals : g1_start & ~1U;
|
||||
+
|
||||
+ if (seq < (g1_start >> 1))
|
||||
+ {
|
||||
+ /* If the group is closed already,
|
||||
+ then this waiter originally had enough extra signals to
|
||||
+ consume, up until the time its group was closed. */
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ /* If there is an available signal, don't block.
|
||||
+ If __g1_start has advanced at all, then we must be in G1
|
||||
+ by now, perhaps in the process of switching back to an older
|
||||
+ G2, but in either case we're allowed to consume the available
|
||||
+ signal and should not block anymore. */
|
||||
+ if ((int)(signals - lowseq) >= 2)
|
||||
+ {
|
||||
+ /* Try to grab a signal. See above for MO. (if we do another loop
|
||||
+ iteration we need to see the correct value of g1_start) */
|
||||
+ if (atomic_compare_exchange_weak_acquire (
|
||||
+ cond->__data.__g_signals + g,
|
||||
&signals, signals - 2))
|
||||
- break;
|
||||
- else
|
||||
- continue;
|
||||
- }
|
||||
- /* No signals available after spinning, so prepare to block.
|
||||
- We first acquire a group reference and use acquire MO for that so
|
||||
- that we synchronize with the dummy read-modify-write in
|
||||
- __condvar_quiesce_and_switch_g1 if we read from that. In turn,
|
||||
- in this case this will make us see the advancement of __g_signals
|
||||
- to the upcoming new g1_start that occurs with a concurrent
|
||||
- attempt to reuse the group's slot.
|
||||
- We use acquire MO for the __g_signals check to make the
|
||||
- __g1_start check work (see spinning above).
|
||||
- Note that the group reference acquisition will not mask the
|
||||
- release MO when decrementing the reference count because we use
|
||||
- an atomic read-modify-write operation and thus extend the release
|
||||
- sequence. */
|
||||
- atomic_fetch_add_acquire (cond->__data.__g_refs + g, 2);
|
||||
-
|
||||
- // Now block.
|
||||
- struct _pthread_cleanup_buffer buffer;
|
||||
- struct _condvar_cleanup_buffer cbuffer;
|
||||
- cbuffer.wseq = wseq;
|
||||
- cbuffer.cond = cond;
|
||||
- cbuffer.mutex = mutex;
|
||||
- cbuffer.private = private;
|
||||
- __pthread_cleanup_push (&buffer, __condvar_cleanup_waiting, &cbuffer);
|
||||
-
|
||||
- err = __futex_abstimed_wait_cancelable64 (
|
||||
- cond->__data.__g_signals + g, signals, clockid, abstime, private);
|
||||
-
|
||||
- __pthread_cleanup_pop (&buffer, 0);
|
||||
-
|
||||
- if (__glibc_unlikely (err == ETIMEDOUT || err == EOVERFLOW))
|
||||
- {
|
||||
- __condvar_dec_grefs (cond, g, private);
|
||||
- /* If we timed out, we effectively cancel waiting. Note that
|
||||
- we have decremented __g_refs before cancellation, so that a
|
||||
- deadlock between waiting for quiescence of our group in
|
||||
- __condvar_quiesce_and_switch_g1 and us trying to acquire
|
||||
- the lock during cancellation is not possible. */
|
||||
- __condvar_cancel_waiting (cond, seq, g, private);
|
||||
- result = err;
|
||||
break;
|
||||
- }
|
||||
- else
|
||||
- __condvar_dec_grefs (cond, g, private);
|
||||
-
|
||||
+ else
|
||||
+ continue;
|
||||
}
|
||||
+ // Now block.
|
||||
+ struct _pthread_cleanup_buffer buffer;
|
||||
+ struct _condvar_cleanup_buffer cbuffer;
|
||||
+ cbuffer.wseq = wseq;
|
||||
+ cbuffer.cond = cond;
|
||||
+ cbuffer.mutex = mutex;
|
||||
+ cbuffer.private = private;
|
||||
+ __pthread_cleanup_push (&buffer, __condvar_cleanup_waiting, &cbuffer);
|
||||
+
|
||||
+ err = __futex_abstimed_wait_cancelable64 (
|
||||
+ cond->__data.__g_signals + g, signals, clockid, abstime, private);
|
||||
+
|
||||
+ __pthread_cleanup_pop (&buffer, 0);
|
||||
+
|
||||
+ if (__glibc_unlikely (err == ETIMEDOUT || err == EOVERFLOW))
|
||||
+ {
|
||||
+ /* If we timed out, we effectively cancel waiting. */
|
||||
+ __condvar_cancel_waiting (cond, seq, g, private);
|
||||
+ result = err;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
|
||||
/* Confirm that we have been woken. We do that before acquiring the mutex
|
||||
to allow for execution of pthread_cond_destroy while having acquired the
|
||||
--
|
||||
2.49.0
|
||||
|
||||
160
meta/recipes-core/glibc/glibc/0026-PR25847-7.patch
Normal file
160
meta/recipes-core/glibc/glibc/0026-PR25847-7.patch
Normal file
@@ -0,0 +1,160 @@
|
||||
From 2a601ac9041e2ca645acad2c174b1c545cfceafe Mon Sep 17 00:00:00 2001
|
||||
From: Malte Skarupke <malteskarupke@fastmail.fm>
|
||||
Date: Tue, 17 Jun 2025 01:53:25 -0700
|
||||
Subject: [PATCH] nptl: rename __condvar_quiesce_and_switch_g1
|
||||
|
||||
This function no longer waits for threads to leave g1, so rename it to
|
||||
__condvar_switch_g1
|
||||
|
||||
The following commits have been cherry-picked from Glibc master branch:
|
||||
Bug : https://sourceware.org/bugzilla/show_bug.cgi?id=25847
|
||||
|
||||
Upstream-Status: Backport
|
||||
[https://sourceware.org/git/?p=glibc.git;a=commit;h=4b79e27a5073c02f6bff9aa8f4791230a0ab1867]
|
||||
|
||||
Signed-off-by: Sunil Dora <sunilkumar.dora@windriver.com>
|
||||
---
|
||||
nptl/pthread_cond_broadcast.c | 4 ++--
|
||||
nptl/pthread_cond_common.c | 26 ++++++++++++--------------
|
||||
nptl/pthread_cond_signal.c | 17 ++++++++---------
|
||||
nptl/pthread_cond_wait.c | 9 ++++-----
|
||||
4 files changed, 26 insertions(+), 30 deletions(-)
|
||||
|
||||
diff --git a/nptl/pthread_cond_broadcast.c b/nptl/pthread_cond_broadcast.c
|
||||
index 5ae141ac81..a07435589a 100644
|
||||
--- a/nptl/pthread_cond_broadcast.c
|
||||
+++ b/nptl/pthread_cond_broadcast.c
|
||||
@@ -60,7 +60,7 @@ ___pthread_cond_broadcast (pthread_cond_t *cond)
|
||||
cond->__data.__g_size[g1] << 1);
|
||||
cond->__data.__g_size[g1] = 0;
|
||||
|
||||
- /* We need to wake G1 waiters before we quiesce G1 below. */
|
||||
+ /* We need to wake G1 waiters before we switch G1 below. */
|
||||
/* TODO Only set it if there are indeed futex waiters. We could
|
||||
also try to move this out of the critical section in cases when
|
||||
G2 is empty (and we don't need to quiesce). */
|
||||
@@ -69,7 +69,7 @@ ___pthread_cond_broadcast (pthread_cond_t *cond)
|
||||
|
||||
/* G1 is complete. Step (2) is next unless there are no waiters in G2, in
|
||||
which case we can stop. */
|
||||
- if (__condvar_quiesce_and_switch_g1 (cond, wseq, &g1, private))
|
||||
+ if (__condvar_switch_g1 (cond, wseq, &g1, private))
|
||||
{
|
||||
/* Step (3): Send signals to all waiters in the old G2 / new G1. */
|
||||
atomic_fetch_add_relaxed (cond->__data.__g_signals + g1,
|
||||
diff --git a/nptl/pthread_cond_common.c b/nptl/pthread_cond_common.c
|
||||
index f976a533a1..3baac4dabc 100644
|
||||
--- a/nptl/pthread_cond_common.c
|
||||
+++ b/nptl/pthread_cond_common.c
|
||||
@@ -189,16 +189,15 @@ __condvar_get_private (int flags)
|
||||
return FUTEX_SHARED;
|
||||
}
|
||||
|
||||
-/* This closes G1 (whose index is in G1INDEX), waits for all futex waiters to
|
||||
- leave G1, converts G1 into a fresh G2, and then switches group roles so that
|
||||
- the former G2 becomes the new G1 ending at the current __wseq value when we
|
||||
- eventually make the switch (WSEQ is just an observation of __wseq by the
|
||||
- signaler).
|
||||
+/* This closes G1 (whose index is in G1INDEX), converts G1 into a fresh G2,
|
||||
+ and then switches group roles so that the former G2 becomes the new G1
|
||||
+ ending at the current __wseq value when we eventually make the switch
|
||||
+ (WSEQ is just an observation of __wseq by the signaler).
|
||||
If G2 is empty, it will not switch groups because then it would create an
|
||||
empty G1 which would require switching groups again on the next signal.
|
||||
Returns false iff groups were not switched because G2 was empty. */
|
||||
static bool __attribute__ ((unused))
|
||||
-__condvar_quiesce_and_switch_g1 (pthread_cond_t *cond, uint64_t wseq,
|
||||
+__condvar_switch_g1 (pthread_cond_t *cond, uint64_t wseq,
|
||||
unsigned int *g1index, int private)
|
||||
{
|
||||
unsigned int g1 = *g1index;
|
||||
@@ -214,8 +213,7 @@ __condvar_quiesce_and_switch_g1 (pthread_cond_t *cond, uint64_t wseq,
|
||||
+ cond->__data.__g_size[g1 ^ 1]) == 0)
|
||||
return false;
|
||||
|
||||
- /* Now try to close and quiesce G1. We have to consider the following kinds
|
||||
- of waiters:
|
||||
+ /* We have to consider the following kinds of waiters:
|
||||
* Waiters from less recent groups than G1 are not affected because
|
||||
nothing will change for them apart from __g1_start getting larger.
|
||||
* New waiters arriving concurrently with the group switching will all go
|
||||
@@ -223,12 +221,12 @@ __condvar_quiesce_and_switch_g1 (pthread_cond_t *cond, uint64_t wseq,
|
||||
are not affected.
|
||||
* Waiters in G1 have already received a signal and been woken. */
|
||||
|
||||
- /* Update __g1_start, which finishes closing this group. The value we add
|
||||
- will never be negative because old_orig_size can only be zero when we
|
||||
- switch groups the first time after a condvar was initialized, in which
|
||||
- case G1 will be at index 1 and we will add a value of 1.
|
||||
- Relaxed MO is fine because the change comes with no additional
|
||||
- constraints that others would have to observe. */
|
||||
+ /* Update __g1_start, which closes this group. The value we add will never
|
||||
+ be negative because old_orig_size can only be zero when we switch groups
|
||||
+ the first time after a condvar was initialized, in which case G1 will be
|
||||
+ at index 1 and we will add a value of 1. Relaxed MO is fine because the
|
||||
+ change comes with no additional constraints that others would have to
|
||||
+ observe. */
|
||||
__condvar_add_g1_start_relaxed (cond,
|
||||
(old_orig_size << 1) + (g1 == 1 ? 1 : - 1));
|
||||
|
||||
diff --git a/nptl/pthread_cond_signal.c b/nptl/pthread_cond_signal.c
|
||||
index 14800ba00b..a9bc10dcca 100644
|
||||
--- a/nptl/pthread_cond_signal.c
|
||||
+++ b/nptl/pthread_cond_signal.c
|
||||
@@ -69,18 +69,17 @@ ___pthread_cond_signal (pthread_cond_t *cond)
|
||||
bool do_futex_wake = false;
|
||||
|
||||
/* If G1 is still receiving signals, we put the signal there. If not, we
|
||||
- check if G2 has waiters, and if so, quiesce and switch G1 to the former
|
||||
- G2; if this results in a new G1 with waiters (G2 might have cancellations
|
||||
- already, see __condvar_quiesce_and_switch_g1), we put the signal in the
|
||||
- new G1. */
|
||||
+ check if G2 has waiters, and if so, switch G1 to the former G2; if this
|
||||
+ results in a new G1 with waiters (G2 might have cancellations already,
|
||||
+ see __condvar_switch_g1), we put the signal in the new G1. */
|
||||
if ((cond->__data.__g_size[g1] != 0)
|
||||
- || __condvar_quiesce_and_switch_g1 (cond, wseq, &g1, private))
|
||||
+ || __condvar_switch_g1 (cond, wseq, &g1, private))
|
||||
{
|
||||
/* Add a signal. Relaxed MO is fine because signaling does not need to
|
||||
- establish a happens-before relation (see above). We do not mask the
|
||||
- release-MO store when initializing a group in
|
||||
- __condvar_quiesce_and_switch_g1 because we use an atomic
|
||||
- read-modify-write and thus extend that store's release sequence. */
|
||||
+ establish a happens-before relation (see above). We do not mask the
|
||||
+ release-MO store when initializing a group in __condvar_switch_g1
|
||||
+ because we use an atomic read-modify-write and thus extend that
|
||||
+ store's release sequence. */
|
||||
atomic_fetch_add_relaxed (cond->__data.__g_signals + g1, 2);
|
||||
cond->__data.__g_size[g1]--;
|
||||
/* TODO Only set it if there are indeed futex waiters. */
|
||||
diff --git a/nptl/pthread_cond_wait.c b/nptl/pthread_cond_wait.c
|
||||
index 104ebd48ca..bb46f3605d 100644
|
||||
--- a/nptl/pthread_cond_wait.c
|
||||
+++ b/nptl/pthread_cond_wait.c
|
||||
@@ -382,8 +382,7 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex,
|
||||
because we do not need to establish any happens-before relation with
|
||||
signalers (see __pthread_cond_signal); modification order alone
|
||||
establishes a total order of waiters/signals. We do need acquire MO
|
||||
- to synchronize with group reinitialization in
|
||||
- __condvar_quiesce_and_switch_g1. */
|
||||
+ to synchronize with group reinitialization in __condvar_switch_g1. */
|
||||
uint64_t wseq = __condvar_fetch_add_wseq_acquire (cond, 2);
|
||||
/* Find our group's index. We always go into what was G2 when we acquired
|
||||
our position. */
|
||||
@@ -414,9 +413,9 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex,
|
||||
{
|
||||
/* Now wait until a signal is available in our group or it is closed.
|
||||
Acquire MO so that if we observe (signals == lowseq) after group
|
||||
- switching in __condvar_quiesce_and_switch_g1, we synchronize with that
|
||||
- store and will see the prior update of __g1_start done while switching
|
||||
- groups too. */
|
||||
+ switching in __condvar_switch_g1, we synchronize with that store and
|
||||
+ will see the prior update of __g1_start done while switching groups
|
||||
+ too. */
|
||||
unsigned int signals = atomic_load_acquire (cond->__data.__g_signals + g);
|
||||
uint64_t g1_start = __condvar_load_g1_start_relaxed (cond);
|
||||
unsigned int lowseq = (g1_start & 1) == g ? signals : g1_start & ~1U;
|
||||
--
|
||||
2.49.0
|
||||
|
||||
192
meta/recipes-core/glibc/glibc/0026-PR25847-8.patch
Normal file
192
meta/recipes-core/glibc/glibc/0026-PR25847-8.patch
Normal file
@@ -0,0 +1,192 @@
|
||||
From fc074de88796eb2036fbe9bade638e00adfd5cb2 Mon Sep 17 00:00:00 2001
|
||||
From: Malte Skarupke <malteskarupke@fastmail.fm>
|
||||
Date: Tue, 17 Jun 2025 02:08:36 -0700
|
||||
Subject: [PATCH] nptl: Use all of g1_start and g_signals
|
||||
|
||||
The LSB of g_signals was unused. The LSB of g1_start was used to indicate
|
||||
which group is G2. This was used to always go to sleep in pthread_cond_wait
|
||||
if a waiter is in G2. A comment earlier in the file says that this is not
|
||||
correct to do:
|
||||
|
||||
"Waiters cannot determine whether they are currently in G2 or G1 -- but they
|
||||
do not have to because all they are interested in is whether there are
|
||||
available signals"
|
||||
|
||||
I either would have had to update the comment, or get rid of the check. I
|
||||
chose to get rid of the check. In fact I don't quite know why it was there.
|
||||
There will never be available signals for group G2, so we didn't need the
|
||||
special case. Even if there were, this would just be a spurious wake. This
|
||||
might have caught some cases where the count has wrapped around, but it
|
||||
wouldn't reliably do that, (and even if it did, why would you want to force a
|
||||
sleep in that case?) and we don't support that many concurrent waiters
|
||||
anyway. Getting rid of it allows us to use one more bit, making us more
|
||||
robust to wraparound.
|
||||
|
||||
The following commits have been cherry-picked from Glibc master branch:
|
||||
Bug : https://sourceware.org/bugzilla/show_bug.cgi?id=25847
|
||||
|
||||
Upstream-Status: Backport
|
||||
[https://sourceware.org/git/?p=glibc.git;a=commit;h=91bb902f58264a2fd50fbce8f39a9a290dd23706]
|
||||
|
||||
Signed-off-by: Sunil Dora <sunilkumar.dora@windriver.com>
|
||||
---
|
||||
nptl/pthread_cond_broadcast.c | 4 ++--
|
||||
nptl/pthread_cond_common.c | 26 ++++++++++----------------
|
||||
nptl/pthread_cond_signal.c | 2 +-
|
||||
nptl/pthread_cond_wait.c | 14 +++++---------
|
||||
4 files changed, 18 insertions(+), 28 deletions(-)
|
||||
|
||||
diff --git a/nptl/pthread_cond_broadcast.c b/nptl/pthread_cond_broadcast.c
|
||||
index a07435589a..ef0943cdc5 100644
|
||||
--- a/nptl/pthread_cond_broadcast.c
|
||||
+++ b/nptl/pthread_cond_broadcast.c
|
||||
@@ -57,7 +57,7 @@ ___pthread_cond_broadcast (pthread_cond_t *cond)
|
||||
{
|
||||
/* Add as many signals as the remaining size of the group. */
|
||||
atomic_fetch_add_relaxed (cond->__data.__g_signals + g1,
|
||||
- cond->__data.__g_size[g1] << 1);
|
||||
+ cond->__data.__g_size[g1]);
|
||||
cond->__data.__g_size[g1] = 0;
|
||||
|
||||
/* We need to wake G1 waiters before we switch G1 below. */
|
||||
@@ -73,7 +73,7 @@ ___pthread_cond_broadcast (pthread_cond_t *cond)
|
||||
{
|
||||
/* Step (3): Send signals to all waiters in the old G2 / new G1. */
|
||||
atomic_fetch_add_relaxed (cond->__data.__g_signals + g1,
|
||||
- cond->__data.__g_size[g1] << 1);
|
||||
+ cond->__data.__g_size[g1]);
|
||||
cond->__data.__g_size[g1] = 0;
|
||||
/* TODO Only set it if there are indeed futex waiters. */
|
||||
do_futex_wake = true;
|
||||
diff --git a/nptl/pthread_cond_common.c b/nptl/pthread_cond_common.c
|
||||
index 3baac4dabc..e48f914321 100644
|
||||
--- a/nptl/pthread_cond_common.c
|
||||
+++ b/nptl/pthread_cond_common.c
|
||||
@@ -208,9 +208,9 @@ __condvar_switch_g1 (pthread_cond_t *cond, uint64_t wseq,
|
||||
behavior.
|
||||
Note that this works correctly for a zero-initialized condvar too. */
|
||||
unsigned int old_orig_size = __condvar_get_orig_size (cond);
|
||||
- uint64_t old_g1_start = __condvar_load_g1_start_relaxed (cond) >> 1;
|
||||
- if (((unsigned) (wseq - old_g1_start - old_orig_size)
|
||||
- + cond->__data.__g_size[g1 ^ 1]) == 0)
|
||||
+ uint64_t old_g1_start = __condvar_load_g1_start_relaxed (cond);
|
||||
+ uint64_t new_g1_start = old_g1_start + old_orig_size;
|
||||
+ if (((unsigned) (wseq - new_g1_start) + cond->__data.__g_size[g1 ^ 1]) == 0)
|
||||
return false;
|
||||
|
||||
/* We have to consider the following kinds of waiters:
|
||||
@@ -221,16 +221,10 @@ __condvar_switch_g1 (pthread_cond_t *cond, uint64_t wseq,
|
||||
are not affected.
|
||||
* Waiters in G1 have already received a signal and been woken. */
|
||||
|
||||
- /* Update __g1_start, which closes this group. The value we add will never
|
||||
- be negative because old_orig_size can only be zero when we switch groups
|
||||
- the first time after a condvar was initialized, in which case G1 will be
|
||||
- at index 1 and we will add a value of 1. Relaxed MO is fine because the
|
||||
- change comes with no additional constraints that others would have to
|
||||
- observe. */
|
||||
- __condvar_add_g1_start_relaxed (cond,
|
||||
- (old_orig_size << 1) + (g1 == 1 ? 1 : - 1));
|
||||
-
|
||||
- unsigned int lowseq = ((old_g1_start + old_orig_size) << 1) & ~1U;
|
||||
+ /* Update __g1_start, which closes this group. Relaxed MO is fine because
|
||||
+ the change comes with no additional constraints that others would have
|
||||
+ to observe. */
|
||||
+ __condvar_add_g1_start_relaxed (cond, old_orig_size);
|
||||
|
||||
/* At this point, the old G1 is now a valid new G2 (but not in use yet).
|
||||
No old waiter can neither grab a signal nor acquire a reference without
|
||||
@@ -242,13 +236,13 @@ __condvar_switch_g1 (pthread_cond_t *cond, uint64_t wseq,
|
||||
g1 ^= 1;
|
||||
*g1index ^= 1;
|
||||
|
||||
- /* Now advance the new G1 g_signals to the new lowseq, giving it
|
||||
+ /* Now advance the new G1 g_signals to the new g1_start, giving it
|
||||
an effective signal count of 0 to start. */
|
||||
- atomic_store_release (cond->__data.__g_signals + g1, lowseq);
|
||||
+ atomic_store_release (cond->__data.__g_signals + g1, (unsigned)new_g1_start);
|
||||
|
||||
/* These values are just observed by signalers, and thus protected by the
|
||||
lock. */
|
||||
- unsigned int orig_size = wseq - (old_g1_start + old_orig_size);
|
||||
+ unsigned int orig_size = wseq - new_g1_start;
|
||||
__condvar_set_orig_size (cond, orig_size);
|
||||
/* Use and addition to not loose track of cancellations in what was
|
||||
previously G2. */
|
||||
diff --git a/nptl/pthread_cond_signal.c b/nptl/pthread_cond_signal.c
|
||||
index a9bc10dcca..07427369aa 100644
|
||||
--- a/nptl/pthread_cond_signal.c
|
||||
+++ b/nptl/pthread_cond_signal.c
|
||||
@@ -80,7 +80,7 @@ ___pthread_cond_signal (pthread_cond_t *cond)
|
||||
release-MO store when initializing a group in __condvar_switch_g1
|
||||
because we use an atomic read-modify-write and thus extend that
|
||||
store's release sequence. */
|
||||
- atomic_fetch_add_relaxed (cond->__data.__g_signals + g1, 2);
|
||||
+ atomic_fetch_add_relaxed (cond->__data.__g_signals + g1, 1);
|
||||
cond->__data.__g_size[g1]--;
|
||||
/* TODO Only set it if there are indeed futex waiters. */
|
||||
do_futex_wake = true;
|
||||
diff --git a/nptl/pthread_cond_wait.c b/nptl/pthread_cond_wait.c
|
||||
index bb46f3605d..430cbe8a35 100644
|
||||
--- a/nptl/pthread_cond_wait.c
|
||||
+++ b/nptl/pthread_cond_wait.c
|
||||
@@ -84,7 +84,7 @@ __condvar_cancel_waiting (pthread_cond_t *cond, uint64_t seq, unsigned int g,
|
||||
not hold a reference on the group. */
|
||||
__condvar_acquire_lock (cond, private);
|
||||
|
||||
- uint64_t g1_start = __condvar_load_g1_start_relaxed (cond) >> 1;
|
||||
+ uint64_t g1_start = __condvar_load_g1_start_relaxed (cond);
|
||||
if (g1_start > seq)
|
||||
{
|
||||
/* Our group is closed, so someone provided enough signals for it.
|
||||
@@ -278,7 +278,6 @@ __condvar_cleanup_waiting (void *arg)
|
||||
* Waiters fetch-add while having acquire the mutex associated with the
|
||||
condvar. Signalers load it and fetch-xor it concurrently.
|
||||
__g1_start: Starting position of G1 (inclusive)
|
||||
- * LSB is index of current G2.
|
||||
* Modified by signalers while having acquired the condvar-internal lock
|
||||
and observed concurrently by waiters.
|
||||
__g1_orig_size: Initial size of G1
|
||||
@@ -299,11 +298,9 @@ __condvar_cleanup_waiting (void *arg)
|
||||
* Reference count used by waiters concurrently with signalers that have
|
||||
acquired the condvar-internal lock.
|
||||
__g_signals: The number of signals that can still be consumed, relative to
|
||||
- the current g1_start. (i.e. bits 31 to 1 of __g_signals are bits
|
||||
- 31 to 1 of g1_start with the signal count added)
|
||||
+ the current g1_start. (i.e. g1_start with the signal count added)
|
||||
* Used as a futex word by waiters. Used concurrently by waiters and
|
||||
signalers.
|
||||
- * LSB is currently reserved and 0.
|
||||
__g_size: Waiters remaining in this group (i.e., which have not been
|
||||
signaled yet.
|
||||
* Accessed by signalers and waiters that cancel waiting (both do so only
|
||||
@@ -418,9 +415,8 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex,
|
||||
too. */
|
||||
unsigned int signals = atomic_load_acquire (cond->__data.__g_signals + g);
|
||||
uint64_t g1_start = __condvar_load_g1_start_relaxed (cond);
|
||||
- unsigned int lowseq = (g1_start & 1) == g ? signals : g1_start & ~1U;
|
||||
|
||||
- if (seq < (g1_start >> 1))
|
||||
+ if (seq < g1_start)
|
||||
{
|
||||
/* If the group is closed already,
|
||||
then this waiter originally had enough extra signals to
|
||||
@@ -433,13 +429,13 @@ __pthread_cond_wait_common (pthread_cond_t *cond, pthread_mutex_t *mutex,
|
||||
by now, perhaps in the process of switching back to an older
|
||||
G2, but in either case we're allowed to consume the available
|
||||
signal and should not block anymore. */
|
||||
- if ((int)(signals - lowseq) >= 2)
|
||||
+ if ((int)(signals - (unsigned int)g1_start) > 0)
|
||||
{
|
||||
/* Try to grab a signal. See above for MO. (if we do another loop
|
||||
iteration we need to see the correct value of g1_start) */
|
||||
if (atomic_compare_exchange_weak_acquire (
|
||||
cond->__data.__g_signals + g,
|
||||
- &signals, signals - 2))
|
||||
+ &signals, signals - 1))
|
||||
break;
|
||||
else
|
||||
continue;
|
||||
--
|
||||
2.49.0
|
||||
|
||||
@@ -61,6 +61,15 @@ SRC_URI = "${GLIBC_GIT_URI};branch=${SRCBRANCH};name=glibc \
|
||||
file://0022-sysdeps-gnu-configure.ac-Set-libc_cv_rootsbindir-onl.patch \
|
||||
file://0023-timezone-Make-shell-interpreter-overridable-in-tzsel.patch \
|
||||
file://0024-fix-create-thread-failed-in-unprivileged-process-BZ-.patch \
|
||||
file://0025-CVE-2025-4802.patch \
|
||||
file://0026-PR25847-1.patch \
|
||||
file://0026-PR25847-2.patch \
|
||||
file://0026-PR25847-3.patch \
|
||||
file://0026-PR25847-4.patch \
|
||||
file://0026-PR25847-5.patch \
|
||||
file://0026-PR25847-6.patch \
|
||||
file://0026-PR25847-7.patch \
|
||||
file://0026-PR25847-8.patch \
|
||||
\
|
||||
file://0001-Revert-Linux-Implement-a-useful-version-of-_startup_.patch \
|
||||
file://0002-get_nscd_addresses-Fix-subscript-typos-BZ-29605.patch \
|
||||
|
||||
@@ -24,7 +24,7 @@ IMAGE_FSTYPES = "wic.vmdk wic.vhd wic.vhdx"
|
||||
|
||||
inherit core-image setuptools3
|
||||
|
||||
SRCREV ?= "5dad8173d4c55283a93302d907339fb1f7696a65"
|
||||
SRCREV ?= "f66b3ae54394b3b6dd6f654683ed602ee7caa688"
|
||||
SRC_URI = "git://git.yoctoproject.org/poky;branch=kirkstone \
|
||||
file://Yocto_Build_Appliance.vmx \
|
||||
file://Yocto_Build_Appliance.vmxf \
|
||||
|
||||
@@ -41,6 +41,7 @@ SRC_URI = "${KERNELORG_MIRROR}/linux/utils/util-linux/v${MAJOR_VERSION}/util-lin
|
||||
file://CVE-2024-28085-0003.patch \
|
||||
file://CVE-2024-28085-0004.patch \
|
||||
file://CVE-2024-28085-0005.patch \
|
||||
file://fstab-isolation.patch \
|
||||
"
|
||||
|
||||
SRC_URI[sha256sum] = "634e6916ad913366c3536b6468e7844769549b99a7b2bf80314de78ab5655b83"
|
||||
|
||||
419
meta/recipes-core/util-linux/util-linux/fstab-isolation.patch
Normal file
419
meta/recipes-core/util-linux/util-linux/fstab-isolation.patch
Normal file
@@ -0,0 +1,419 @@
|
||||
From 1f6d3c9fd195672987076958eefbabf395fb2df2 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Thomas=20Wei=C3=9Fschuh?= <thomas@t-8ch.de>
|
||||
Date: Sat, 22 Apr 2023 17:48:58 +0200
|
||||
Subject: [PATCH 1/3] tests: (functions.sh) create variable for test fstab
|
||||
location
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Signed-off-by: Thomas Weißschuh <thomas@t-8ch.de>
|
||||
(cherry picked from commit ed3d33faff17fb702a3acfca2f9f24e69f4920de)
|
||||
Upstream-Status: Backport [https://github.com/util-linux/util-linux/commit/ed3d33faff17fb702a3acfca2f9f24e69f4920de]
|
||||
Signed-off-by: Virendra Thakur <virendra.thakur@kpit.com>
|
||||
---
|
||||
tests/functions.sh | 13 +++++++------
|
||||
tests/ts/mount/fstab-broken | 2 +-
|
||||
2 files changed, 8 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/tests/functions.sh b/tests/functions.sh
|
||||
index 1699ba047..93eef8564 100644
|
||||
--- a/tests/functions.sh
|
||||
+++ b/tests/functions.sh
|
||||
@@ -351,6 +351,7 @@ function ts_init_env {
|
||||
TS_ENABLE_UBSAN="yes"
|
||||
fi
|
||||
|
||||
+ TS_FSTAB="/etc/fstab"
|
||||
BLKID_FILE="$TS_OUTDIR/${TS_TESTNAME}.blkidtab"
|
||||
|
||||
declare -a TS_SUID_PROGS
|
||||
@@ -789,12 +790,12 @@ function ts_is_mounted {
|
||||
}
|
||||
|
||||
function ts_fstab_open {
|
||||
- echo "# <!-- util-linux test entry" >> /etc/fstab
|
||||
+ echo "# <!-- util-linux test entry" >> "$TS_FSTAB"
|
||||
}
|
||||
|
||||
function ts_fstab_close {
|
||||
- echo "# -->" >> /etc/fstab
|
||||
- sync /etc/fstab 2>/dev/null
|
||||
+ echo "# -->" >> "$TS_FSTAB"
|
||||
+ sync "$TS_FSTAB" 2>/dev/null
|
||||
}
|
||||
|
||||
function ts_fstab_addline {
|
||||
@@ -803,7 +804,7 @@ function ts_fstab_addline {
|
||||
local FS=${3:-"auto"}
|
||||
local OPT=${4:-"defaults"}
|
||||
|
||||
- echo "$SPEC $MNT $FS $OPT 0 0" >> /etc/fstab
|
||||
+ echo "$SPEC $MNT $FS $OPT 0 0" >> "$TS_FSTAB"
|
||||
}
|
||||
|
||||
function ts_fstab_lock {
|
||||
@@ -827,9 +828,9 @@ function ts_fstab_clean {
|
||||
ba
|
||||
}
|
||||
s/# <!-- util-linux.*-->//;
|
||||
-/^$/d" /etc/fstab
|
||||
+/^$/d" "$TS_FSTAB"
|
||||
|
||||
- sync /etc/fstab 2>/dev/null
|
||||
+ sync "$TS_FSTAB" 2>/dev/null
|
||||
ts_unlock "fstab"
|
||||
}
|
||||
|
||||
diff --git a/tests/ts/mount/fstab-broken b/tests/ts/mount/fstab-broken
|
||||
index 947e3af7a..5ef10f889 100755
|
||||
--- a/tests/ts/mount/fstab-broken
|
||||
+++ b/tests/ts/mount/fstab-broken
|
||||
@@ -33,7 +33,7 @@ mkdir -p $MNT
|
||||
|
||||
ts_fstab_lock
|
||||
ts_fstab_open
|
||||
-echo "tmpd $MNT tmpfs" >> /etc/fstab
|
||||
+echo "tmpd $MNT tmpfs" >> "$TS_FSTAB"
|
||||
ts_fstab_close
|
||||
|
||||
ts_init_subtest "mount"
|
||||
--
|
||||
2.34.1
|
||||
|
||||
|
||||
From 82e44655f33037cbcd2da6664202735d1e37d317 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Thomas=20Wei=C3=9Fschuh?= <thomas@t-8ch.de>
|
||||
Date: Sat, 22 Apr 2023 17:20:45 +0200
|
||||
Subject: [PATCH 2/3] tests: (functions.sh) use per-test fstab file
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Signed-off-by: Thomas Weißschuh <thomas@t-8ch.de>
|
||||
(cherry picked from commit 6aa8d17b6b53b86a46c5da68c02a893113130496)
|
||||
Upstream-Status: Backport [https://github.com/util-linux/util-linux/commit/6aa8d17b6b53b86a46c5da68c02a893113130496]
|
||||
Signed-off-by: Virendra Thakur <virendra.thakur@kpit.com>
|
||||
---
|
||||
tests/functions.sh | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/tests/functions.sh b/tests/functions.sh
|
||||
index 93eef8564..4a5580712 100644
|
||||
--- a/tests/functions.sh
|
||||
+++ b/tests/functions.sh
|
||||
@@ -351,7 +351,7 @@ function ts_init_env {
|
||||
TS_ENABLE_UBSAN="yes"
|
||||
fi
|
||||
|
||||
- TS_FSTAB="/etc/fstab"
|
||||
+ TS_FSTAB="$TS_OUTDIR/${TS_TESTNAME}.fstab"
|
||||
BLKID_FILE="$TS_OUTDIR/${TS_TESTNAME}.blkidtab"
|
||||
|
||||
declare -a TS_SUID_PROGS
|
||||
--
|
||||
2.34.1
|
||||
|
||||
|
||||
From 73257404c6bee007c75b826bb1bd99e8eb6e8f9a Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Thomas=20Wei=C3=9Fschuh?= <thomas@t-8ch.de>
|
||||
Date: Sat, 22 Apr 2023 17:34:28 +0200
|
||||
Subject: [PATCH 3/3] mount: (tests) explicitly use test fstab location
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
Signed-off-by: Thomas Weißschuh <thomas@t-8ch.de>
|
||||
(cherry picked from commit b1580bd760519a2cf052f023057846e54de47484)
|
||||
Upstream-Status: Backport [https://github.com/util-linux/util-linux/commit/b1580bd760519a2cf052f023057846e54de47484]
|
||||
Signed-off-by: Virendra Thakur <virendra.thakur@kpit.com>
|
||||
---
|
||||
tests/ts/mount/fslists | 2 +-
|
||||
tests/ts/mount/fstab-broken | 4 ++--
|
||||
tests/ts/mount/fstab-btrfs | 8 ++++----
|
||||
tests/ts/mount/fstab-devname | 4 ++--
|
||||
tests/ts/mount/fstab-devname2label | 2 +-
|
||||
tests/ts/mount/fstab-devname2uuid | 2 +-
|
||||
tests/ts/mount/fstab-label | 6 +++---
|
||||
tests/ts/mount/fstab-label2devname | 4 ++--
|
||||
tests/ts/mount/fstab-label2uuid | 4 ++--
|
||||
tests/ts/mount/fstab-loop | 4 ++--
|
||||
tests/ts/mount/fstab-none | 2 +-
|
||||
tests/ts/mount/fstab-symlink | 2 +-
|
||||
tests/ts/mount/fstab-uuid | 4 ++--
|
||||
tests/ts/mount/fstab-uuid2devname | 4 ++--
|
||||
tests/ts/mount/fstab-uuid2label | 4 ++--
|
||||
15 files changed, 28 insertions(+), 28 deletions(-)
|
||||
|
||||
diff --git a/tests/ts/mount/fslists b/tests/ts/mount/fslists
|
||||
index 74a87f6a7..3e2efa0db 100755
|
||||
--- a/tests/ts/mount/fslists
|
||||
+++ b/tests/ts/mount/fslists
|
||||
@@ -61,7 +61,7 @@ ts_finalize_subtest
|
||||
ts_init_subtest "more-types-fstab"
|
||||
[ -d "$TS_MOUNTPOINT" ] || mkdir -p $TS_MOUNTPOINT
|
||||
ts_fstab_add $DEVICE $TS_MOUNTPOINT "foo,bar,ext2"
|
||||
-$TS_CMD_MOUNT $TS_MOUNTPOINT >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
+$TS_CMD_MOUNT -T "$TS_FSTAB" $TS_MOUNTPOINT >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
ts_fstab_clean
|
||||
ts_is_mounted $DEVICE || ts_die "Cannot find $DEVICE in /proc/mounts"
|
||||
$TS_CMD_UMOUNT $TS_MOUNTPOINT
|
||||
diff --git a/tests/ts/mount/fstab-broken b/tests/ts/mount/fstab-broken
|
||||
index 5ef10f889..a9855f06f 100755
|
||||
--- a/tests/ts/mount/fstab-broken
|
||||
+++ b/tests/ts/mount/fstab-broken
|
||||
@@ -37,7 +37,7 @@ echo "tmpd $MNT tmpfs" >> "$TS_FSTAB"
|
||||
ts_fstab_close
|
||||
|
||||
ts_init_subtest "mount"
|
||||
-$TS_CMD_MOUNT $MNT &> /dev/null
|
||||
+$TS_CMD_MOUNT -T "$TS_FSTAB" $MNT &> /dev/null
|
||||
[ "$?" = "0" ] || ts_log "error: mount $MNT"
|
||||
$TS_CMD_FINDMNT --kernel --mountpoint "$MNT" &> /dev/null
|
||||
if [ "$?" != "0" ]; then
|
||||
@@ -56,7 +56,7 @@ ts_finalize_subtest
|
||||
|
||||
|
||||
ts_init_subtest "mount-all"
|
||||
-$TS_CMD_MOUNT -a &> /dev/null
|
||||
+$TS_CMD_MOUNT -T "$TS_FSTAB" -a &> /dev/null
|
||||
[ "$?" = "0" ] || ts_log "error: mount -a"
|
||||
$TS_CMD_FINDMNT --kernel --mountpoint "$MNT" &> /dev/null
|
||||
if [ "$?" != "0" ]; then
|
||||
diff --git a/tests/ts/mount/fstab-btrfs b/tests/ts/mount/fstab-btrfs
|
||||
index 0003b5d65..1f93d409d 100755
|
||||
--- a/tests/ts/mount/fstab-btrfs
|
||||
+++ b/tests/ts/mount/fstab-btrfs
|
||||
@@ -91,8 +91,8 @@ ts_fstab_addline "$DEVICE" "$TS_MOUNTPOINT_SUBVOLID" "btrfs" "subvolid=$NON_DEFA
|
||||
ts_fstab_addline "$TS_MOUNTPOINT_SUBVOLID" "$TS_MOUNTPOINT_BIND" "auto" "bind"
|
||||
ts_fstab_close
|
||||
|
||||
-$TS_CMD_MOUNT -a >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
-$TS_CMD_MOUNT -a >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
+$TS_CMD_MOUNT -T "$TS_FSTAB" -a >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
+$TS_CMD_MOUNT -T "$TS_FSTAB" -a >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
|
||||
$TS_CMD_UMOUNT "$TS_MOUNTPOINT_BIND" >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
$TS_CMD_UMOUNT "$TS_MOUNTPOINT_DEFAULT" >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
@@ -121,8 +121,8 @@ ts_fstab_addline "$DEVICE" "$TS_MOUNTPOINT_SUBVOLID" "auto" "subvolid=$NON_DEFAU
|
||||
ts_fstab_addline "$TS_MOUNTPOINT_SUBVOL/bind-mnt" "$TS_MOUNTPOINT_BIND" "auto" "bind"
|
||||
ts_fstab_close
|
||||
|
||||
-$TS_CMD_MOUNT -a >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
-$TS_CMD_MOUNT -a >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
+$TS_CMD_MOUNT -T "$TS_FSTAB" -a >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
+$TS_CMD_MOUNT -T "$TS_FSTAB" -a >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
|
||||
$TS_CMD_UMOUNT "$TS_MOUNTPOINT_BIND" >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
$TS_CMD_UMOUNT "$TS_MOUNTPOINT_DEFAULT" >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
diff --git a/tests/ts/mount/fstab-devname b/tests/ts/mount/fstab-devname
|
||||
index 4e4961ede..3964b81c5 100755
|
||||
--- a/tests/ts/mount/fstab-devname
|
||||
+++ b/tests/ts/mount/fstab-devname
|
||||
@@ -40,12 +40,12 @@ ts_device_has "TYPE" "ext2" $DEVICE || ts_die "Cannot find ext2 on $DEVICE"
|
||||
ts_fstab_add $DEVICE
|
||||
|
||||
# variant A)
|
||||
-$TS_CMD_MOUNT $TS_MOUNTPOINT >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
+$TS_CMD_MOUNT -T "$TS_FSTAB" $TS_MOUNTPOINT >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
ts_is_mounted $DEVICE || ts_die "A) Cannot find $DEVICE in /proc/mounts"
|
||||
$TS_CMD_UMOUNT $DEVICE || ts_die "A) Cannot umount $DEVICE"
|
||||
|
||||
# variant B)
|
||||
-$TS_CMD_MOUNT $DEVICE >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
+$TS_CMD_MOUNT -T "$TS_FSTAB" $DEVICE >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
ts_is_mounted $DEVICE || ts_die "B) Cannot find $DEVICE in /proc/mounts"
|
||||
$TS_CMD_UMOUNT $DEVICE || ts_die "B) Cannot umount $DEVICE"
|
||||
|
||||
diff --git a/tests/ts/mount/fstab-devname2label b/tests/ts/mount/fstab-devname2label
|
||||
index 7257fbc89..1f50d0178 100755
|
||||
--- a/tests/ts/mount/fstab-devname2label
|
||||
+++ b/tests/ts/mount/fstab-devname2label
|
||||
@@ -41,7 +41,7 @@ ts_device_has "LABEL" $LABEL $DEVICE \
|
||||
ts_fstab_add "LABEL=$LABEL"
|
||||
ts_udevadm_settle "$DEVICE" "LABEL"
|
||||
|
||||
-$TS_CMD_MOUNT $DEVICE >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
+$TS_CMD_MOUNT -T "$TS_FSTAB" $DEVICE >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
ts_is_mounted $DEVICE || ts_die "Cannot find $DEVICE in /proc/mounts"
|
||||
$TS_CMD_UMOUNT $DEVICE || ts_die "Cannot umount $DEVICE"
|
||||
|
||||
diff --git a/tests/ts/mount/fstab-devname2uuid b/tests/ts/mount/fstab-devname2uuid
|
||||
index 02b3ee161..f1fa23152 100755
|
||||
--- a/tests/ts/mount/fstab-devname2uuid
|
||||
+++ b/tests/ts/mount/fstab-devname2uuid
|
||||
@@ -39,7 +39,7 @@ UUID=$(ts_uuid_by_devname "$DEVICE") || ts_die "Cannot find UUID on $DEVICE"
|
||||
ts_fstab_add "UUID=$UUID"
|
||||
ts_udevadm_settle "$DEVICE" "UUID"
|
||||
|
||||
-$TS_CMD_MOUNT $DEVICE >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
+$TS_CMD_MOUNT -T "$TS_FSTAB" $DEVICE >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
ts_is_mounted $DEVICE || ts_die "Cannot find $DEVICE in /proc/mounts"
|
||||
$TS_CMD_UMOUNT $DEVICE || ts_die "Cannot umount $DEVICE"
|
||||
|
||||
diff --git a/tests/ts/mount/fstab-label b/tests/ts/mount/fstab-label
|
||||
index a86bdf6c0..6dd1c7bfc 100755
|
||||
--- a/tests/ts/mount/fstab-label
|
||||
+++ b/tests/ts/mount/fstab-label
|
||||
@@ -42,17 +42,17 @@ ts_fstab_add "LABEL=$LABEL"
|
||||
ts_udevadm_settle "$DEVICE" "LABEL"
|
||||
|
||||
# variant A)
|
||||
-$TS_CMD_MOUNT $TS_MOUNTPOINT >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
+$TS_CMD_MOUNT -T "$TS_FSTAB" $TS_MOUNTPOINT >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
ts_is_mounted $DEVICE || ts_die "A) Cannot find $DEVICE in /proc/mounts"
|
||||
$TS_CMD_UMOUNT $DEVICE || ts_die "A) Cannot umount $DEVICE"
|
||||
|
||||
# variant B)
|
||||
-$TS_CMD_MOUNT -L $LABEL >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
+$TS_CMD_MOUNT -T "$TS_FSTAB" -L $LABEL >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
ts_is_mounted $DEVICE || ts_die "B) Cannot find $DEVICE in /proc/mounts"
|
||||
$TS_CMD_UMOUNT $DEVICE || ts_die "B) Cannot umount $DEVICE"
|
||||
|
||||
# variant C)
|
||||
-$TS_CMD_MOUNT LABEL=$LABEL >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
+$TS_CMD_MOUNT -T "$TS_FSTAB" LABEL=$LABEL >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
ts_is_mounted $DEVICE || ts_die "C) Cannot find $DEVICE in /proc/mounts"
|
||||
$TS_CMD_UMOUNT $DEVICE || ts_die "C) Cannot umount $DEVICE"
|
||||
|
||||
diff --git a/tests/ts/mount/fstab-label2devname b/tests/ts/mount/fstab-label2devname
|
||||
index 181352aef..359479aaa 100755
|
||||
--- a/tests/ts/mount/fstab-label2devname
|
||||
+++ b/tests/ts/mount/fstab-label2devname
|
||||
@@ -42,12 +42,12 @@ ts_fstab_add "$DEVICE"
|
||||
ts_udevadm_settle "$DEVICE" "LABEL"
|
||||
|
||||
# variant A)
|
||||
-$TS_CMD_MOUNT -L $LABEL >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
+$TS_CMD_MOUNT -T "$TS_FSTAB" -L $LABEL >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
ts_is_mounted $DEVICE || ts_die "A) Cannot find $DEVICE in /proc/mounts"
|
||||
$TS_CMD_UMOUNT $DEVICE || ts_die "A) Cannot umount $DEVICE"
|
||||
|
||||
# variant B)
|
||||
-$TS_CMD_MOUNT "LABEL=$LABEL" >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
+$TS_CMD_MOUNT -T "$TS_FSTAB" "LABEL=$LABEL" >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
ts_is_mounted $DEVICE || ts_die "B) Cannot find $DEVICE in /proc/mounts"
|
||||
$TS_CMD_UMOUNT $DEVICE || ts_die "B) Cannot umount $DEVICE"
|
||||
|
||||
diff --git a/tests/ts/mount/fstab-label2uuid b/tests/ts/mount/fstab-label2uuid
|
||||
index 027bf8059..5884faeed 100755
|
||||
--- a/tests/ts/mount/fstab-label2uuid
|
||||
+++ b/tests/ts/mount/fstab-label2uuid
|
||||
@@ -44,12 +44,12 @@ ts_fstab_add "UUID=$UUID"
|
||||
ts_udevadm_settle "$DEVICE" "LABEL" "UUID"
|
||||
|
||||
# variant A)
|
||||
-$TS_CMD_MOUNT -L $LABEL >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
+$TS_CMD_MOUNT -T "$TS_FSTAB" -L $LABEL >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
ts_is_mounted $DEVICE || ts_die "A) Cannot find $DEVICE in /proc/mounts"
|
||||
$TS_CMD_UMOUNT $DEVICE || ts_die "A) Cannot umount $DEVICE"
|
||||
|
||||
# variant B)
|
||||
-$TS_CMD_MOUNT "LABEL=$LABEL" >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
+$TS_CMD_MOUNT -T "$TS_FSTAB" "LABEL=$LABEL" >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
ts_is_mounted $DEVICE || ts_die "B) Cannot find $DEVICE in /proc/mounts"
|
||||
$TS_CMD_UMOUNT $DEVICE || ts_die "B) Cannot umount $DEVICE"
|
||||
|
||||
diff --git a/tests/ts/mount/fstab-loop b/tests/ts/mount/fstab-loop
|
||||
index 7d4fbff3c..29ceb937d 100755
|
||||
--- a/tests/ts/mount/fstab-loop
|
||||
+++ b/tests/ts/mount/fstab-loop
|
||||
@@ -39,10 +39,10 @@ ts_fstab_lock
|
||||
ts_fstab_open
|
||||
|
||||
ts_fstab_addline "$IMG" "$TS_MOUNTPOINT-1" "ext2" "loop"
|
||||
-$TS_CMD_MOUNT -a >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
+$TS_CMD_MOUNT -T "$TS_FSTAB" -a >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
|
||||
ts_fstab_addline "$IMG" "$TS_MOUNTPOINT-2" "ext2" "loop"
|
||||
-$TS_CMD_MOUNT -a >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
+$TS_CMD_MOUNT -T "$TS_FSTAB" -a >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
|
||||
ts_fstab_close
|
||||
|
||||
diff --git a/tests/ts/mount/fstab-none b/tests/ts/mount/fstab-none
|
||||
index e2ed0af02..4d1ec283b 100755
|
||||
--- a/tests/ts/mount/fstab-none
|
||||
+++ b/tests/ts/mount/fstab-none
|
||||
@@ -16,7 +16,7 @@ ts_fstab_add "none" "$TS_MOUNTPOINT" "tmpfs" "rw,nosuid,nodev,relatime"
|
||||
|
||||
mkdir -p $TS_MOUNTPOINT
|
||||
|
||||
-$TS_CMD_MOUNT $TS_MOUNTPOINT >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
+$TS_CMD_MOUNT -T "$TS_FSTAB" $TS_MOUNTPOINT >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
[ "$?" = "0" ] || ts_log "error: mount $TS_MOUNTPOINT"
|
||||
|
||||
$TS_CMD_FINDMNT --mountpoint "$TS_MOUNTPOINT" &> /dev/null
|
||||
diff --git a/tests/ts/mount/fstab-symlink b/tests/ts/mount/fstab-symlink
|
||||
index 9f63a5afc..e00b33d61 100755
|
||||
--- a/tests/ts/mount/fstab-symlink
|
||||
+++ b/tests/ts/mount/fstab-symlink
|
||||
@@ -46,7 +46,7 @@ ln -s $DEVICE $LINKNAME
|
||||
ts_fstab_add $LINKNAME $TS_MOUNTPOINT "auto" "defaults,user"
|
||||
|
||||
# variant A) -- UID=0
|
||||
-$TS_CMD_MOUNT $LINKNAME >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
+$TS_CMD_MOUNT -T "$TS_FSTAB" $LINKNAME >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
ts_is_mounted $DEVICE || ts_die "A) Cannot find $DEVICE in /proc/mounts"
|
||||
$TS_CMD_UMOUNT $LINKNAME || ts_die "A) Cannot umount $LINKNAME"
|
||||
|
||||
diff --git a/tests/ts/mount/fstab-uuid b/tests/ts/mount/fstab-uuid
|
||||
index ce4c86ea8..45694c9f3 100755
|
||||
--- a/tests/ts/mount/fstab-uuid
|
||||
+++ b/tests/ts/mount/fstab-uuid
|
||||
@@ -40,12 +40,12 @@ ts_fstab_add "UUID=$UUID"
|
||||
ts_udevadm_settle "$DEVICE" "UUID"
|
||||
|
||||
# variant A)
|
||||
-$TS_CMD_MOUNT $TS_MOUNTPOINT >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
+$TS_CMD_MOUNT -T "$TS_FSTAB" $TS_MOUNTPOINT >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
ts_is_mounted $DEVICE || ts_die "A) Cannot find $DEVICE in /proc/mounts"
|
||||
$TS_CMD_UMOUNT $DEVICE || ts_die "A) Cannot umount $DEVICE"
|
||||
|
||||
# variant B)
|
||||
-$TS_CMD_MOUNT -U $UUID >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
+$TS_CMD_MOUNT -T "$TS_FSTAB" -U $UUID >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
ts_is_mounted $DEVICE || ts_die "B) Cannot find $DEVICE in /proc/mounts"
|
||||
$TS_CMD_UMOUNT $DEVICE || ts_die "B) Cannot umount $DEVICE"
|
||||
|
||||
diff --git a/tests/ts/mount/fstab-uuid2devname b/tests/ts/mount/fstab-uuid2devname
|
||||
index 4ce72556c..82367235f 100755
|
||||
--- a/tests/ts/mount/fstab-uuid2devname
|
||||
+++ b/tests/ts/mount/fstab-uuid2devname
|
||||
@@ -40,12 +40,12 @@ ts_fstab_add "$DEVICE"
|
||||
ts_udevadm_settle "$DEVICE" "UUID"
|
||||
|
||||
# variant A)
|
||||
-$TS_CMD_MOUNT -U $UUID >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
+$TS_CMD_MOUNT -T "$TS_FSTAB" -U $UUID >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
ts_is_mounted $DEVICE || ts_die "A) Cannot find $DEVICE in /proc/mounts"
|
||||
$TS_CMD_UMOUNT $DEVICE || ts_die "A) Cannot umount $DEVICE"
|
||||
|
||||
# variant B)
|
||||
-$TS_CMD_MOUNT "UUID=$UUID" >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
+$TS_CMD_MOUNT -T "$TS_FSTAB" "UUID=$UUID" >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
ts_is_mounted $DEVICE || ts_die "B) Cannot find $DEVICE in /proc/mounts"
|
||||
$TS_CMD_UMOUNT $DEVICE || ts_die "B) Cannot umount $DEVICE"
|
||||
|
||||
diff --git a/tests/ts/mount/fstab-uuid2label b/tests/ts/mount/fstab-uuid2label
|
||||
index b1f983df1..1a2ffaada 100755
|
||||
--- a/tests/ts/mount/fstab-uuid2label
|
||||
+++ b/tests/ts/mount/fstab-uuid2label
|
||||
@@ -43,12 +43,12 @@ ts_fstab_add "LABEL=$LABEL"
|
||||
ts_udevadm_settle "$DEVICE" "LABEL" "UUID"
|
||||
|
||||
# variant A)
|
||||
-$TS_CMD_MOUNT -U $UUID >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
+$TS_CMD_MOUNT -T "$TS_FSTAB" -U $UUID >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
ts_is_mounted $DEVICE || ts_die "A) Cannot find $DEVICE in /proc/mounts"
|
||||
$TS_CMD_UMOUNT $DEVICE || ts_die "A) Cannot umount $DEVICE"
|
||||
|
||||
# variant B)
|
||||
-$TS_CMD_MOUNT "UUID=$UUID" >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
+$TS_CMD_MOUNT -T "$TS_FSTAB" "UUID=$UUID" >> $TS_OUTPUT 2>> $TS_ERRLOG
|
||||
ts_is_mounted $DEVICE || ts_die "B) Cannot find $DEVICE in /proc/mounts"
|
||||
$TS_CMD_UMOUNT $DEVICE || ts_die "B) Cannot umount $DEVICE"
|
||||
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -74,5 +74,9 @@ SRC_URI = "\
|
||||
file://0037-CVE-2024-53589.patch \
|
||||
file://0038-CVE-2025-0840.patch \
|
||||
file://0039-CVE-2025-1178.patch \
|
||||
file://0040-CVE-2025-1180.patch \
|
||||
file://0040-CVE-2025-1182.patch \
|
||||
file://0041-CVE-2025-5244.patch \
|
||||
file://0042-CVE-2025-5245.patch \
|
||||
"
|
||||
S = "${WORKDIR}/git"
|
||||
|
||||
164
meta/recipes-devtools/binutils/binutils/0040-CVE-2025-1180.patch
Normal file
164
meta/recipes-devtools/binutils/binutils/0040-CVE-2025-1180.patch
Normal file
@@ -0,0 +1,164 @@
|
||||
From 82670cebd1fcecfc16c075c1bd9ec404e3f9af41 Mon Sep 17 00:00:00 2001
|
||||
From: Nick Clifton <nickc@redhat.com>
|
||||
Date: Thu, 29 May 2025 02:41:27 -0700
|
||||
Subject: [PATCH] Prevent illegal memory access when indexing into the
|
||||
sym_hashes array of the elf bfd cookie structure.
|
||||
|
||||
PR 32636
|
||||
|
||||
(cherry picked from commit: f9978defb6fab0bd8583942d97c112b0932ac814)
|
||||
|
||||
Upstream-Status: Backport [https://sourceware.org/git/?p=binutils-gdb.git;a=patch;h=f9978defb6fab0bd8583942d97c112b0932ac814]
|
||||
CVE: CVE-2025-1180
|
||||
|
||||
Signed-off-by: Harish Sadineni <Harish.Sadineni@windriver.com>
|
||||
---
|
||||
bfd/elflink.c | 90 ++++++++++++++++++++++++++-------------------------
|
||||
1 file changed, 46 insertions(+), 44 deletions(-)
|
||||
|
||||
diff --git a/bfd/elflink.c b/bfd/elflink.c
|
||||
index f8521426cad..4c21a0229e7 100644
|
||||
--- a/bfd/elflink.c
|
||||
+++ b/bfd/elflink.c
|
||||
@@ -62,15 +62,16 @@ struct elf_find_verdep_info
|
||||
static bool _bfd_elf_fix_symbol_flags
|
||||
(struct elf_link_hash_entry *, struct elf_info_failed *);
|
||||
|
||||
-asection *
|
||||
-_bfd_elf_section_for_symbol (struct elf_reloc_cookie *cookie,
|
||||
- unsigned long r_symndx,
|
||||
- bool discard)
|
||||
+static struct elf_link_hash_entry *
|
||||
+get_ext_sym_hash (struct elf_reloc_cookie *cookie, unsigned long r_symndx)
|
||||
{
|
||||
- if (r_symndx >= cookie->locsymcount
|
||||
- || ELF_ST_BIND (cookie->locsyms[r_symndx].st_info) != STB_LOCAL)
|
||||
+ struct elf_link_hash_entry *h = NULL;
|
||||
+
|
||||
+ if ((r_symndx >= cookie->locsymcount
|
||||
+ || ELF_ST_BIND (cookie->locsyms[r_symndx].st_info) != STB_LOCAL)
|
||||
+ /* Guard against corrupt input. See PR 32636 for an example. */
|
||||
+ && r_symndx >= cookie->extsymoff)
|
||||
{
|
||||
- struct elf_link_hash_entry *h;
|
||||
|
||||
h = cookie->sym_hashes[r_symndx - cookie->extsymoff];
|
||||
|
||||
@@ -78,6 +79,22 @@ _bfd_elf_section_for_symbol (struct elf_reloc_cookie *cookie,
|
||||
|| h->root.type == bfd_link_hash_warning)
|
||||
h = (struct elf_link_hash_entry *) h->root.u.i.link;
|
||||
|
||||
+ }
|
||||
+
|
||||
+ return h;
|
||||
+}
|
||||
+
|
||||
+asection *
|
||||
+_bfd_elf_section_for_symbol (struct elf_reloc_cookie *cookie,
|
||||
+ unsigned long r_symndx,
|
||||
+ bool discard)
|
||||
+{
|
||||
+ struct elf_link_hash_entry *h;
|
||||
+
|
||||
+ h = get_ext_sym_hash (cookie, r_symndx);
|
||||
+
|
||||
+ if (h != NULL)
|
||||
+ {
|
||||
if ((h->root.type == bfd_link_hash_defined
|
||||
|| h->root.type == bfd_link_hash_defweak)
|
||||
&& discarded_section (h->root.u.def.section))
|
||||
@@ -85,21 +102,20 @@ _bfd_elf_section_for_symbol (struct elf_reloc_cookie *cookie,
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
- else
|
||||
- {
|
||||
- /* It's not a relocation against a global symbol,
|
||||
- but it could be a relocation against a local
|
||||
- symbol for a discarded section. */
|
||||
- asection *isec;
|
||||
- Elf_Internal_Sym *isym;
|
||||
|
||||
- /* Need to: get the symbol; get the section. */
|
||||
- isym = &cookie->locsyms[r_symndx];
|
||||
- isec = bfd_section_from_elf_index (cookie->abfd, isym->st_shndx);
|
||||
- if (isec != NULL
|
||||
- && discard ? discarded_section (isec) : 1)
|
||||
- return isec;
|
||||
- }
|
||||
+ /* It's not a relocation against a global symbol,
|
||||
+ but it could be a relocation against a local
|
||||
+ symbol for a discarded section. */
|
||||
+ asection *isec;
|
||||
+ Elf_Internal_Sym *isym;
|
||||
+
|
||||
+ /* Need to: get the symbol; get the section. */
|
||||
+ isym = &cookie->locsyms[r_symndx];
|
||||
+ isec = bfd_section_from_elf_index (cookie->abfd, isym->st_shndx);
|
||||
+ if (isec != NULL
|
||||
+ && discard ? discarded_section (isec) : 1)
|
||||
+ return isec;
|
||||
+
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -13642,22 +13658,12 @@ _bfd_elf_gc_mark_rsec (struct bfd_link_info *info, asection *sec,
|
||||
if (r_symndx == STN_UNDEF)
|
||||
return NULL;
|
||||
|
||||
- if (r_symndx >= cookie->locsymcount
|
||||
- || ELF_ST_BIND (cookie->locsyms[r_symndx].st_info) != STB_LOCAL)
|
||||
+ h = get_ext_sym_hash (cookie, r_symndx);
|
||||
+
|
||||
+ if (h != NULL)
|
||||
{
|
||||
bool was_marked;
|
||||
|
||||
- h = cookie->sym_hashes[r_symndx - cookie->extsymoff];
|
||||
- if (h == NULL)
|
||||
- {
|
||||
- info->callbacks->einfo (_("%F%P: corrupt input: %pB\n"),
|
||||
- sec->owner);
|
||||
- return NULL;
|
||||
- }
|
||||
- while (h->root.type == bfd_link_hash_indirect
|
||||
- || h->root.type == bfd_link_hash_warning)
|
||||
- h = (struct elf_link_hash_entry *) h->root.u.i.link;
|
||||
-
|
||||
was_marked = h->mark;
|
||||
h->mark = 1;
|
||||
/* Keep all aliases of the symbol too. If an object symbol
|
||||
@@ -14703,17 +14709,12 @@ bfd_elf_reloc_symbol_deleted_p (bfd_vma offset, void *cookie)
|
||||
if (r_symndx == STN_UNDEF)
|
||||
return true;
|
||||
|
||||
- if (r_symndx >= rcookie->locsymcount
|
||||
- || ELF_ST_BIND (rcookie->locsyms[r_symndx].st_info) != STB_LOCAL)
|
||||
- {
|
||||
- struct elf_link_hash_entry *h;
|
||||
-
|
||||
- h = rcookie->sym_hashes[r_symndx - rcookie->extsymoff];
|
||||
-
|
||||
- while (h->root.type == bfd_link_hash_indirect
|
||||
- || h->root.type == bfd_link_hash_warning)
|
||||
- h = (struct elf_link_hash_entry *) h->root.u.i.link;
|
||||
+ struct elf_link_hash_entry *h;
|
||||
|
||||
+ h = get_ext_sym_hash (rcookie, r_symndx);
|
||||
+
|
||||
+ if (h != NULL)
|
||||
+ {
|
||||
if ((h->root.type == bfd_link_hash_defined
|
||||
|| h->root.type == bfd_link_hash_defweak)
|
||||
&& (h->root.u.def.section->owner != rcookie->abfd
|
||||
@@ -14737,6 +14738,7 @@ bfd_elf_reloc_symbol_deleted_p (bfd_vma offset, void *cookie)
|
||||
|| discarded_section (isec)))
|
||||
return true;
|
||||
}
|
||||
+
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
--
|
||||
2.49.0
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
From b425859021d17adf62f06fb904797cf8642986ad Mon Sep 17 00:00:00 2001
|
||||
From: Nick Clifton <nickc@redhat.com>
|
||||
Date: Wed, 5 Feb 2025 16:27:38 +0000
|
||||
Subject: [PATCH] Fix another illegal memory access triggered by corrupt ELF
|
||||
input files.
|
||||
|
||||
PR 32644
|
||||
|
||||
Upstream-Status: Backport [https://sourceware.org/git/?p=binutils-gdb.git;a=patch;h=b425859021d17adf62f06fb904797cf8642986ad]
|
||||
|
||||
CVE: CVE-2025-1182
|
||||
|
||||
Signed-off-by: Harish Sadineni <Harish.Sadineni@windriver.com>
|
||||
---
|
||||
bfd/elflink.c | 4 ++++
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/bfd/elflink.c b/bfd/elflink.c
|
||||
--- a/bfd/elflink.c
|
||||
+++ b/bfd/elflink.c
|
||||
@@ -14712,6 +14712,10 @@
|
||||
}
|
||||
else
|
||||
{
|
||||
+ if (r_symndx >= rcookie->locsymcount)
|
||||
+ /* This can happen with corrupt input. */
|
||||
+ return false;
|
||||
+
|
||||
/* It's not a relocation against a global symbol,
|
||||
but it could be a relocation against a local
|
||||
symbol for a discarded section. */
|
||||
@@ -0,0 +1,25 @@
|
||||
From: Alan Modra <amodra@gmail.com>
|
||||
Date: Thu, 10 Apr 2025 19:41:49 +0930
|
||||
|
||||
Upstream-Status: Backport [https://sourceware.org/git/?p=binutils-gdb.git;a=patch;h=d1458933830456e54223d9fc61f0d9b3a19256f5]
|
||||
CVE: CVE-2025-5244
|
||||
|
||||
PR32858 ld segfault on fuzzed object
|
||||
We missed one place where it is necessary to check for empty groups.
|
||||
|
||||
Signed-off-by: Deepesh Varatharajan <Deepesh.Varatharajan@windriver.com>
|
||||
|
||||
diff --git a/bfd/elflink.c b/bfd/elflink.c
|
||||
index a76e8e38da7..549b7b7dd92 100644
|
||||
--- a/bfd/elflink.c
|
||||
+++ b/bfd/elflink.c
|
||||
@@ -14408,7 +14408,8 @@ elf_gc_sweep (bfd *abfd, struct bfd_link_info *info)
|
||||
if (o->flags & SEC_GROUP)
|
||||
{
|
||||
asection *first = elf_next_in_group (o);
|
||||
- o->gc_mark = first->gc_mark;
|
||||
+ if (first != NULL)
|
||||
+ o->gc_mark = first->gc_mark;
|
||||
}
|
||||
|
||||
if (o->gc_mark)
|
||||
@@ -0,0 +1,38 @@
|
||||
From: Alan Modra <amodra@gmail.com>
|
||||
Date: Tue, 1 Apr 2025 22:36:54 +1030
|
||||
|
||||
PR32829, SEGV on objdump function debug_type_samep
|
||||
u.kenum is always non-NULL, see debug_make_enum_type.
|
||||
|
||||
Upstream-Status: Backport [https://sourceware.org/git/?p=binutils-gdb.git;a=commitdiff;h=6c3458a8b7ee7d39f070c7b2350851cb2110c65a]
|
||||
CVE: CVE-2025-5245
|
||||
|
||||
Signed-off-by: Deepesh Varatharajan <Deepesh.Varatharajan@windriver.com>
|
||||
|
||||
diff --git a/binutils/debug.c b/binutils/debug.c
|
||||
index dcc8ccde..465b18e7 100644
|
||||
--- a/binutils/debug.c
|
||||
+++ b/binutils/debug.c
|
||||
@@ -2554,9 +2554,6 @@ debug_write_type (struct debug_handle *info,
|
||||
case DEBUG_KIND_UNION_CLASS:
|
||||
return debug_write_class_type (info, fns, fhandle, type, tag);
|
||||
case DEBUG_KIND_ENUM:
|
||||
- if (type->u.kenum == NULL)
|
||||
- return (*fns->enum_type) (fhandle, tag, (const char **) NULL,
|
||||
- (bfd_signed_vma *) NULL);
|
||||
return (*fns->enum_type) (fhandle, tag, type->u.kenum->names,
|
||||
type->u.kenum->values);
|
||||
case DEBUG_KIND_POINTER:
|
||||
@@ -3098,9 +3095,9 @@ debug_type_samep (struct debug_handle *info, struct debug_type_s *t1,
|
||||
break;
|
||||
|
||||
case DEBUG_KIND_ENUM:
|
||||
- if (t1->u.kenum == NULL)
|
||||
- ret = t2->u.kenum == NULL;
|
||||
- else if (t2->u.kenum == NULL)
|
||||
+ if (t1->u.kenum->names == NULL)
|
||||
+ ret = t2->u.kenum->names == NULL;
|
||||
+ else if (t2->u.kenum->names == NULL)
|
||||
ret = false;
|
||||
else
|
||||
{
|
||||
@@ -49,7 +49,7 @@ do_compile() {
|
||||
do_install() {
|
||||
oe_runmake 'DESTDIR=${D}' install
|
||||
|
||||
# The following codes are here because eSDK needs to provide compatibilty
|
||||
# The following codes are here because eSDK needs to provide compatibility
|
||||
# for SDK. That is, eSDK could also be used like traditional SDK.
|
||||
mkdir -p ${D}${datadir}/cmake
|
||||
install -m 644 ${WORKDIR}/OEToolchainConfig.cmake ${D}${datadir}/cmake/
|
||||
|
||||
@@ -0,0 +1,205 @@
|
||||
From 4f992e105bf4a85062bb439ca63daefc8a992f94 Mon Sep 17 00:00:00 2001
|
||||
From: John Drouhard <john@drouhard.dev>
|
||||
Date: Thu, 9 Jan 2025 20:34:42 -0600
|
||||
Subject: [PATCH] ctest: Allow arbitrary characters in test names of
|
||||
CTestCostData.txt
|
||||
|
||||
This changes the way lines in CTestCostData.txt are parsed to allow for
|
||||
spaces in the test name.
|
||||
|
||||
It does so by looking for space characters from the end; and once two
|
||||
have been found, assumes everything from the beginning up to that
|
||||
second-to-last-space is the test name.
|
||||
|
||||
Additionally, parsing the file should be much more efficient since there
|
||||
is no string or vector heap allocation per line. The std::string used by
|
||||
the parse function to convert the int and float should be within most
|
||||
standard libraries' small string optimization.
|
||||
|
||||
Fixes: #26594
|
||||
|
||||
Upstream-Status: Backport [4.0.0, 040da7d83216ace59710407e8ce35d5fd38e1340]
|
||||
Signed-off-by: Moritz Haase <Moritz.Haase@bmw.de>
|
||||
---
|
||||
Source/CTest/cmCTestMultiProcessHandler.cxx | 80 +++++++++++++++------
|
||||
Source/CTest/cmCTestMultiProcessHandler.h | 3 +-
|
||||
Tests/CTestTestScheduler/CMakeLists.txt | 4 +-
|
||||
3 files changed, 64 insertions(+), 23 deletions(-)
|
||||
|
||||
diff --git a/Source/CTest/cmCTestMultiProcessHandler.cxx b/Source/CTest/cmCTestMultiProcessHandler.cxx
|
||||
index d90c4a64651e4d53cc219abe76cb10a342e8aa35..311d2368bcc99abfb4b61c77032b26a440bc5bde 100644
|
||||
--- a/Source/CTest/cmCTestMultiProcessHandler.cxx
|
||||
+++ b/Source/CTest/cmCTestMultiProcessHandler.cxx
|
||||
@@ -19,6 +19,7 @@
|
||||
#include <vector>
|
||||
|
||||
#include <cm/memory>
|
||||
+#include <cm/string_view>
|
||||
#include <cmext/algorithm>
|
||||
|
||||
#include <cm3p/json/value.h>
|
||||
@@ -41,6 +42,51 @@
|
||||
#include "cmUVSignalHackRAII.h" // IWYU pragma: keep
|
||||
#include "cmWorkingDirectory.h"
|
||||
|
||||
+namespace {
|
||||
+
|
||||
+struct CostEntry
|
||||
+{
|
||||
+ cm::string_view name;
|
||||
+ int prevRuns;
|
||||
+ float cost;
|
||||
+};
|
||||
+
|
||||
+cm::optional<CostEntry> splitCostLine(cm::string_view line)
|
||||
+{
|
||||
+ std::string part;
|
||||
+ cm::string_view::size_type pos1 = line.size();
|
||||
+ cm::string_view::size_type pos2 = line.find_last_of(' ', pos1);
|
||||
+ auto findNext = [line, &part, &pos1, &pos2]() -> bool {
|
||||
+ if (pos2 != cm::string_view::npos) {
|
||||
+ cm::string_view sub = line.substr(pos2 + 1, pos1 - pos2 - 1);
|
||||
+ part.assign(sub.begin(), sub.end());
|
||||
+ pos1 = pos2;
|
||||
+ if (pos1 > 0) {
|
||||
+ pos2 = line.find_last_of(' ', pos1 - 1);
|
||||
+ }
|
||||
+ return true;
|
||||
+ }
|
||||
+ return false;
|
||||
+ };
|
||||
+
|
||||
+ // parse the cost
|
||||
+ if (!findNext()) {
|
||||
+ return cm::nullopt;
|
||||
+ }
|
||||
+ float cost = static_cast<float>(atof(part.c_str()));
|
||||
+
|
||||
+ // parse the previous runs
|
||||
+ if (!findNext()) {
|
||||
+ return cm::nullopt;
|
||||
+ }
|
||||
+ int prev = atoi(part.c_str());
|
||||
+
|
||||
+ // from start to the last found space is the name
|
||||
+ return CostEntry{ line.substr(0, pos1), prev, cost };
|
||||
+}
|
||||
+
|
||||
+}
|
||||
+
|
||||
namespace cmsys {
|
||||
class RegularExpression;
|
||||
}
|
||||
@@ -691,24 +737,21 @@ void cmCTestMultiProcessHandler::UpdateCostData()
|
||||
if (line == "---") {
|
||||
break;
|
||||
}
|
||||
- std::vector<std::string> parts = cmSystemTools::SplitString(line, ' ');
|
||||
// Format: <name> <previous_runs> <avg_cost>
|
||||
- if (parts.size() < 3) {
|
||||
+ cm::optional<CostEntry> entry = splitCostLine(line);
|
||||
+ if (!entry) {
|
||||
break;
|
||||
}
|
||||
|
||||
- std::string name = parts[0];
|
||||
- int prev = atoi(parts[1].c_str());
|
||||
- float cost = static_cast<float>(atof(parts[2].c_str()));
|
||||
-
|
||||
- int index = this->SearchByName(name);
|
||||
+ int index = this->SearchByName(entry->name);
|
||||
if (index == -1) {
|
||||
// This test is not in memory. We just rewrite the entry
|
||||
- fout << name << " " << prev << " " << cost << "\n";
|
||||
+ fout << entry->name << " " << entry->prevRuns << " " << entry->cost
|
||||
+ << "\n";
|
||||
} else {
|
||||
// Update with our new average cost
|
||||
- fout << name << " " << this->Properties[index]->PreviousRuns << " "
|
||||
- << this->Properties[index]->Cost << "\n";
|
||||
+ fout << entry->name << " " << this->Properties[index]->PreviousRuns
|
||||
+ << " " << this->Properties[index]->Cost << "\n";
|
||||
temp.erase(index);
|
||||
}
|
||||
}
|
||||
@@ -744,28 +787,25 @@ void cmCTestMultiProcessHandler::ReadCostData()
|
||||
break;
|
||||
}
|
||||
|
||||
- std::vector<std::string> parts = cmSystemTools::SplitString(line, ' ');
|
||||
+ // Format: <name> <previous_runs> <avg_cost>
|
||||
+ cm::optional<CostEntry> entry = splitCostLine(line);
|
||||
|
||||
// Probably an older version of the file, will be fixed next run
|
||||
- if (parts.size() < 3) {
|
||||
+ if (!entry) {
|
||||
fin.close();
|
||||
return;
|
||||
}
|
||||
|
||||
- std::string name = parts[0];
|
||||
- int prev = atoi(parts[1].c_str());
|
||||
- float cost = static_cast<float>(atof(parts[2].c_str()));
|
||||
-
|
||||
- int index = this->SearchByName(name);
|
||||
+ int index = this->SearchByName(entry->name);
|
||||
if (index == -1) {
|
||||
continue;
|
||||
}
|
||||
|
||||
- this->Properties[index]->PreviousRuns = prev;
|
||||
+ this->Properties[index]->PreviousRuns = entry->prevRuns;
|
||||
// When not running in parallel mode, don't use cost data
|
||||
if (this->ParallelLevel > 1 && this->Properties[index] &&
|
||||
this->Properties[index]->Cost == 0) {
|
||||
- this->Properties[index]->Cost = cost;
|
||||
+ this->Properties[index]->Cost = entry->cost;
|
||||
}
|
||||
}
|
||||
// Next part of the file is the failed tests
|
||||
@@ -778,7 +818,7 @@ void cmCTestMultiProcessHandler::ReadCostData()
|
||||
}
|
||||
}
|
||||
|
||||
-int cmCTestMultiProcessHandler::SearchByName(std::string const& name)
|
||||
+int cmCTestMultiProcessHandler::SearchByName(cm::string_view name)
|
||||
{
|
||||
int index = -1;
|
||||
|
||||
diff --git a/Source/CTest/cmCTestMultiProcessHandler.h b/Source/CTest/cmCTestMultiProcessHandler.h
|
||||
index 5de42f9e3209f4b7f0e856afc458e8b4a35d87b7..11e995d9e06ba9fdb0e086dc3e5e4175f8158cd0 100644
|
||||
--- a/Source/CTest/cmCTestMultiProcessHandler.h
|
||||
+++ b/Source/CTest/cmCTestMultiProcessHandler.h
|
||||
@@ -10,6 +10,7 @@
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
+#include <cm/string_view>
|
||||
#include <cm3p/uv.h>
|
||||
#include <stddef.h>
|
||||
|
||||
@@ -111,7 +112,7 @@ protected:
|
||||
void UpdateCostData();
|
||||
void ReadCostData();
|
||||
// Return index of a test based on its name
|
||||
- int SearchByName(std::string const& name);
|
||||
+ int SearchByName(cm::string_view name);
|
||||
|
||||
void CreateTestCostList();
|
||||
|
||||
diff --git a/Tests/CTestTestScheduler/CMakeLists.txt b/Tests/CTestTestScheduler/CMakeLists.txt
|
||||
index a3f0f27cdcb901bb309bb6cb6cd9307ce1ba20a2..daf6ce2b23d8c048334ae1047759130b246dccef 100644
|
||||
--- a/Tests/CTestTestScheduler/CMakeLists.txt
|
||||
+++ b/Tests/CTestTestScheduler/CMakeLists.txt
|
||||
@@ -1,9 +1,9 @@
|
||||
-cmake_minimum_required (VERSION 2.8.12)
|
||||
+cmake_minimum_required(VERSION 3.19)
|
||||
project (CTestTestScheduler)
|
||||
include (CTest)
|
||||
|
||||
add_executable (Sleep sleep.c)
|
||||
|
||||
foreach (time RANGE 1 4)
|
||||
- add_test (TestSleep${time} Sleep ${time})
|
||||
+ add_test ("TestSleep ${time}" Sleep ${time})
|
||||
endforeach ()
|
||||
@@ -10,6 +10,7 @@ SRC_URI:append:class-nativesdk = " \
|
||||
file://cmake-setup.py \
|
||||
file://environment.d-cmake.sh \
|
||||
file://0001-CMakeDetermineSystem-use-oe-environment-vars-to-load.patch \
|
||||
file://0001-ctest-Allow-arbitrary-characters-in-test-names-of-CT.patch \
|
||||
"
|
||||
|
||||
LICENSE:append = " & BSD-1-Clause & MIT"
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -eux
|
||||
cd ./test
|
||||
SKIP_SLOW_TESTS=yes ./test_script | sed -u -e '/:[[:space:]]ok/s/^/PASS: /' -e '/:[[:space:]]failed/s/^/FAIL: /' -e '/:[[:space:]]skipped/s/^/SKIP: /'
|
||||
SKIP_SLOW_TESTS=yes ./test_script | sed -e '/:[[:space:]]ok/s/^/PASS: /' -e '/:[[:space:]]failed/s/^/FAIL: /' -e '/:[[:space:]]skipped/s/^/SKIP: /'
|
||||
rm -rf /var/volatile/tmp/*e2fsprogs*
|
||||
rm -f tmp-*
|
||||
rm -f *.tmp
|
||||
|
||||
@@ -60,6 +60,7 @@ SRC_URI = "\
|
||||
file://0029-Fix-install-path-of-linux64.h.patch \
|
||||
file://0030-rust-recursion-limit.patch \
|
||||
file://0031-gcc-sanitizers-fix.patch \
|
||||
file://0032-gcc-aarch64-fix-strict-align-cpymem-setmem.patch \
|
||||
file://0001-CVE-2021-42574.patch \
|
||||
file://0002-CVE-2021-42574.patch \
|
||||
file://0003-CVE-2021-42574.patch \
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
gcc: AArch64 - Fix strict-align cpymem/setmem
|
||||
|
||||
The cpymemdi/setmemdi implementation doesn't fully support strict alignment.
|
||||
Block the expansion if the alignment is less than 16 with STRICT_ALIGNMENT.
|
||||
Clean up the condition when to use MOPS.
|
||||
|
||||
Upstream-Status: Backport [https://gcc.gnu.org/cgit/gcc/commit/?id=b9d16d8361a9e3a82a2f21e759e760d235d43322]
|
||||
|
||||
Signed-off-by: Wilco Dijkstra <wilco.dijkstra@arm.com>
|
||||
Signed-off-by: Sundeep KOKKONDA <sundeep.kokkonda@windriver.com>
|
||||
---
|
||||
--- a/gcc/config/aarch64/aarch64.c 2025-05-08 20:40:10.969865898 -0700
|
||||
+++ b/gcc/config/aarch64/aarch64.c 2025-05-13 23:11:07.006796627 -0700
|
||||
@@ -23621,14 +23621,15 @@
|
||||
int mode_bits;
|
||||
rtx dst = operands[0];
|
||||
rtx src = operands[1];
|
||||
+ unsigned align = UINTVAL (operands[3]);
|
||||
rtx base;
|
||||
machine_mode cur_mode = BLKmode;
|
||||
|
||||
/* Only expand fixed-size copies. */
|
||||
- if (!CONST_INT_P (operands[2]))
|
||||
+ if (!CONST_INT_P (operands[2]) || (STRICT_ALIGNMENT && align < 16))
|
||||
return false;
|
||||
|
||||
- unsigned HOST_WIDE_INT size = INTVAL (operands[2]);
|
||||
+ unsigned HOST_WIDE_INT size = UINTVAL (operands[2]);
|
||||
|
||||
/* Inline up to 256 bytes when optimizing for speed. */
|
||||
unsigned HOST_WIDE_INT max_copy_size = 256;
|
||||
@@ -23750,11 +23751,12 @@
|
||||
unsigned HOST_WIDE_INT len;
|
||||
rtx dst = operands[0];
|
||||
rtx val = operands[2], src;
|
||||
+ unsigned align = UINTVAL (operands[3]);
|
||||
rtx base;
|
||||
machine_mode cur_mode = BLKmode, next_mode;
|
||||
|
||||
/* We can't do anything smart if the amount to copy is not constant. */
|
||||
- if (!CONST_INT_P (operands[1]))
|
||||
+ if (!CONST_INT_P (operands[1]) || (STRICT_ALIGNMENT && align < 16))
|
||||
return false;
|
||||
|
||||
bool speed_p = !optimize_function_for_size_p (cfun);
|
||||
100
meta/recipes-devtools/git/git/CVE-2024-50349-0001.patch
Normal file
100
meta/recipes-devtools/git/git/CVE-2024-50349-0001.patch
Normal file
@@ -0,0 +1,100 @@
|
||||
From c903985bf7e772e2d08275c1a95c8a55ab011577 Mon Sep 17 00:00:00 2001
|
||||
From: Johannes Schindelin <johannes.schindelin@gmx.de>
|
||||
Date: Thu, 7 Nov 2024 08:57:52 +0100
|
||||
Subject: [PATCH] credential_format(): also encode <host>[:<port>]
|
||||
|
||||
An upcoming change wants to sanitize the credential password prompt
|
||||
where a URL is displayed that may potentially come from a `.gitmodules`
|
||||
file. To this end, the `credential_format()` function is employed.
|
||||
|
||||
To sanitize the host name (and optional port) part of the URL, we need a
|
||||
new mode of the `strbuf_add_percentencode()` function because the
|
||||
current mode is both too strict and too lenient: too strict because it
|
||||
encodes `:`, `[` and `]` (which should be left unencoded in
|
||||
`<host>:<port>` and in IPv6 addresses), and too lenient because it does
|
||||
not encode invalid host name characters `/`, `_` and `~`.
|
||||
|
||||
So let's introduce and use a new mode specifically to encode the host
|
||||
name and optional port part of a URI, leaving alpha-numerical
|
||||
characters, periods, colons and brackets alone and encoding all others.
|
||||
|
||||
This only leads to a change of behavior for URLs that contain invalid
|
||||
host names.
|
||||
|
||||
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
|
||||
|
||||
Upstream-Status: Backport [https://github.com/git/git/commit/c903985bf7e772e2d08275c1a95c8a55ab011577]
|
||||
CVE: CVE-2024-50349
|
||||
Signed-off-by: Vijay Anusuri <vanusuri@mvista.com>
|
||||
---
|
||||
credential.c | 3 ++-
|
||||
strbuf.c | 4 +++-
|
||||
strbuf.h | 1 +
|
||||
t/t0300-credentials.sh | 13 +++++++++++++
|
||||
4 files changed, 19 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/credential.c b/credential.c
|
||||
index f32011343f9400..572f1785da7d3e 100644
|
||||
--- a/credential.c
|
||||
+++ b/credential.c
|
||||
@@ -164,7 +164,8 @@ static void credential_format(struct credential *c, struct strbuf *out)
|
||||
strbuf_addch(out, '@');
|
||||
}
|
||||
if (c->host)
|
||||
- strbuf_addstr(out, c->host);
|
||||
+ strbuf_add_percentencode(out, c->host,
|
||||
+ STRBUF_ENCODE_HOST_AND_PORT);
|
||||
if (c->path) {
|
||||
strbuf_addch(out, '/');
|
||||
strbuf_add_percentencode(out, c->path, 0);
|
||||
diff --git a/strbuf.c b/strbuf.c
|
||||
index c383f41a3c5ccc..756b96c56157c3 100644
|
||||
--- a/strbuf.c
|
||||
+++ b/strbuf.c
|
||||
@@ -492,7 +492,9 @@ void strbuf_add_percentencode(struct strbuf *dst, const char *src, int flags)
|
||||
unsigned char ch = src[i];
|
||||
if (ch <= 0x1F || ch >= 0x7F ||
|
||||
(ch == '/' && (flags & STRBUF_ENCODE_SLASH)) ||
|
||||
- strchr(URL_UNSAFE_CHARS, ch))
|
||||
+ ((flags & STRBUF_ENCODE_HOST_AND_PORT) ?
|
||||
+ !isalnum(ch) && !strchr("-.:[]", ch) :
|
||||
+ !!strchr(URL_UNSAFE_CHARS, ch)))
|
||||
strbuf_addf(dst, "%%%02X", (unsigned char)ch);
|
||||
else
|
||||
strbuf_addch(dst, ch);
|
||||
diff --git a/strbuf.h b/strbuf.h
|
||||
index f6dbb9681ee768..f9f8bb0381b3c5 100644
|
||||
--- a/strbuf.h
|
||||
+++ b/strbuf.h
|
||||
@@ -380,6 +380,7 @@ size_t strbuf_expand_dict_cb(struct strbuf *sb,
|
||||
void strbuf_addbuf_percentquote(struct strbuf *dst, const struct strbuf *src);
|
||||
|
||||
#define STRBUF_ENCODE_SLASH 1
|
||||
+#define STRBUF_ENCODE_HOST_AND_PORT 2
|
||||
|
||||
/**
|
||||
* Append the contents of a string to a strbuf, percent-encoding any characters
|
||||
diff --git a/t/t0300-credentials.sh b/t/t0300-credentials.sh
|
||||
index c66d91e82d8bc7..cb91be1427f1d2 100755
|
||||
--- a/t/t0300-credentials.sh
|
||||
+++ b/t/t0300-credentials.sh
|
||||
@@ -514,6 +514,19 @@ test_expect_success 'match percent-encoded values in username' '
|
||||
EOF
|
||||
'
|
||||
|
||||
+test_expect_success 'match percent-encoded values in hostname' '
|
||||
+ test_config "credential.https://a%20b%20c/.helper" "$HELPER" &&
|
||||
+ check fill <<-\EOF
|
||||
+ url=https://a b c/
|
||||
+ --
|
||||
+ protocol=https
|
||||
+ host=a b c
|
||||
+ username=foo
|
||||
+ password=bar
|
||||
+ --
|
||||
+ EOF
|
||||
+'
|
||||
+
|
||||
test_expect_success 'fetch with multiple path components' '
|
||||
test_unconfig credential.helper &&
|
||||
test_config credential.https://example.com/foo/repo.git.helper "verbatim foo bar" &&
|
||||
321
meta/recipes-devtools/git/git/CVE-2024-50349-0002.patch
Normal file
321
meta/recipes-devtools/git/git/CVE-2024-50349-0002.patch
Normal file
@@ -0,0 +1,321 @@
|
||||
From 7725b8100ffbbff2750ee4d61a0fcc1f53a086e8 Mon Sep 17 00:00:00 2001
|
||||
From: Johannes Schindelin <johannes.schindelin@gmx.de>
|
||||
Date: Wed, 30 Oct 2024 13:26:10 +0100
|
||||
Subject: [PATCH] credential: sanitize the user prompt
|
||||
|
||||
When asking the user interactively for credentials, we want to avoid
|
||||
misleading them e.g. via control sequences that pretend that the URL
|
||||
targets a trusted host when it does not.
|
||||
|
||||
While Git learned, over the course of the preceding commits, to disallow
|
||||
URLs containing URL-encoded control characters by default, credential
|
||||
helpers are still allowed to specify values very freely (apart from Line
|
||||
Feed and NUL characters, anything is allowed), and this would allow,
|
||||
say, a username containing control characters to be specified that would
|
||||
then be displayed in the interactive terminal prompt asking the user for
|
||||
the password, potentially sending those control characters directly to
|
||||
the terminal. This is undesirable because control characters can be used
|
||||
to mislead users to divulge secret information to untrusted sites.
|
||||
|
||||
To prevent such an attack vector, let's add a `git_prompt()` that forces
|
||||
the displayed text to be sanitized, i.e. displaying question marks
|
||||
instead of control characters.
|
||||
|
||||
Note: While this commit's diff changes a lot of `user@host` strings to
|
||||
`user%40host`, which may look suspicious on the surface, there is a good
|
||||
reason for that: this string specifies a user name, not a
|
||||
<username>@<hostname> combination! In the context of t5541, the actual
|
||||
combination looks like this: `user%40@127.0.0.1:5541`. Therefore, these
|
||||
string replacements document a net improvement introduced by this
|
||||
commit, as `user@host@127.0.0.1` could have left readers wondering where
|
||||
the user name ends and where the host name begins.
|
||||
|
||||
Hinted-at-by: Jeff King <peff@peff.net>
|
||||
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
|
||||
|
||||
Upstream-Status: Backport [https://github.com/git/git/commit/7725b8100ffbbff2750ee4d61a0fcc1f53a086e8]
|
||||
CVE: CVE-2024-50349
|
||||
Signed-off-by: Vijay Anusuri <vanusuri@mvista.com>
|
||||
---
|
||||
Documentation/config/credential.txt | 6 ++++++
|
||||
credential.c | 7 ++++++-
|
||||
credential.h | 4 +++-
|
||||
t/t0300-credentials.sh | 20 ++++++++++++++++++++
|
||||
t/t5541-http-push-smart.sh | 6 +++---
|
||||
t/t5550-http-fetch-dumb.sh | 14 +++++++-------
|
||||
t/t5551-http-fetch-smart.sh | 16 ++++++++--------
|
||||
7 files changed, 53 insertions(+), 20 deletions(-)
|
||||
|
||||
diff --git a/Documentation/config/credential.txt b/Documentation/config/credential.txt
|
||||
index 512f318..fd8113d 100644
|
||||
--- a/Documentation/config/credential.txt
|
||||
+++ b/Documentation/config/credential.txt
|
||||
@@ -14,6 +14,12 @@ credential.useHttpPath::
|
||||
or https URL to be important. Defaults to false. See
|
||||
linkgit:gitcredentials[7] for more information.
|
||||
|
||||
+credential.sanitizePrompt::
|
||||
+ By default, user names and hosts that are shown as part of the
|
||||
+ password prompt are not allowed to contain control characters (they
|
||||
+ will be URL-encoded by default). Configure this setting to `false` to
|
||||
+ override that behavior.
|
||||
+
|
||||
credential.username::
|
||||
If no username is set for a network authentication, use this username
|
||||
by default. See credential.<context>.* below, and
|
||||
diff --git a/credential.c b/credential.c
|
||||
index 195556d..a071ead 100644
|
||||
--- a/credential.c
|
||||
+++ b/credential.c
|
||||
@@ -66,6 +66,8 @@ static int credential_config_callback(const char *var, const char *value,
|
||||
}
|
||||
else if (!strcmp(key, "usehttppath"))
|
||||
c->use_http_path = git_config_bool(var, value);
|
||||
+ else if (!strcmp(key, "sanitizeprompt"))
|
||||
+ c->sanitize_prompt = git_config_bool(var, value);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -177,7 +179,10 @@ static char *credential_ask_one(const char *what, struct credential *c,
|
||||
struct strbuf prompt = STRBUF_INIT;
|
||||
char *r;
|
||||
|
||||
- credential_describe(c, &desc);
|
||||
+ if (c->sanitize_prompt)
|
||||
+ credential_format(c, &desc);
|
||||
+ else
|
||||
+ credential_describe(c, &desc);
|
||||
if (desc.len)
|
||||
strbuf_addf(&prompt, "%s for '%s': ", what, desc.buf);
|
||||
else
|
||||
diff --git a/credential.h b/credential.h
|
||||
index f430e77..222bbf1 100644
|
||||
--- a/credential.h
|
||||
+++ b/credential.h
|
||||
@@ -119,7 +119,8 @@ struct credential {
|
||||
configured:1,
|
||||
quit:1,
|
||||
use_http_path:1,
|
||||
- username_from_proto:1;
|
||||
+ username_from_proto:1,
|
||||
+ sanitize_prompt:1;
|
||||
|
||||
char *username;
|
||||
char *password;
|
||||
@@ -130,6 +131,7 @@ struct credential {
|
||||
|
||||
#define CREDENTIAL_INIT { \
|
||||
.helpers = STRING_LIST_INIT_DUP, \
|
||||
+ .sanitize_prompt = 1, \
|
||||
}
|
||||
|
||||
/* Initialize a credential structure, setting all fields to empty. */
|
||||
diff --git a/t/t0300-credentials.sh b/t/t0300-credentials.sh
|
||||
index c13be4f..9e27499 100755
|
||||
--- a/t/t0300-credentials.sh
|
||||
+++ b/t/t0300-credentials.sh
|
||||
@@ -35,6 +35,10 @@ test_expect_success 'setup helper scripts' '
|
||||
test -z "$pass" || echo password=$pass
|
||||
EOF
|
||||
|
||||
+ write_script git-credential-cntrl-in-username <<-\EOF &&
|
||||
+ printf "username=\\007latrix Lestrange\\n"
|
||||
+ EOF
|
||||
+
|
||||
PATH="$PWD:$PATH"
|
||||
'
|
||||
|
||||
@@ -731,4 +735,20 @@ test_expect_success 'credential config with partial URLs' '
|
||||
test_i18ngrep "skipping credential lookup for key" stderr
|
||||
'
|
||||
|
||||
+BEL="$(printf '\007')"
|
||||
+
|
||||
+test_expect_success 'interactive prompt is sanitized' '
|
||||
+ check fill cntrl-in-username <<-EOF
|
||||
+ protocol=https
|
||||
+ host=example.org
|
||||
+ --
|
||||
+ protocol=https
|
||||
+ host=example.org
|
||||
+ username=${BEL}latrix Lestrange
|
||||
+ password=askpass-password
|
||||
+ --
|
||||
+ askpass: Password for ${SQ}https://%07latrix%20Lestrange@example.org${SQ}:
|
||||
+ EOF
|
||||
+'
|
||||
+
|
||||
test_done
|
||||
diff --git a/t/t5541-http-push-smart.sh b/t/t5541-http-push-smart.sh
|
||||
index 8ca50f8..66e7da0 100755
|
||||
--- a/t/t5541-http-push-smart.sh
|
||||
+++ b/t/t5541-http-push-smart.sh
|
||||
@@ -363,7 +363,7 @@ test_expect_success 'push over smart http with auth' '
|
||||
git push "$HTTPD_URL"/auth/smart/test_repo.git &&
|
||||
git --git-dir="$HTTPD_DOCUMENT_ROOT_PATH/test_repo.git" \
|
||||
log -1 --format=%s >actual &&
|
||||
- expect_askpass both user@host &&
|
||||
+ expect_askpass both user%40host &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
@@ -375,7 +375,7 @@ test_expect_success 'push to auth-only-for-push repo' '
|
||||
git push "$HTTPD_URL"/auth-push/smart/test_repo.git &&
|
||||
git --git-dir="$HTTPD_DOCUMENT_ROOT_PATH/test_repo.git" \
|
||||
log -1 --format=%s >actual &&
|
||||
- expect_askpass both user@host &&
|
||||
+ expect_askpass both user%40host &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
@@ -405,7 +405,7 @@ test_expect_success 'push into half-auth-complete requires password' '
|
||||
git push "$HTTPD_URL/half-auth-complete/smart/half-auth.git" &&
|
||||
git --git-dir="$HTTPD_DOCUMENT_ROOT_PATH/half-auth.git" \
|
||||
log -1 --format=%s >actual &&
|
||||
- expect_askpass both user@host &&
|
||||
+ expect_askpass both user%40host &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
diff --git a/t/t5550-http-fetch-dumb.sh b/t/t5550-http-fetch-dumb.sh
|
||||
index 2592039..fed22e5 100755
|
||||
--- a/t/t5550-http-fetch-dumb.sh
|
||||
+++ b/t/t5550-http-fetch-dumb.sh
|
||||
@@ -95,13 +95,13 @@ test_expect_success 'http auth can use user/pass in URL' '
|
||||
test_expect_success 'http auth can use just user in URL' '
|
||||
set_askpass wrong pass@host &&
|
||||
git clone "$HTTPD_URL_USER/auth/dumb/repo.git" clone-auth-pass &&
|
||||
- expect_askpass pass user@host
|
||||
+ expect_askpass pass user%40host
|
||||
'
|
||||
|
||||
test_expect_success 'http auth can request both user and pass' '
|
||||
set_askpass user@host pass@host &&
|
||||
git clone "$HTTPD_URL/auth/dumb/repo.git" clone-auth-both &&
|
||||
- expect_askpass both user@host
|
||||
+ expect_askpass both user%40host
|
||||
'
|
||||
|
||||
test_expect_success 'http auth respects credential helper config' '
|
||||
@@ -119,14 +119,14 @@ test_expect_success 'http auth can get username from config' '
|
||||
test_config_global "credential.$HTTPD_URL.username" user@host &&
|
||||
set_askpass wrong pass@host &&
|
||||
git clone "$HTTPD_URL/auth/dumb/repo.git" clone-auth-user &&
|
||||
- expect_askpass pass user@host
|
||||
+ expect_askpass pass user%40host
|
||||
'
|
||||
|
||||
test_expect_success 'configured username does not override URL' '
|
||||
test_config_global "credential.$HTTPD_URL.username" wrong &&
|
||||
set_askpass wrong pass@host &&
|
||||
git clone "$HTTPD_URL_USER/auth/dumb/repo.git" clone-auth-user2 &&
|
||||
- expect_askpass pass user@host
|
||||
+ expect_askpass pass user%40host
|
||||
'
|
||||
|
||||
test_expect_success 'set up repo with http submodules' '
|
||||
@@ -147,7 +147,7 @@ test_expect_success 'cmdline credential config passes to submodule via clone' '
|
||||
set_askpass wrong pass@host &&
|
||||
git -c "credential.$HTTPD_URL.username=user@host" \
|
||||
clone --recursive super super-clone &&
|
||||
- expect_askpass pass user@host
|
||||
+ expect_askpass pass user%40host
|
||||
'
|
||||
|
||||
test_expect_success 'cmdline credential config passes submodule via fetch' '
|
||||
@@ -158,7 +158,7 @@ test_expect_success 'cmdline credential config passes submodule via fetch' '
|
||||
git -C super-clone \
|
||||
-c "credential.$HTTPD_URL.username=user@host" \
|
||||
fetch --recurse-submodules &&
|
||||
- expect_askpass pass user@host
|
||||
+ expect_askpass pass user%40host
|
||||
'
|
||||
|
||||
test_expect_success 'cmdline credential config passes submodule update' '
|
||||
@@ -175,7 +175,7 @@ test_expect_success 'cmdline credential config passes submodule update' '
|
||||
git -C super-clone \
|
||||
-c "credential.$HTTPD_URL.username=user@host" \
|
||||
submodule update &&
|
||||
- expect_askpass pass user@host
|
||||
+ expect_askpass pass user%40host
|
||||
'
|
||||
|
||||
test_expect_success 'fetch changes via http' '
|
||||
diff --git a/t/t5551-http-fetch-smart.sh b/t/t5551-http-fetch-smart.sh
|
||||
index f92c79c..53a21f6 100755
|
||||
--- a/t/t5551-http-fetch-smart.sh
|
||||
+++ b/t/t5551-http-fetch-smart.sh
|
||||
@@ -142,7 +142,7 @@ test_expect_success 'clone from password-protected repository' '
|
||||
echo two >expect &&
|
||||
set_askpass user@host pass@host &&
|
||||
git clone --bare "$HTTPD_URL/auth/smart/repo.git" smart-auth &&
|
||||
- expect_askpass both user@host &&
|
||||
+ expect_askpass both user%40host &&
|
||||
git --git-dir=smart-auth log -1 --format=%s >actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
@@ -160,7 +160,7 @@ test_expect_success 'clone from auth-only-for-objects repository' '
|
||||
echo two >expect &&
|
||||
set_askpass user@host pass@host &&
|
||||
git clone --bare "$HTTPD_URL/auth-fetch/smart/repo.git" half-auth &&
|
||||
- expect_askpass both user@host &&
|
||||
+ expect_askpass both user%40host &&
|
||||
git --git-dir=half-auth log -1 --format=%s >actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
@@ -185,14 +185,14 @@ test_expect_success 'redirects send auth to new location' '
|
||||
set_askpass user@host pass@host &&
|
||||
git -c credential.useHttpPath=true \
|
||||
clone $HTTPD_URL/smart-redir-auth/repo.git repo-redir-auth &&
|
||||
- expect_askpass both user@host auth/smart/repo.git
|
||||
+ expect_askpass both user%40host auth/smart/repo.git
|
||||
'
|
||||
|
||||
test_expect_success 'GIT_TRACE_CURL redacts auth details' '
|
||||
rm -rf redact-auth trace &&
|
||||
set_askpass user@host pass@host &&
|
||||
GIT_TRACE_CURL="$(pwd)/trace" git clone --bare "$HTTPD_URL/auth/smart/repo.git" redact-auth &&
|
||||
- expect_askpass both user@host &&
|
||||
+ expect_askpass both user%40host &&
|
||||
|
||||
# Ensure that there is no "Basic" followed by a base64 string, but that
|
||||
# the auth details are redacted
|
||||
@@ -204,7 +204,7 @@ test_expect_success 'GIT_CURL_VERBOSE redacts auth details' '
|
||||
rm -rf redact-auth trace &&
|
||||
set_askpass user@host pass@host &&
|
||||
GIT_CURL_VERBOSE=1 git clone --bare "$HTTPD_URL/auth/smart/repo.git" redact-auth 2>trace &&
|
||||
- expect_askpass both user@host &&
|
||||
+ expect_askpass both user%40host &&
|
||||
|
||||
# Ensure that there is no "Basic" followed by a base64 string, but that
|
||||
# the auth details are redacted
|
||||
@@ -217,7 +217,7 @@ test_expect_success 'GIT_TRACE_CURL does not redact auth details if GIT_TRACE_RE
|
||||
set_askpass user@host pass@host &&
|
||||
GIT_TRACE_REDACT=0 GIT_TRACE_CURL="$(pwd)/trace" \
|
||||
git clone --bare "$HTTPD_URL/auth/smart/repo.git" redact-auth &&
|
||||
- expect_askpass both user@host &&
|
||||
+ expect_askpass both user%40host &&
|
||||
|
||||
grep -i "Authorization: Basic [0-9a-zA-Z+/]" trace
|
||||
'
|
||||
@@ -524,7 +524,7 @@ test_expect_success 'http auth remembers successful credentials' '
|
||||
# the first request prompts the user...
|
||||
set_askpass user@host pass@host &&
|
||||
git ls-remote "$HTTPD_URL/auth/smart/repo.git" >/dev/null &&
|
||||
- expect_askpass both user@host &&
|
||||
+ expect_askpass both user%40host &&
|
||||
|
||||
# ...and the second one uses the stored value rather than
|
||||
# prompting the user.
|
||||
@@ -555,7 +555,7 @@ test_expect_success 'http auth forgets bogus credentials' '
|
||||
# us to prompt the user again.
|
||||
set_askpass user@host pass@host &&
|
||||
git ls-remote "$HTTPD_URL/auth/smart/repo.git" >/dev/null &&
|
||||
- expect_askpass both user@host
|
||||
+ expect_askpass both user%40host
|
||||
'
|
||||
|
||||
test_expect_success 'client falls back from v2 to v0 to match server' '
|
||||
--
|
||||
2.25.1
|
||||
|
||||
165
meta/recipes-devtools/git/git/CVE-2024-52006.patch
Normal file
165
meta/recipes-devtools/git/git/CVE-2024-52006.patch
Normal file
@@ -0,0 +1,165 @@
|
||||
From b01b9b81d36759cdcd07305e78765199e1bc2060 Mon Sep 17 00:00:00 2001
|
||||
From: Johannes Schindelin <johannes.schindelin@gmx.de>
|
||||
Date: Mon, 4 Nov 2024 14:48:22 +0100
|
||||
Subject: [PATCH] credential: disallow Carriage Returns in the protocol by
|
||||
default
|
||||
|
||||
While Git has documented that the credential protocol is line-based,
|
||||
with newlines as terminators, the exact shape of a newline has not been
|
||||
documented.
|
||||
|
||||
From Git's perspective, which is firmly rooted in the Linux ecosystem,
|
||||
it is clear that "a newline" means a Line Feed character.
|
||||
|
||||
However, even Git's credential protocol respects Windows line endings
|
||||
(a Carriage Return character followed by a Line Feed character, "CR/LF")
|
||||
by virtue of using `strbuf_getline()`.
|
||||
|
||||
There is a third category of line endings that has been used originally
|
||||
by MacOS, and that is respected by the default line readers of .NET and
|
||||
node.js: bare Carriage Returns.
|
||||
|
||||
Git cannot handle those, and what is worse: Git's remedy against
|
||||
CVE-2020-5260 does not catch when credential helpers are used that
|
||||
interpret bare Carriage Returns as newlines.
|
||||
|
||||
Git Credential Manager addressed this as CVE-2024-50338, but other
|
||||
credential helpers may still be vulnerable. So let's not only disallow
|
||||
Line Feed characters as part of the values in the credential protocol,
|
||||
but also disallow Carriage Return characters.
|
||||
|
||||
In the unlikely event that a credential helper relies on Carriage
|
||||
Returns in the protocol, introduce an escape hatch via the
|
||||
`credential.protectProtocol` config setting.
|
||||
|
||||
This addresses CVE-2024-52006.
|
||||
|
||||
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
|
||||
|
||||
Upstream-Status: Backport [https://github.com/git/git/commit/b01b9b81d36759cdcd07305e78765199e1bc2060]
|
||||
CVE: CVE-2024-52006
|
||||
Signed-off-by: Vijay Anusuri <vanusuri@mvista.com>
|
||||
---
|
||||
Documentation/config/credential.txt | 5 +++++
|
||||
credential.c | 19 +++++++++++++------
|
||||
credential.h | 4 +++-
|
||||
t/t0300-credentials.sh | 16 ++++++++++++++++
|
||||
4 files changed, 37 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/Documentation/config/credential.txt b/Documentation/config/credential.txt
|
||||
index fd8113d..9cadca7 100644
|
||||
--- a/Documentation/config/credential.txt
|
||||
+++ b/Documentation/config/credential.txt
|
||||
@@ -20,6 +20,11 @@ credential.sanitizePrompt::
|
||||
will be URL-encoded by default). Configure this setting to `false` to
|
||||
override that behavior.
|
||||
|
||||
+credential.protectProtocol::
|
||||
+ By default, Carriage Return characters are not allowed in the protocol
|
||||
+ that is used when Git talks to a credential helper. This setting allows
|
||||
+ users to override this default.
|
||||
+
|
||||
credential.username::
|
||||
If no username is set for a network authentication, use this username
|
||||
by default. See credential.<context>.* below, and
|
||||
diff --git a/credential.c b/credential.c
|
||||
index a071ead..b427d55 100644
|
||||
--- a/credential.c
|
||||
+++ b/credential.c
|
||||
@@ -68,6 +68,8 @@ static int credential_config_callback(const char *var, const char *value,
|
||||
c->use_http_path = git_config_bool(var, value);
|
||||
else if (!strcmp(key, "sanitizeprompt"))
|
||||
c->sanitize_prompt = git_config_bool(var, value);
|
||||
+ else if (!strcmp(key, "protectprotocol"))
|
||||
+ c->protect_protocol = git_config_bool(var, value);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -255,7 +257,8 @@ int credential_read(struct credential *c, FILE *fp)
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static void credential_write_item(FILE *fp, const char *key, const char *value,
|
||||
+static void credential_write_item(const struct credential *c,
|
||||
+ FILE *fp, const char *key, const char *value,
|
||||
int required)
|
||||
{
|
||||
if (!value && required)
|
||||
@@ -264,16 +267,20 @@ static void credential_write_item(FILE *fp, const char *key, const char *value,
|
||||
return;
|
||||
if (strchr(value, '\n'))
|
||||
die("credential value for %s contains newline", key);
|
||||
+ if (c->protect_protocol && strchr(value, '\r'))
|
||||
+ die("credential value for %s contains carriage return\n"
|
||||
+ "If this is intended, set `credential.protectProtocol=false`",
|
||||
+ key);
|
||||
fprintf(fp, "%s=%s\n", key, value);
|
||||
}
|
||||
|
||||
void credential_write(const struct credential *c, FILE *fp)
|
||||
{
|
||||
- credential_write_item(fp, "protocol", c->protocol, 1);
|
||||
- credential_write_item(fp, "host", c->host, 1);
|
||||
- credential_write_item(fp, "path", c->path, 0);
|
||||
- credential_write_item(fp, "username", c->username, 0);
|
||||
- credential_write_item(fp, "password", c->password, 0);
|
||||
+ credential_write_item(c, fp, "protocol", c->protocol, 1);
|
||||
+ credential_write_item(c, fp, "host", c->host, 1);
|
||||
+ credential_write_item(c, fp, "path", c->path, 0);
|
||||
+ credential_write_item(c, fp, "username", c->username, 0);
|
||||
+ credential_write_item(c, fp, "password", c->password, 0);
|
||||
}
|
||||
|
||||
static int run_credential_helper(struct credential *c,
|
||||
diff --git a/credential.h b/credential.h
|
||||
index 222bbf1..b4b837c 100644
|
||||
--- a/credential.h
|
||||
+++ b/credential.h
|
||||
@@ -120,7 +120,8 @@ struct credential {
|
||||
quit:1,
|
||||
use_http_path:1,
|
||||
username_from_proto:1,
|
||||
- sanitize_prompt:1;
|
||||
+ sanitize_prompt:1,
|
||||
+ protect_protocol:1;
|
||||
|
||||
char *username;
|
||||
char *password;
|
||||
@@ -132,6 +133,7 @@ struct credential {
|
||||
#define CREDENTIAL_INIT { \
|
||||
.helpers = STRING_LIST_INIT_DUP, \
|
||||
.sanitize_prompt = 1, \
|
||||
+ .protect_protocol = 1, \
|
||||
}
|
||||
|
||||
/* Initialize a credential structure, setting all fields to empty. */
|
||||
diff --git a/t/t0300-credentials.sh b/t/t0300-credentials.sh
|
||||
index 9e27499..ca158fe 100755
|
||||
--- a/t/t0300-credentials.sh
|
||||
+++ b/t/t0300-credentials.sh
|
||||
@@ -626,6 +626,22 @@ test_expect_success 'url parser rejects embedded newlines' '
|
||||
test_cmp expect stderr
|
||||
'
|
||||
|
||||
+test_expect_success 'url parser rejects embedded carriage returns' '
|
||||
+ test_config credential.helper "!true" &&
|
||||
+ test_must_fail git credential fill 2>stderr <<-\EOF &&
|
||||
+ url=https://example%0d.com/
|
||||
+ EOF
|
||||
+ cat >expect <<-\EOF &&
|
||||
+ fatal: credential value for host contains carriage return
|
||||
+ If this is intended, set `credential.protectProtocol=false`
|
||||
+ EOF
|
||||
+ test_cmp expect stderr &&
|
||||
+ GIT_ASKPASS=true \
|
||||
+ git -c credential.protectProtocol=false credential fill <<-\EOF
|
||||
+ url=https://example%0d.com/
|
||||
+ EOF
|
||||
+'
|
||||
+
|
||||
test_expect_success 'host-less URLs are parsed as empty host' '
|
||||
check fill "verbatim foo bar" <<-\EOF
|
||||
url=cert:///path/to/cert.pem
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@@ -23,6 +23,9 @@ SRC_URI = "${KERNELORG_MIRROR}/software/scm/git/git-${PV}.tar.gz;name=tarball \
|
||||
file://CVE-2024-32021-0001.patch \
|
||||
file://CVE-2024-32021-0002.patch \
|
||||
file://CVE-2024-32465.patch \
|
||||
file://CVE-2024-50349-0001.patch \
|
||||
file://CVE-2024-50349-0002.patch \
|
||||
file://CVE-2024-52006.patch \
|
||||
"
|
||||
|
||||
S = "${WORKDIR}/git-${PV}"
|
||||
|
||||
@@ -63,6 +63,7 @@ SRC_URI += "\
|
||||
file://CVE-2024-34158.patch \
|
||||
file://CVE-2024-45336.patch \
|
||||
file://CVE-2025-22871.patch \
|
||||
file://CVE-2025-4673.patch \
|
||||
"
|
||||
SRC_URI[main.sha256sum] = "a1a48b23afb206f95e7bbaa9b898d965f90826f6f1d1fc0c1d784ada0cd300fd"
|
||||
|
||||
|
||||
70
meta/recipes-devtools/go/go-1.21/CVE-2025-4673.patch
Normal file
70
meta/recipes-devtools/go/go-1.21/CVE-2025-4673.patch
Normal file
@@ -0,0 +1,70 @@
|
||||
From b897e97c36cb62629a458bc681723ca733404e32 Mon Sep 17 00:00:00 2001
|
||||
From: Neal Patel <nealpatel@google.com>
|
||||
Date: Wed, 21 May 2025 14:11:44 -0400
|
||||
Subject: [PATCH] net/http: strip sensitive proxy headers from redirect
|
||||
requests
|
||||
|
||||
Similarly to Authentication entries, Proxy-Authentication entries should be stripped to ensure sensitive information is not leaked on redirects outside of the original domain.
|
||||
|
||||
https://fetch.spec.whatwg.org/#authentication-entries
|
||||
|
||||
Thanks to Takeshi Kaneko (GMO Cybersecurity by Ierae, Inc.) for reporting this issue.
|
||||
|
||||
Updates golang/go#73816
|
||||
Fixes golang/go#73905
|
||||
Fixes CVE-2025-4673
|
||||
|
||||
Change-Id: I1615f31977a2fd014fbc12aae43f82692315a6d0
|
||||
Reviewed-on: https://go-review.googlesource.com/c/go/+/679255
|
||||
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
|
||||
Reviewed-by: Michael Knyszek <mknyszek@google.com>
|
||||
|
||||
CVE: CVE-2025-4673
|
||||
|
||||
Upstream-Status: Backport [https://github.com/golang/go/commit/b897e97c36cb62629a458bc681723ca733404e32]
|
||||
|
||||
Signed-off-by: Praveen Kumar <praveen.kumar@windriver.com>
|
||||
---
|
||||
src/net/http/client.go | 3 ++-
|
||||
src/net/http/client_test.go | 5 ++++-
|
||||
2 files changed, 6 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/net/http/client.go b/src/net/http/client.go
|
||||
index 13b6152..d1c9407 100644
|
||||
--- a/src/net/http/client.go
|
||||
+++ b/src/net/http/client.go
|
||||
@@ -806,7 +806,8 @@ func (c *Client) makeHeadersCopier(ireq *Request) func(req *Request, stripSensit
|
||||
for k, vv := range ireqhdr {
|
||||
sensitive := false
|
||||
switch CanonicalHeaderKey(k) {
|
||||
- case "Authorization", "Www-Authenticate", "Cookie", "Cookie2":
|
||||
+ case "Authorization", "Www-Authenticate", "Cookie", "Cookie2",
|
||||
+ "Proxy-Authorization", "Proxy-Authenticate":
|
||||
sensitive = true
|
||||
}
|
||||
if !(sensitive && stripSensitiveHeaders) {
|
||||
diff --git a/src/net/http/client_test.go b/src/net/http/client_test.go
|
||||
index 8bf1808..66ad370 100644
|
||||
--- a/src/net/http/client_test.go
|
||||
+++ b/src/net/http/client_test.go
|
||||
@@ -1562,7 +1562,9 @@ func testClientStripHeadersOnRepeatedRedirect(t *testing.T, mode testMode) {
|
||||
if r.Host+r.URL.Path != "a.example.com/" {
|
||||
if h := r.Header.Get("Authorization"); h != "" {
|
||||
t.Errorf("on request to %v%v, Authorization=%q, want no header", r.Host, r.URL.Path, h)
|
||||
- }
|
||||
+ } else if h := r.Header.Get("Proxy-Authorization"); h != "" {
|
||||
+ t.Errorf("on request to %v%v, Proxy-Authorization=%q, want no header", r.Host, r.URL.Path, h)
|
||||
+ }
|
||||
}
|
||||
// Follow a chain of redirects from a to b and back to a.
|
||||
// The Authorization header is stripped on the first redirect to b,
|
||||
@@ -1590,6 +1592,7 @@ func testClientStripHeadersOnRepeatedRedirect(t *testing.T, mode testMode) {
|
||||
req, _ := NewRequest("GET", proto+"://a.example.com/", nil)
|
||||
req.Header.Add("Cookie", "foo=bar")
|
||||
req.Header.Add("Authorization", "secretpassword")
|
||||
+ req.Header.Add("Proxy-Authorization", "secretpassword")
|
||||
res, err := c.Do(req)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
--
|
||||
2.40.0
|
||||
@@ -14,6 +14,9 @@ SRC_URI[go_linux_arm64.sha256sum] = "914daad3f011cc2014dea799bb7490442677e4ad6de
|
||||
UPSTREAM_CHECK_URI = "https://golang.org/dl/"
|
||||
UPSTREAM_CHECK_REGEX = "go(?P<pver>\d+(\.\d+)+)\.linux"
|
||||
|
||||
# not-applicable-platform: Issue only applies on Windows
|
||||
CVE_CHECK_IGNORE += "CVE-2024-3566"
|
||||
|
||||
S = "${WORKDIR}/go"
|
||||
|
||||
inherit goarch native
|
||||
|
||||
@@ -19,6 +19,9 @@ S = "${WORKDIR}/go"
|
||||
B = "${S}"
|
||||
UPSTREAM_CHECK_REGEX = "(?P<pver>\d+(\.\d+)+)\.src\.tar"
|
||||
|
||||
# not-applicable-platform: Issue only applies on Windows
|
||||
CVE_CHECK_IGNORE += "CVE-2024-3566"
|
||||
|
||||
INHIBIT_PACKAGE_DEBUG_SPLIT = "1"
|
||||
SSTATE_SCAN_CMD = "true"
|
||||
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
From c664b4415baf1b237a8d74f5e880179e69ee764c Mon Sep 17 00:00:00 2001
|
||||
From: Nate Prewitt <nate.prewitt@gmail.com>
|
||||
Date: Wed, 25 Sep 2024 08:03:20 -0700
|
||||
Subject: [PATCH] Only use hostname to do netrc lookup instead of netloc
|
||||
|
||||
CVE: CVE-2024-47081
|
||||
|
||||
Upstream-Status: Backport
|
||||
[https://github.com/psf/requests/commit/96ba401c1296ab1dda74a2365ef36d88f7d144ef]
|
||||
|
||||
Signed-off-by: Jiaying Song <jiaying.song.cn@windriver.com>
|
||||
---
|
||||
requests/utils.py | 8 +-------
|
||||
1 file changed, 1 insertion(+), 7 deletions(-)
|
||||
|
||||
diff --git a/requests/utils.py b/requests/utils.py
|
||||
index 153776c7..eae72959 100644
|
||||
--- a/requests/utils.py
|
||||
+++ b/requests/utils.py
|
||||
@@ -208,13 +208,7 @@ def get_netrc_auth(url, raise_errors=False):
|
||||
return
|
||||
|
||||
ri = urlparse(url)
|
||||
-
|
||||
- # Strip port numbers from netloc. This weird `if...encode`` dance is
|
||||
- # used for Python 3.2, which doesn't support unicode literals.
|
||||
- splitstr = b':'
|
||||
- if isinstance(url, str):
|
||||
- splitstr = splitstr.decode('ascii')
|
||||
- host = ri.netloc.split(splitstr)[0]
|
||||
+ host = ri.hostname
|
||||
|
||||
try:
|
||||
_netrc = netrc(netrc_path).authenticators(host)
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -5,6 +5,7 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=34400b68072d710fecd0a2940a0d1658"
|
||||
|
||||
SRC_URI += "file://CVE-2023-32681.patch \
|
||||
file://CVE-2024-35195.patch \
|
||||
file://CVE-2024-47081.patch \
|
||||
"
|
||||
|
||||
SRC_URI[sha256sum] = "68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
From d8390feaa99091d1ba9626bec0e4ba7072fc507a Mon Sep 17 00:00:00 2001
|
||||
From: "Jason R. Coombs" <jaraco@jaraco.com>
|
||||
Date: Sat, 19 Apr 2025 12:49:55 -0400
|
||||
Subject: [PATCH] Extract _resolve_download_filename with test.
|
||||
|
||||
Upstream-Status: Backport [https://github.com/pypa/setuptools/commit/d8390feaa99091d1ba9626bec0e4ba7072fc507a]
|
||||
CVE: CVE-2025-47273 #Dependency Patch
|
||||
Signed-off-by: Vijay Anusuri <vanusuri@mvista.com>
|
||||
---
|
||||
setuptools/package_index.py | 20 ++++++++++++++++----
|
||||
1 file changed, 16 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/setuptools/package_index.py b/setuptools/package_index.py
|
||||
index 3a893df..f350e11 100644
|
||||
--- a/setuptools/package_index.py
|
||||
+++ b/setuptools/package_index.py
|
||||
@@ -786,9 +786,16 @@ class PackageIndex(Environment):
|
||||
raise DistutilsError("Download error for %s: %s"
|
||||
% (url, v)) from v
|
||||
|
||||
- def _download_url(self, url, tmpdir):
|
||||
- # Determine download filename
|
||||
- #
|
||||
+ @staticmethod
|
||||
+ def _resolve_download_filename(url, tmpdir):
|
||||
+ """
|
||||
+ >>> du = PackageIndex._resolve_download_filename
|
||||
+ >>> root = getfixture('tmp_path')
|
||||
+ >>> url = 'https://files.pythonhosted.org/packages/a9/5a/0db.../setuptools-78.1.0.tar.gz'
|
||||
+ >>> import pathlib
|
||||
+ >>> str(pathlib.Path(du(url, root)).relative_to(root))
|
||||
+ 'setuptools-78.1.0.tar.gz'
|
||||
+ """
|
||||
name, fragment = egg_info_for_url(url)
|
||||
if name:
|
||||
while '..' in name:
|
||||
@@ -799,8 +806,13 @@ class PackageIndex(Environment):
|
||||
if name.endswith('.egg.zip'):
|
||||
name = name[:-4] # strip the extra .zip before download
|
||||
|
||||
- filename = os.path.join(tmpdir, name)
|
||||
+ return os.path.join(tmpdir, name)
|
||||
|
||||
+ def _download_url(self, url, tmpdir):
|
||||
+ """
|
||||
+ Determine the download filename.
|
||||
+ """
|
||||
+ filename = self._resolve_download_filename(url, tmpdir)
|
||||
return self._download_vcs(url, filename) or self._download_other(url, filename)
|
||||
|
||||
@staticmethod
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
From 250a6d17978f9f6ac3ac887091f2d32886fbbb0b Mon Sep 17 00:00:00 2001
|
||||
From: "Jason R. Coombs" <jaraco@jaraco.com>
|
||||
Date: Sat, 19 Apr 2025 13:03:47 -0400
|
||||
Subject: [PATCH] Add a check to ensure the name resolves relative to the
|
||||
tmpdir.
|
||||
|
||||
Closes #4946
|
||||
|
||||
Upstream-Status: Backport [https://github.com/pypa/setuptools/commit/250a6d17978f9f6ac3ac887091f2d32886fbbb0b]
|
||||
CVE: CVE-2025-47273
|
||||
Signed-off-by: Vijay Anusuri <vanusuri@mvista.com>
|
||||
---
|
||||
setuptools/package_index.py | 18 ++++++++++++++++--
|
||||
1 file changed, 16 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/setuptools/package_index.py b/setuptools/package_index.py
|
||||
index f350e11..86bf851 100644
|
||||
--- a/setuptools/package_index.py
|
||||
+++ b/setuptools/package_index.py
|
||||
@@ -789,12 +789,20 @@ class PackageIndex(Environment):
|
||||
@staticmethod
|
||||
def _resolve_download_filename(url, tmpdir):
|
||||
"""
|
||||
+ >>> import pathlib
|
||||
>>> du = PackageIndex._resolve_download_filename
|
||||
>>> root = getfixture('tmp_path')
|
||||
>>> url = 'https://files.pythonhosted.org/packages/a9/5a/0db.../setuptools-78.1.0.tar.gz'
|
||||
- >>> import pathlib
|
||||
>>> str(pathlib.Path(du(url, root)).relative_to(root))
|
||||
'setuptools-78.1.0.tar.gz'
|
||||
+
|
||||
+ Ensures the target is always in tmpdir.
|
||||
+
|
||||
+ >>> url = 'https://anyhost/%2fhome%2fuser%2f.ssh%2fauthorized_keys'
|
||||
+ >>> du(url, root)
|
||||
+ Traceback (most recent call last):
|
||||
+ ...
|
||||
+ ValueError: Invalid filename...
|
||||
"""
|
||||
name, fragment = egg_info_for_url(url)
|
||||
if name:
|
||||
@@ -806,7 +814,13 @@ class PackageIndex(Environment):
|
||||
if name.endswith('.egg.zip'):
|
||||
name = name[:-4] # strip the extra .zip before download
|
||||
|
||||
- return os.path.join(tmpdir, name)
|
||||
+ filename = os.path.join(tmpdir, name)
|
||||
+
|
||||
+ # ensure path resolves within the tmpdir
|
||||
+ if not filename.startswith(str(tmpdir)):
|
||||
+ raise ValueError(f"Invalid filename {filename}")
|
||||
+
|
||||
+ return filename
|
||||
|
||||
def _download_url(self, url, tmpdir):
|
||||
"""
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@@ -13,6 +13,8 @@ SRC_URI += "\
|
||||
file://0001-_distutils-sysconfig-append-STAGING_LIBDIR-python-sy.patch \
|
||||
file://0001-Limit-the-amount-of-whitespace-to-search-backtrack.-.patch \
|
||||
file://CVE-2024-6345.patch \
|
||||
file://CVE-2025-47273-pre1.patch \
|
||||
file://CVE-2025-47273.patch \
|
||||
"
|
||||
|
||||
SRC_URI[sha256sum] = "d144f85102f999444d06f9c0e8c737fd0194f10f2f7e5fdb77573f6e2fa4fad0"
|
||||
|
||||
@@ -15,7 +15,7 @@ diff --git a/setup.py b/setup.py
|
||||
index 43e807f..11b5cf5 100644
|
||||
--- a/setup.py
|
||||
+++ b/setup.py
|
||||
@@ -1149,7 +1149,6 @@ class PyBuildExt(build_ext):
|
||||
@@ -1153,7 +1153,6 @@ class PyBuildExt(build_ext):
|
||||
'termcap'):
|
||||
readline_libs.append('termcap')
|
||||
self.add(Extension('readline', ['readline.c'],
|
||||
|
||||
@@ -18,7 +18,7 @@ diff --git a/Makefile.pre.in b/Makefile.pre.in
|
||||
index ee85f35..f0aedb7 100644
|
||||
--- a/Makefile.pre.in
|
||||
+++ b/Makefile.pre.in
|
||||
@@ -1640,12 +1640,9 @@ python-config: $(srcdir)/Misc/python-config.in Misc/python-config.sh
|
||||
@@ -1641,12 +1641,9 @@ python-config: $(srcdir)/Misc/python-config.in Misc/python-config.sh
|
||||
sed -e "s,@EXENAME@,$(BINDIR)/python$(LDVERSION)$(EXE)," < $(srcdir)/Misc/python-config.in >python-config.py
|
||||
@ # Replace makefile compat. variable references with shell script compat. ones; $(VAR) -> ${VAR}
|
||||
LC_ALL=C sed -e 's,\$$(\([A-Za-z0-9_]*\)),\$$\{\1\},g' < Misc/python-config.sh >python-config
|
||||
|
||||
@@ -26,7 +26,7 @@ diff --git a/Makefile.pre.in b/Makefile.pre.in
|
||||
index edd70d4..5e13ba2 100644
|
||||
--- a/Makefile.pre.in
|
||||
+++ b/Makefile.pre.in
|
||||
@@ -1601,30 +1601,30 @@ libinstall: build_all $(srcdir)/Modules/xxmodule.c
|
||||
@@ -1602,30 +1602,30 @@ libinstall: build_all $(srcdir)/Modules/xxmodule.c
|
||||
fi
|
||||
-PYTHONPATH=$(DESTDIR)$(LIBDEST) $(RUNSHARED) \
|
||||
$(PYTHON_FOR_BUILD) -Wi $(DESTDIR)$(LIBDEST)/compileall.py \
|
||||
|
||||
@@ -20,7 +20,7 @@ diff --git a/Lib/test/_test_multiprocessing.py b/Lib/test/_test_multiprocessing.
|
||||
index 3bc5b8f..a6e106d 100644
|
||||
--- a/Lib/test/_test_multiprocessing.py
|
||||
+++ b/Lib/test/_test_multiprocessing.py
|
||||
@@ -568,6 +568,7 @@ class _TestProcess(BaseTestCase):
|
||||
@@ -575,6 +575,7 @@ class _TestProcess(BaseTestCase):
|
||||
|
||||
close_queue(q)
|
||||
|
||||
@@ -28,7 +28,7 @@ index 3bc5b8f..a6e106d 100644
|
||||
def test_many_processes(self):
|
||||
if self.TYPE == 'threads':
|
||||
self.skipTest('test not appropriate for {}'.format(self.TYPE))
|
||||
@@ -4817,6 +4818,7 @@ class TestWait(unittest.TestCase):
|
||||
@@ -4829,6 +4830,7 @@ class TestWait(unittest.TestCase):
|
||||
sem.release()
|
||||
time.sleep(period)
|
||||
|
||||
@@ -40,7 +40,7 @@ diff --git a/Lib/test/test_time.py b/Lib/test/test_time.py
|
||||
index 875615a..aebaa8c 100644
|
||||
--- a/Lib/test/test_time.py
|
||||
+++ b/Lib/test/test_time.py
|
||||
@@ -474,6 +474,7 @@ class TimeTestCase(unittest.TestCase):
|
||||
@@ -475,6 +475,7 @@ class TimeTestCase(unittest.TestCase):
|
||||
def test_perf_counter(self):
|
||||
time.perf_counter()
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ diff --git a/Lib/tarfile.py b/Lib/tarfile.py
|
||||
index 3bbbcaa..473167d 100755
|
||||
--- a/Lib/tarfile.py
|
||||
+++ b/Lib/tarfile.py
|
||||
@@ -2557,7 +2557,8 @@ class TarFile(object):
|
||||
@@ -2675,7 +2675,8 @@ class TarFile(object):
|
||||
os.lchown(targetpath, u, g)
|
||||
else:
|
||||
os.chown(targetpath, u, g)
|
||||
|
||||
@@ -47,7 +47,7 @@ index 0c06914..299786b 100644
|
||||
gcc) AC_PATH_TOOL(CXX, [g++], [g++], [notfound]) ;;
|
||||
cc) AC_PATH_TOOL(CXX, [c++], [c++], [notfound]) ;;
|
||||
clang|*/clang) AC_PATH_TOOL(CXX, [clang++], [clang++], [notfound]) ;;
|
||||
@@ -976,7 +977,7 @@ rmdir CaseSensitiveTestDir
|
||||
@@ -981,7 +982,7 @@ rmdir CaseSensitiveTestDir
|
||||
|
||||
case $ac_sys_system in
|
||||
hp*|HP*)
|
||||
@@ -56,7 +56,7 @@ index 0c06914..299786b 100644
|
||||
cc|*/cc) CC="$CC -Ae";;
|
||||
esac;;
|
||||
esac
|
||||
@@ -1374,7 +1375,7 @@ else
|
||||
@@ -1379,7 +1380,7 @@ else
|
||||
fi],
|
||||
[AC_MSG_RESULT(no)])
|
||||
if test "$Py_LTO" = 'true' ; then
|
||||
@@ -65,7 +65,7 @@ index 0c06914..299786b 100644
|
||||
*clang*)
|
||||
AC_SUBST(LLVM_AR)
|
||||
AC_PATH_TOOL(LLVM_AR, llvm-ar, '', ${llvm_path})
|
||||
@@ -1467,7 +1468,7 @@ then
|
||||
@@ -1472,7 +1473,7 @@ then
|
||||
fi
|
||||
fi
|
||||
LLVM_PROF_ERR=no
|
||||
@@ -74,7 +74,7 @@ index 0c06914..299786b 100644
|
||||
*clang*)
|
||||
# Any changes made here should be reflected in the GCC+Darwin case below
|
||||
PGO_PROF_GEN_FLAG="-fprofile-instr-generate"
|
||||
@@ -1528,7 +1529,7 @@ esac
|
||||
@@ -1533,7 +1534,7 @@ esac
|
||||
# compiler and platform. BASECFLAGS tweaks need to be made even if the
|
||||
# user set OPT.
|
||||
|
||||
@@ -83,7 +83,7 @@ index 0c06914..299786b 100644
|
||||
*clang*)
|
||||
cc_is_clang=1
|
||||
;;
|
||||
@@ -1664,7 +1665,7 @@ yes)
|
||||
@@ -1669,7 +1670,7 @@ yes)
|
||||
|
||||
# ICC doesn't recognize the option, but only emits a warning
|
||||
## XXX does it emit an unused result warning and can it be disabled?
|
||||
@@ -92,7 +92,7 @@ index 0c06914..299786b 100644
|
||||
*icc*)
|
||||
ac_cv_disable_unused_result_warning=no
|
||||
;;
|
||||
@@ -2018,7 +2019,7 @@ yes)
|
||||
@@ -2023,7 +2024,7 @@ yes)
|
||||
;;
|
||||
esac
|
||||
|
||||
@@ -101,7 +101,7 @@ index 0c06914..299786b 100644
|
||||
*icc*)
|
||||
# ICC needs -fp-model strict or floats behave badly
|
||||
CFLAGS_NODIST="$CFLAGS_NODIST -fp-model strict"
|
||||
@@ -2836,7 +2837,7 @@ then
|
||||
@@ -2841,7 +2842,7 @@ then
|
||||
then
|
||||
LINKFORSHARED="-Wl,--export-dynamic"
|
||||
fi;;
|
||||
@@ -110,7 +110,7 @@ index 0c06914..299786b 100644
|
||||
*gcc*)
|
||||
if $CC -Xlinker --help 2>&1 | grep export-dynamic >/dev/null
|
||||
then
|
||||
@@ -5622,7 +5623,7 @@ if test "$have_gcc_asm_for_x87" = yes; then
|
||||
@@ -5628,7 +5629,7 @@ if test "$have_gcc_asm_for_x87" = yes; then
|
||||
# Some versions of gcc miscompile inline asm:
|
||||
# http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46491
|
||||
# http://gcc.gnu.org/ml/gcc/2010-11/msg00366.html
|
||||
|
||||
@@ -27,7 +27,7 @@ diff --git a/setup.py b/setup.py
|
||||
index 2e7f263..f7a3d39 100644
|
||||
--- a/setup.py
|
||||
+++ b/setup.py
|
||||
@@ -840,7 +840,8 @@ class PyBuildExt(build_ext):
|
||||
@@ -839,7 +839,8 @@ class PyBuildExt(build_ext):
|
||||
# only change this for cross builds for 3.3, issues on Mageia
|
||||
if CROSS_COMPILING:
|
||||
self.add_cross_compiling_paths()
|
||||
|
||||
@@ -19,7 +19,7 @@ diff --git a/Lib/test/test_ftplib.py b/Lib/test/test_ftplib.py
|
||||
index 082a90d46b..508814d56a 100644
|
||||
--- a/Lib/test/test_ftplib.py
|
||||
+++ b/Lib/test/test_ftplib.py
|
||||
@@ -629,6 +629,7 @@ def test_storbinary_rest(self):
|
||||
@@ -629,6 +629,7 @@ class TestFTPClass(TestCase):
|
||||
self.client.storbinary('stor', f, rest=r)
|
||||
self.assertEqual(self.server.handler_instance.rest, str(r))
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ diff --git a/setup.py b/setup.py
|
||||
index 85a2b26357..7605347bf5 100644
|
||||
--- a/setup.py
|
||||
+++ b/setup.py
|
||||
@@ -517,6 +517,14 @@ def print_three_column(lst):
|
||||
@@ -517,6 +517,14 @@ class PyBuildExt(build_ext):
|
||||
print("%-*s %-*s %-*s" % (longest, e, longest, f,
|
||||
longest, g))
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ diff --git a/configure.ac b/configure.ac
|
||||
index e5e3df8..bfdd987 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -5092,12 +5092,6 @@ then
|
||||
@@ -5097,12 +5097,6 @@ then
|
||||
[Define if you have struct stat.st_mtimensec])
|
||||
fi
|
||||
|
||||
@@ -38,7 +38,7 @@ diff --git a/setup.py b/setup.py
|
||||
index 62f0e18..c190002 100644
|
||||
--- a/setup.py
|
||||
+++ b/setup.py
|
||||
@@ -1169,8 +1169,6 @@ class PyBuildExt(build_ext):
|
||||
@@ -1173,8 +1173,6 @@ class PyBuildExt(build_ext):
|
||||
panel_library = 'panel'
|
||||
if curses_library == 'ncursesw':
|
||||
curses_defines.append(('HAVE_NCURSESW', '1'))
|
||||
|
||||
@@ -1,131 +0,0 @@
|
||||
From b8b4b713c5f8ec0958c7ef8d29d6711889bc94ab Mon Sep 17 00:00:00 2001
|
||||
From: "Miss Islington (bot)"
|
||||
<31488909+miss-islington@users.noreply.github.com>
|
||||
Date: Wed, 19 Feb 2025 14:36:23 +0100
|
||||
Subject: [PATCH] [3.10] gh-105704: Disallow square brackets (`[` and `]`) in
|
||||
domain names for parsed URLs (GH-129418) (#129529)
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
(cherry picked from commit d89a5f6a6e65511a5f6e0618c4c30a7aa5aba56a)
|
||||
|
||||
Co-authored-by: Seth Michael Larson <seth@python.org>
|
||||
Co-authored-by: Peter Bierma <zintensitydev@gmail.com>
|
||||
Co-authored-by: Łukasz Langa <lukasz@langa.pl>
|
||||
|
||||
CVE: CVE-2025-0938
|
||||
Upstream-Status: Backport [https://github.com/python/cpython/commit/b8b4b713c5f8ec0958c7ef8d29d6711889bc94ab]
|
||||
Signed-off-by: Peter Marko <peter.marko@siemens.com>
|
||||
---
|
||||
Lib/test/test_urlparse.py | 37 ++++++++++++++++++-
|
||||
Lib/urllib/parse.py | 20 +++++++++-
|
||||
...-01-28-14-08-03.gh-issue-105704.EnhHxu.rst | 4 ++
|
||||
3 files changed, 58 insertions(+), 3 deletions(-)
|
||||
create mode 100644 Misc/NEWS.d/next/Security/2025-01-28-14-08-03.gh-issue-105704.EnhHxu.rst
|
||||
|
||||
diff --git a/Lib/test/test_urlparse.py b/Lib/test/test_urlparse.py
|
||||
index f2ffc452e5..280644ef0b 100644
|
||||
--- a/Lib/test/test_urlparse.py
|
||||
+++ b/Lib/test/test_urlparse.py
|
||||
@@ -1149,16 +1149,51 @@ class UrlParseTestCase(unittest.TestCase):
|
||||
self.assertRaises(ValueError, urllib.parse.urlsplit, 'Scheme://user@[0439:23af::2309::fae7:1234]/Path?Query')
|
||||
self.assertRaises(ValueError, urllib.parse.urlsplit, 'Scheme://user@[0439:23af:2309::fae7:1234:2342:438e:192.0.2.146]/Path?Query')
|
||||
self.assertRaises(ValueError, urllib.parse.urlsplit, 'Scheme://user@]v6a.ip[/Path')
|
||||
+ self.assertRaises(ValueError, urllib.parse.urlsplit, 'scheme://prefix.[v6a.ip]')
|
||||
+ self.assertRaises(ValueError, urllib.parse.urlsplit, 'scheme://[v6a.ip].suffix')
|
||||
+ self.assertRaises(ValueError, urllib.parse.urlsplit, 'scheme://prefix.[v6a.ip]/')
|
||||
+ self.assertRaises(ValueError, urllib.parse.urlsplit, 'scheme://[v6a.ip].suffix/')
|
||||
+ self.assertRaises(ValueError, urllib.parse.urlsplit, 'scheme://prefix.[v6a.ip]?')
|
||||
+ self.assertRaises(ValueError, urllib.parse.urlsplit, 'scheme://[v6a.ip].suffix?')
|
||||
+ self.assertRaises(ValueError, urllib.parse.urlsplit, 'scheme://prefix.[::1]')
|
||||
+ self.assertRaises(ValueError, urllib.parse.urlsplit, 'scheme://[::1].suffix')
|
||||
+ self.assertRaises(ValueError, urllib.parse.urlsplit, 'scheme://prefix.[::1]/')
|
||||
+ self.assertRaises(ValueError, urllib.parse.urlsplit, 'scheme://[::1].suffix/')
|
||||
+ self.assertRaises(ValueError, urllib.parse.urlsplit, 'scheme://prefix.[::1]?')
|
||||
+ self.assertRaises(ValueError, urllib.parse.urlsplit, 'scheme://[::1].suffix?')
|
||||
+ self.assertRaises(ValueError, urllib.parse.urlsplit, 'scheme://prefix.[::1]:a')
|
||||
+ self.assertRaises(ValueError, urllib.parse.urlsplit, 'scheme://[::1].suffix:a')
|
||||
+ self.assertRaises(ValueError, urllib.parse.urlsplit, 'scheme://prefix.[::1]:a1')
|
||||
+ self.assertRaises(ValueError, urllib.parse.urlsplit, 'scheme://[::1].suffix:a1')
|
||||
+ self.assertRaises(ValueError, urllib.parse.urlsplit, 'scheme://prefix.[::1]:1a')
|
||||
+ self.assertRaises(ValueError, urllib.parse.urlsplit, 'scheme://[::1].suffix:1a')
|
||||
+ self.assertRaises(ValueError, urllib.parse.urlsplit, 'scheme://prefix.[::1]:')
|
||||
+ self.assertRaises(ValueError, urllib.parse.urlsplit, 'scheme://[::1].suffix:/')
|
||||
+ self.assertRaises(ValueError, urllib.parse.urlsplit, 'scheme://prefix.[::1]:?')
|
||||
+ self.assertRaises(ValueError, urllib.parse.urlsplit, 'scheme://user@prefix.[v6a.ip]')
|
||||
+ self.assertRaises(ValueError, urllib.parse.urlsplit, 'scheme://user@[v6a.ip].suffix')
|
||||
+ self.assertRaises(ValueError, urllib.parse.urlsplit, 'scheme://[v6a.ip')
|
||||
+ self.assertRaises(ValueError, urllib.parse.urlsplit, 'scheme://v6a.ip]')
|
||||
+ self.assertRaises(ValueError, urllib.parse.urlsplit, 'scheme://]v6a.ip[')
|
||||
+ self.assertRaises(ValueError, urllib.parse.urlsplit, 'scheme://]v6a.ip')
|
||||
+ self.assertRaises(ValueError, urllib.parse.urlsplit, 'scheme://v6a.ip[')
|
||||
+ self.assertRaises(ValueError, urllib.parse.urlsplit, 'scheme://prefix.[v6a.ip')
|
||||
+ self.assertRaises(ValueError, urllib.parse.urlsplit, 'scheme://v6a.ip].suffix')
|
||||
+ self.assertRaises(ValueError, urllib.parse.urlsplit, 'scheme://prefix]v6a.ip[suffix')
|
||||
+ self.assertRaises(ValueError, urllib.parse.urlsplit, 'scheme://prefix]v6a.ip')
|
||||
+ self.assertRaises(ValueError, urllib.parse.urlsplit, 'scheme://v6a.ip[suffix')
|
||||
|
||||
def test_splitting_bracketed_hosts(self):
|
||||
- p1 = urllib.parse.urlsplit('scheme://user@[v6a.ip]/path?query')
|
||||
+ p1 = urllib.parse.urlsplit('scheme://user@[v6a.ip]:1234/path?query')
|
||||
self.assertEqual(p1.hostname, 'v6a.ip')
|
||||
self.assertEqual(p1.username, 'user')
|
||||
self.assertEqual(p1.path, '/path')
|
||||
+ self.assertEqual(p1.port, 1234)
|
||||
p2 = urllib.parse.urlsplit('scheme://user@[0439:23af:2309::fae7%test]/path?query')
|
||||
self.assertEqual(p2.hostname, '0439:23af:2309::fae7%test')
|
||||
self.assertEqual(p2.username, 'user')
|
||||
self.assertEqual(p2.path, '/path')
|
||||
+ self.assertIs(p2.port, None)
|
||||
p3 = urllib.parse.urlsplit('scheme://user@[0439:23af:2309::fae7:1234:192.0.2.146%test]/path?query')
|
||||
self.assertEqual(p3.hostname, '0439:23af:2309::fae7:1234:192.0.2.146%test')
|
||||
self.assertEqual(p3.username, 'user')
|
||||
diff --git a/Lib/urllib/parse.py b/Lib/urllib/parse.py
|
||||
index 07e3248504..e1ee36d98e 100644
|
||||
--- a/Lib/urllib/parse.py
|
||||
+++ b/Lib/urllib/parse.py
|
||||
@@ -442,6 +442,23 @@ def _checknetloc(netloc):
|
||||
raise ValueError("netloc '" + netloc + "' contains invalid " +
|
||||
"characters under NFKC normalization")
|
||||
|
||||
+def _check_bracketed_netloc(netloc):
|
||||
+ # Note that this function must mirror the splitting
|
||||
+ # done in NetlocResultMixins._hostinfo().
|
||||
+ hostname_and_port = netloc.rpartition('@')[2]
|
||||
+ before_bracket, have_open_br, bracketed = hostname_and_port.partition('[')
|
||||
+ if have_open_br:
|
||||
+ # No data is allowed before a bracket.
|
||||
+ if before_bracket:
|
||||
+ raise ValueError("Invalid IPv6 URL")
|
||||
+ hostname, _, port = bracketed.partition(']')
|
||||
+ # No data is allowed after the bracket but before the port delimiter.
|
||||
+ if port and not port.startswith(":"):
|
||||
+ raise ValueError("Invalid IPv6 URL")
|
||||
+ else:
|
||||
+ hostname, _, port = hostname_and_port.partition(':')
|
||||
+ _check_bracketed_host(hostname)
|
||||
+
|
||||
# Valid bracketed hosts are defined in
|
||||
# https://www.rfc-editor.org/rfc/rfc3986#page-49 and https://url.spec.whatwg.org/
|
||||
def _check_bracketed_host(hostname):
|
||||
@@ -505,8 +522,7 @@ def urlsplit(url, scheme='', allow_fragments=True):
|
||||
(']' in netloc and '[' not in netloc)):
|
||||
raise ValueError("Invalid IPv6 URL")
|
||||
if '[' in netloc and ']' in netloc:
|
||||
- bracketed_host = netloc.partition('[')[2].partition(']')[0]
|
||||
- _check_bracketed_host(bracketed_host)
|
||||
+ _check_bracketed_netloc(netloc)
|
||||
if allow_fragments and '#' in url:
|
||||
url, fragment = url.split('#', 1)
|
||||
if '?' in url:
|
||||
diff --git a/Misc/NEWS.d/next/Security/2025-01-28-14-08-03.gh-issue-105704.EnhHxu.rst b/Misc/NEWS.d/next/Security/2025-01-28-14-08-03.gh-issue-105704.EnhHxu.rst
|
||||
new file mode 100644
|
||||
index 0000000000..bff1bc6b0d
|
||||
--- /dev/null
|
||||
+++ b/Misc/NEWS.d/next/Security/2025-01-28-14-08-03.gh-issue-105704.EnhHxu.rst
|
||||
@@ -0,0 +1,4 @@
|
||||
+When using :func:`urllib.parse.urlsplit` and :func:`urllib.parse.urlparse` host
|
||||
+parsing would not reject domain names containing square brackets (``[`` and
|
||||
+``]``). Square brackets are only valid for IPv6 and IPvFuture hosts according to
|
||||
+`RFC 3986 Section 3.2.2 <https://www.rfc-editor.org/rfc/rfc3986#section-3.2.2>`__.
|
||||
@@ -18,7 +18,7 @@ diff --git a/setup.py b/setup.py
|
||||
index 11b5cf5..2be4738 100644
|
||||
--- a/setup.py
|
||||
+++ b/setup.py
|
||||
@@ -1895,8 +1895,8 @@ class PyBuildExt(build_ext):
|
||||
@@ -1902,8 +1902,8 @@ class PyBuildExt(build_ext):
|
||||
self.detect_decimal()
|
||||
self.detect_ctypes()
|
||||
self.detect_multiprocessing()
|
||||
|
||||
@@ -21,7 +21,7 @@ diff --git a/Makefile.pre.in b/Makefile.pre.in
|
||||
index 5e13ba2..026bffd 100644
|
||||
--- a/Makefile.pre.in
|
||||
+++ b/Makefile.pre.in
|
||||
@@ -1527,7 +1527,7 @@ TESTSUBDIRS= ctypes/test \
|
||||
@@ -1528,7 +1528,7 @@ TESTSUBDIRS= ctypes/test \
|
||||
unittest/test unittest/test/testmock
|
||||
|
||||
TEST_MODULES=@TEST_MODULES@
|
||||
|
||||
@@ -37,7 +37,6 @@ SRC_URI = "http://www.python.org/ftp/python/${PV}/Python-${PV}.tar.xz \
|
||||
file://0001-Avoid-shebang-overflow-on-python-config.py.patch \
|
||||
file://0001-test_storlines-skip-due-to-load-variability.patch \
|
||||
file://0001-gh-107811-tarfile-treat-overflow-in-UID-GID-as-failu.patch \
|
||||
file://CVE-2025-0938.patch \
|
||||
"
|
||||
|
||||
SRC_URI:append:class-native = " \
|
||||
@@ -46,7 +45,7 @@ SRC_URI:append:class-native = " \
|
||||
file://12-distutils-prefix-is-inside-staging-area.patch \
|
||||
file://0001-Don-t-search-system-for-headers-libraries.patch \
|
||||
"
|
||||
SRC_URI[sha256sum] = "bfb249609990220491a1b92850a07135ed0831e41738cf681d63cf01b2a8fbd1"
|
||||
SRC_URI[sha256sum] = "ae665bc678abd9ab6a6e1573d2481625a53719bc517e9a634ed2b9fefae3817f"
|
||||
|
||||
# exclude pre-releases for both python 2.x and 3.x
|
||||
UPSTREAM_CHECK_REGEX = "[Pp]ython-(?P<pver>\d+(\.\d+)+).tar"
|
||||
57
meta/recipes-devtools/ruby/ruby/CVE-2025-27221-0001.patch
Normal file
57
meta/recipes-devtools/ruby/ruby/CVE-2025-27221-0001.patch
Normal file
@@ -0,0 +1,57 @@
|
||||
From 3675494839112b64d5f082a9068237b277ed1495 Mon Sep 17 00:00:00 2001
|
||||
From: Hiroshi SHIBATA <hsbt@ruby-lang.org>
|
||||
Date: Fri, 21 Feb 2025 16:29:36 +0900
|
||||
Subject: [PATCH] Truncate userinfo with URI#join, URI#merge and URI#+
|
||||
|
||||
CVE: CVE-2025-27221
|
||||
|
||||
Upstream-Status: Backport [https://github.com/ruby/uri/commit/3675494839112b64d5f082a9068237b277ed1495]
|
||||
|
||||
Signed-off-by: Divya Chellam <divya.chellam@windriver.com>
|
||||
---
|
||||
lib/uri/generic.rb | 6 +++++-
|
||||
test/uri/test_generic.rb | 11 +++++++++++
|
||||
2 files changed, 16 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/lib/uri/generic.rb b/lib/uri/generic.rb
|
||||
index cfa0de6..23d2398 100644
|
||||
--- a/lib/uri/generic.rb
|
||||
+++ b/lib/uri/generic.rb
|
||||
@@ -1131,7 +1131,11 @@ module URI
|
||||
end
|
||||
|
||||
# RFC2396, Section 5.2, 7)
|
||||
- base.set_userinfo(rel.userinfo) if rel.userinfo
|
||||
+ if rel.userinfo
|
||||
+ base.set_userinfo(rel.userinfo)
|
||||
+ else
|
||||
+ base.set_userinfo(nil)
|
||||
+ end
|
||||
base.set_host(rel.host) if rel.host
|
||||
base.set_port(rel.port) if rel.port
|
||||
base.query = rel.query if rel.query
|
||||
diff --git a/test/uri/test_generic.rb b/test/uri/test_generic.rb
|
||||
index fdb405e..b74f8e6 100644
|
||||
--- a/test/uri/test_generic.rb
|
||||
+++ b/test/uri/test_generic.rb
|
||||
@@ -157,6 +157,17 @@ class URI::TestGeneric < Test::Unit::TestCase
|
||||
assert_equal(nil, url.user)
|
||||
assert_equal(nil, url.password)
|
||||
assert_equal(nil, url.userinfo)
|
||||
+
|
||||
+ # sec-2957667
|
||||
+ url = URI.parse('http://user:pass@example.com').merge('//example.net')
|
||||
+ assert_equal('http://example.net', url.to_s)
|
||||
+ assert_nil(url.userinfo)
|
||||
+ url = URI.join('http://user:pass@example.com', '//example.net')
|
||||
+ assert_equal('http://example.net', url.to_s)
|
||||
+ assert_nil(url.userinfo)
|
||||
+ url = URI.parse('http://user:pass@example.com') + '//example.net'
|
||||
+ assert_equal('http://example.net', url.to_s)
|
||||
+ assert_nil(url.userinfo)
|
||||
end
|
||||
|
||||
def test_parse_scheme_with_symbols
|
||||
--
|
||||
2.40.0
|
||||
|
||||
73
meta/recipes-devtools/ruby/ruby/CVE-2025-27221-0002.patch
Normal file
73
meta/recipes-devtools/ruby/ruby/CVE-2025-27221-0002.patch
Normal file
@@ -0,0 +1,73 @@
|
||||
From 2789182478f42ccbb62197f952eb730e4f02bfc5 Mon Sep 17 00:00:00 2001
|
||||
From: Hiroshi SHIBATA <hsbt@ruby-lang.org>
|
||||
Date: Fri, 21 Feb 2025 18:16:28 +0900
|
||||
Subject: [PATCH] Fix merger of URI with authority component
|
||||
|
||||
https://hackerone.com/reports/2957667
|
||||
|
||||
Co-authored-by: Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||
|
||||
CVE: CVE-2025-27221
|
||||
|
||||
Upstream-Status: Backport [https://github.com/ruby/uri/commit/2789182478f42ccbb62197f952eb730e4f02bfc5]
|
||||
|
||||
Signed-off-by: Divya Chellam <divya.chellam@windriver.com>
|
||||
---
|
||||
lib/uri/generic.rb | 19 +++++++------------
|
||||
test/uri/test_generic.rb | 7 +++++++
|
||||
2 files changed, 14 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/lib/uri/generic.rb b/lib/uri/generic.rb
|
||||
index 23d2398..2420882 100644
|
||||
--- a/lib/uri/generic.rb
|
||||
+++ b/lib/uri/generic.rb
|
||||
@@ -1123,21 +1123,16 @@ module URI
|
||||
base.fragment=(nil)
|
||||
|
||||
# RFC2396, Section 5.2, 4)
|
||||
- if !authority
|
||||
- base.set_path(merge_path(base.path, rel.path)) if base.path && rel.path
|
||||
- else
|
||||
- # RFC2396, Section 5.2, 4)
|
||||
- base.set_path(rel.path) if rel.path
|
||||
+ if authority
|
||||
+ base.set_userinfo(rel.userinfo)
|
||||
+ base.set_host(rel.host)
|
||||
+ base.set_port(rel.port || base.default_port)
|
||||
+ base.set_path(rel.path)
|
||||
+ elsif base.path && rel.path
|
||||
+ base.set_path(merge_path(base.path, rel.path))
|
||||
end
|
||||
|
||||
# RFC2396, Section 5.2, 7)
|
||||
- if rel.userinfo
|
||||
- base.set_userinfo(rel.userinfo)
|
||||
- else
|
||||
- base.set_userinfo(nil)
|
||||
- end
|
||||
- base.set_host(rel.host) if rel.host
|
||||
- base.set_port(rel.port) if rel.port
|
||||
base.query = rel.query if rel.query
|
||||
base.fragment=(rel.fragment) if rel.fragment
|
||||
|
||||
diff --git a/test/uri/test_generic.rb b/test/uri/test_generic.rb
|
||||
index b74f8e6..ade0294 100644
|
||||
--- a/test/uri/test_generic.rb
|
||||
+++ b/test/uri/test_generic.rb
|
||||
@@ -260,6 +260,13 @@ class URI::TestGeneric < Test::Unit::TestCase
|
||||
assert_equal(u0, u1)
|
||||
end
|
||||
|
||||
+ def test_merge_authority
|
||||
+ u = URI.parse('http://user:pass@example.com:8080')
|
||||
+ u0 = URI.parse('http://new.example.org/path')
|
||||
+ u1 = u.merge('//new.example.org/path')
|
||||
+ assert_equal(u0, u1)
|
||||
+ end
|
||||
+
|
||||
def test_route
|
||||
url = URI.parse('http://hoge/a.html').route_to('http://hoge/b.html')
|
||||
assert_equal('b.html', url.to_s)
|
||||
--
|
||||
2.40.0
|
||||
|
||||
@@ -49,6 +49,8 @@ SRC_URI = "http://cache.ruby-lang.org/pub/ruby/${SHRT_VER}/ruby-${PV}.tar.gz \
|
||||
file://CVE-2025-27220.patch \
|
||||
file://CVE-2025-27219.patch \
|
||||
file://CVE-2024-43398.patch \
|
||||
file://CVE-2025-27221-0001.patch \
|
||||
file://CVE-2025-27221-0002.patch \
|
||||
"
|
||||
UPSTREAM_CHECK_URI = "https://www.ruby-lang.org/en/downloads/"
|
||||
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
From 5b5968c306b3e35cdeec83bb15026fd74a7334de Mon Sep 17 00:00:00 2001
|
||||
From: Ken Sharp <Ken.Sharp@artifex.com>
|
||||
Date: Sat, 12 Apr 2025 10:24:43 +0100
|
||||
Subject: [PATCH] Argument sanitisation - handle '#' as per '='
|
||||
|
||||
Bug 708446
|
||||
|
||||
CVE: CVE-2025-48708
|
||||
|
||||
Upstream-Status: Backport [https://cgit.ghostscript.com/cgi-bin/cgit.cgi/ghostpdl.git/commit/?id=5b5968c306b3e35cdeec83bb15026fd74a7334de]
|
||||
|
||||
Signed-off-by: Archana Polampalli <archana.polampalli@windriver.com>
|
||||
---
|
||||
base/gslibctx.c | 8 ++++----
|
||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/base/gslibctx.c b/base/gslibctx.c
|
||||
index 2cf5c9dda..40ff984f9 100644
|
||||
--- a/base/gslibctx.c
|
||||
+++ b/base/gslibctx.c
|
||||
@@ -1225,9 +1225,9 @@ gs_lib_ctx_stash_sanitized_arg(gs_lib_ctx_t *ctx, const char *arg)
|
||||
case '-': /* Need to check for permitted file lists */
|
||||
/* By default, we want to keep the key, but lose the value */
|
||||
p = arg+2;
|
||||
- while (*p && *p != '=')
|
||||
+ while (*p && *p != '=' && *p != '#')
|
||||
p++;
|
||||
- if (*p == '=')
|
||||
+ if (*p == '=' || *p == '#')
|
||||
p++;
|
||||
if (*p == 0)
|
||||
break; /* No value to elide */
|
||||
@@ -1269,9 +1269,9 @@ gs_lib_ctx_stash_sanitized_arg(gs_lib_ctx_t *ctx, const char *arg)
|
||||
case 'S':
|
||||
/* By default, we want to keep the key, but lose the value */
|
||||
p = arg+2;
|
||||
- while (*p && *p != '=')
|
||||
+ while (*p && *p != '=' && *p != '#')
|
||||
p++;
|
||||
- if (*p == '=')
|
||||
+ if (*p == '=' || *p == '#')
|
||||
p++;
|
||||
if (*p == 0)
|
||||
break; /* No value to elide */
|
||||
--
|
||||
2.40.0
|
||||
@@ -73,6 +73,7 @@ SRC_URI_BASE = "https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/d
|
||||
file://CVE-2025-27835.patch \
|
||||
file://CVE-2025-27836-1.patch \
|
||||
file://CVE-2025-27836-2.patch \
|
||||
file://CVE-2025-48708.patch \
|
||||
"
|
||||
|
||||
SRC_URI = "${SRC_URI_BASE} \
|
||||
|
||||
143
meta/recipes-extended/iputils/iputils/CVE-2025-47268.patch
Normal file
143
meta/recipes-extended/iputils/iputils/CVE-2025-47268.patch
Normal file
@@ -0,0 +1,143 @@
|
||||
From 070cfacd7348386173231fb16fad4983d4e6ae40 Mon Sep 17 00:00:00 2001
|
||||
From: Petr Vorel <pvorel@suse.cz>
|
||||
Date: Mon, 5 May 2025 23:55:57 +0200
|
||||
Subject: [PATCH] ping: Fix signed 64-bit integer overflow in RTT calculation
|
||||
|
||||
Crafted ICMP Echo Reply packet can cause signed integer overflow in
|
||||
|
||||
1) triptime calculation:
|
||||
triptime = tv->tv_sec * 1000000 + tv->tv_usec;
|
||||
|
||||
2) tsum2 increment which uses triptime
|
||||
rts->tsum2 += (double)((long long)triptime * (long long)triptime);
|
||||
|
||||
3) final tmvar:
|
||||
tmvar = (rts->tsum2 / total) - (tmavg * tmavg)
|
||||
|
||||
$ export CFLAGS="-O1 -g -fsanitize=address,undefined -fno-omit-frame-pointer"
|
||||
$ export LDFLAGS="-fsanitize=address,undefined -fno-omit-frame-pointer"
|
||||
$ meson setup .. -Db_sanitize=address,undefined
|
||||
$ ninja
|
||||
$ ./ping/ping -c2 127.0.0.1
|
||||
|
||||
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
|
||||
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.061 ms
|
||||
../ping/ping_common.c:757:25: runtime error: signed integer overflow: -2513732689199106 * 1000000 cannot be represented in type 'long int'
|
||||
../ping/ping_common.c:757:12: runtime error: signed integer overflow: -4975495174606980224 + -6510615555425289427 cannot be represented in type 'long int'
|
||||
../ping/ping_common.c:769:47: runtime error: signed integer overflow: 6960633343677281965 * 6960633343677281965 cannot be represented in type 'long int'
|
||||
24 bytes from 127.0.0.1: icmp_seq=1 ttl=64 (truncated)
|
||||
./ping/ping: Warning: time of day goes back (-7256972569576721377us), taking countermeasures
|
||||
./ping/ping: Warning: time of day goes back (-7256972569576721232us), taking countermeasures
|
||||
24 bytes from 127.0.0.1: icmp_seq=1 ttl=64 (truncated)
|
||||
../ping/ping_common.c:265:16: runtime error: signed integer overflow: 6960633343677281965 * 2 cannot be represented in type 'long int'
|
||||
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.565 ms
|
||||
|
||||
--- 127.0.0.1 ping statistics ---
|
||||
2 packets transmitted, 2 received, +2 duplicates, 0% packet loss, time 1002ms
|
||||
../ping/ping_common.c:940:42: runtime error: signed integer overflow: 1740158335919320832 * 1740158335919320832 cannot be represented in type 'long int'
|
||||
rtt min/avg/max/mdev = 0.000/1740158335919320.832/6960633343677281.965/-1623514645242292.-224 ms
|
||||
|
||||
To fix the overflow check allowed ranges of struct timeval members:
|
||||
* tv_sec <0, LONG_MAX/1000000>
|
||||
* tv_usec <0, 999999>
|
||||
|
||||
Fix includes 2 new error messages (needs translation).
|
||||
Also existing message "time of day goes back ..." needed to be modified
|
||||
as it now prints tv->tv_sec which is a second (needs translation update).
|
||||
|
||||
After fix:
|
||||
|
||||
$ ./ping/ping -c2 127.0.0.1
|
||||
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.057 ms
|
||||
./ping/ping: Warning: invalid tv_usec -6510615555424928611 us
|
||||
./ping/ping: Warning: time of day goes back (-3985394643238914 s), taking countermeasures
|
||||
./ping/ping: Warning: invalid tv_usec -6510615555424928461 us
|
||||
./ping/ping: Warning: time of day goes back (-3985394643238914 s), taking countermeasures
|
||||
24 bytes from 127.0.0.1: icmp_seq=1 ttl=64 (truncated)
|
||||
./ping/ping: Warning: invalid tv_usec -6510615555425884541 us
|
||||
./ping/ping: Warning: time of day goes back (-4243165695442945 s), taking countermeasures
|
||||
24 bytes from 127.0.0.1: icmp_seq=1 ttl=64 (truncated)
|
||||
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.111 ms
|
||||
|
||||
--- 127.0.0.1 ping statistics ---
|
||||
2 packets transmitted, 2 received, +2 duplicates, 0% packet loss, time 101ms
|
||||
rtt min/avg/max/mdev = 0.000/0.042/0.111/0.046 ms
|
||||
|
||||
Fixes: https://github.com/iputils/iputils/issues/584
|
||||
Fixes: CVE-2025-472
|
||||
Link: https://github.com/Zephkek/ping-rtt-overflow/
|
||||
Co-developed-by: Cyril Hrubis <chrubis@suse.cz>
|
||||
Reported-by: Mohamed Maatallah <hotelsmaatallahrecemail@gmail.com>
|
||||
Reviewed-by: Mohamed Maatallah <hotelsmaatallahrecemail@gmail.com>
|
||||
Reviewed-by: Cyril Hrubis <chrubis@suse.cz>
|
||||
Reviewed-by: Noah Meyerhans <noahm@debian.org>
|
||||
Signed-off-by: Petr Vorel <pvorel@suse.cz>
|
||||
|
||||
CVE: CVE-2025-47268
|
||||
|
||||
Upstream-Status: Backport
|
||||
[https://github.com/iputils/iputils/commit/070cfacd7348386173231fb16fad4983d4e6ae40]
|
||||
|
||||
Signed-off-by: Yi Zhao <yi.zhao@windriver.com>
|
||||
---
|
||||
iputils_common.h | 3 +++
|
||||
ping/ping_common.c | 22 +++++++++++++++++++---
|
||||
2 files changed, 22 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/iputils_common.h b/iputils_common.h
|
||||
index 49e790d..829a749 100644
|
||||
--- a/iputils_common.h
|
||||
+++ b/iputils_common.h
|
||||
@@ -10,6 +10,9 @@
|
||||
!!__builtin_types_compatible_p(__typeof__(arr), \
|
||||
__typeof__(&arr[0]))])) * 0)
|
||||
|
||||
+/* 1000001 = 1000000 tv_sec + 1 tv_usec */
|
||||
+#define TV_SEC_MAX_VAL (LONG_MAX/1000001)
|
||||
+
|
||||
#ifdef __GNUC__
|
||||
# define iputils_attribute_format(t, n, m) __attribute__((__format__ (t, n, m)))
|
||||
#else
|
||||
diff --git a/ping/ping_common.c b/ping/ping_common.c
|
||||
index dadd2a4..4e99d89 100644
|
||||
--- a/ping/ping_common.c
|
||||
+++ b/ping/ping_common.c
|
||||
@@ -754,16 +754,32 @@ int gather_statistics(struct ping_rts *rts, uint8_t *icmph, int icmplen,
|
||||
|
||||
restamp:
|
||||
tvsub(tv, &tmp_tv);
|
||||
- triptime = tv->tv_sec * 1000000 + tv->tv_usec;
|
||||
- if (triptime < 0) {
|
||||
- error(0, 0, _("Warning: time of day goes back (%ldus), taking countermeasures"), triptime);
|
||||
+
|
||||
+ if (tv->tv_usec >= 1000000) {
|
||||
+ error(0, 0, _("Warning: invalid tv_usec %ld us"), tv->tv_usec);
|
||||
+ tv->tv_usec = 999999;
|
||||
+ }
|
||||
+
|
||||
+ if (tv->tv_usec < 0) {
|
||||
+ error(0, 0, _("Warning: invalid tv_usec %ld us"), tv->tv_usec);
|
||||
+ tv->tv_usec = 0;
|
||||
+ }
|
||||
+
|
||||
+ if (tv->tv_sec > TV_SEC_MAX_VAL) {
|
||||
+ error(0, 0, _("Warning: invalid tv_sec %ld s"), tv->tv_sec);
|
||||
+ triptime = 0;
|
||||
+ } else if (tv->tv_sec < 0) {
|
||||
+ error(0, 0, _("Warning: time of day goes back (%ld s), taking countermeasures"), tv->tv_sec);
|
||||
triptime = 0;
|
||||
if (!rts->opt_latency) {
|
||||
gettimeofday(tv, NULL);
|
||||
rts->opt_latency = 1;
|
||||
goto restamp;
|
||||
}
|
||||
+ } else {
|
||||
+ triptime = tv->tv_sec * 1000000 + tv->tv_usec;
|
||||
}
|
||||
+
|
||||
if (!csfailed) {
|
||||
rts->tsum += triptime;
|
||||
rts->tsum2 += (double)((long long)triptime * (long long)triptime);
|
||||
--
|
||||
2.34.1
|
||||
|
||||
@@ -12,6 +12,7 @@ DEPENDS = "gnutls"
|
||||
|
||||
SRC_URI = "git://github.com/iputils/iputils;branch=master;protocol=https \
|
||||
file://0001-rarpd-rdisc-Drop-PrivateUsers.patch \
|
||||
file://CVE-2025-47268.patch \
|
||||
"
|
||||
SRCREV = "1d1e7c43210d8af316a41cb2c53d612a4c16f34d"
|
||||
|
||||
|
||||
@@ -0,0 +1,91 @@
|
||||
From 7a8f42fb20013a1493d8cae1c43436f85e656f2d Mon Sep 17 00:00:00 2001
|
||||
From: Zephkeks <zephyrofficialdiscord@gmail.com>
|
||||
Date: Tue, 13 May 2025 11:04:17 +0200
|
||||
Subject: [PATCH] CVE-2025-46836: interface.c: Stack-based Buffer Overflow in
|
||||
get_name()
|
||||
|
||||
Coordinated as GHSA-pfwf-h6m3-63wf
|
||||
|
||||
CVE: CVE-2025-46836
|
||||
Upstream-Status: Backport [https://sourceforge.net/p/net-tools/code/ci/7a8f42fb20013a1493d8cae1c43436f85e656f2d/]
|
||||
Signed-off-by: Peter Marko <peter.marko@siemens.com>
|
||||
---
|
||||
lib/interface.c | 63 ++++++++++++++++++++++++++++++-------------------
|
||||
1 file changed, 39 insertions(+), 24 deletions(-)
|
||||
|
||||
diff --git a/lib/interface.c b/lib/interface.c
|
||||
index 71d4163..a054f12 100644
|
||||
--- a/lib/interface.c
|
||||
+++ b/lib/interface.c
|
||||
@@ -211,32 +211,47 @@ out:
|
||||
}
|
||||
|
||||
static const char *get_name(char *name, const char *p)
|
||||
+/* Safe version — guarantees at most IFNAMSIZ‑1 bytes are copied
|
||||
+ and the destination buffer is always NUL‑terminated. */
|
||||
{
|
||||
- while (isspace(*p))
|
||||
- p++;
|
||||
- while (*p) {
|
||||
- if (isspace(*p))
|
||||
- break;
|
||||
- if (*p == ':') { /* could be an alias */
|
||||
- const char *dot = p++;
|
||||
- while (*p && isdigit(*p)) p++;
|
||||
- if (*p == ':') {
|
||||
- /* Yes it is, backup and copy it. */
|
||||
- p = dot;
|
||||
- *name++ = *p++;
|
||||
- while (*p && isdigit(*p)) {
|
||||
- *name++ = *p++;
|
||||
- }
|
||||
- } else {
|
||||
- /* No, it isn't */
|
||||
- p = dot;
|
||||
- }
|
||||
- p++;
|
||||
- break;
|
||||
- }
|
||||
- *name++ = *p++;
|
||||
+ char *dst = name; /* current write ptr */
|
||||
+ const char *end = name + IFNAMSIZ - 1; /* last byte we may write */
|
||||
+
|
||||
+ /* Skip leading white‑space. */
|
||||
+ while (isspace((unsigned char)*p))
|
||||
+ ++p;
|
||||
+
|
||||
+ /* Copy until white‑space, end of string, or buffer full. */
|
||||
+ while (*p && !isspace((unsigned char)*p) && dst < end) {
|
||||
+ if (*p == ':') { /* possible alias veth0:123: */
|
||||
+ const char *dot = p; /* remember the colon */
|
||||
+ ++p;
|
||||
+ while (*p && isdigit((unsigned char)*p))
|
||||
+ ++p;
|
||||
+
|
||||
+ if (*p == ':') { /* confirmed alias */
|
||||
+ p = dot; /* rewind and copy it all */
|
||||
+
|
||||
+ /* copy the colon */
|
||||
+ if (dst < end)
|
||||
+ *dst++ = *p++;
|
||||
+
|
||||
+ /* copy the digits */
|
||||
+ while (*p && isdigit((unsigned char)*p) && dst < end)
|
||||
+ *dst++ = *p++;
|
||||
+
|
||||
+ if (*p == ':') /* consume trailing colon */
|
||||
+ ++p;
|
||||
+ } else { /* if so treat as normal */
|
||||
+ p = dot;
|
||||
+ }
|
||||
+ break; /* interface name ends here */
|
||||
+ }
|
||||
+
|
||||
+ *dst++ = *p++; /* ordinary character copy */
|
||||
}
|
||||
- *name++ = '\0';
|
||||
+
|
||||
+ *dst = '\0'; /* always NUL‑terminate */
|
||||
return p;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
From ddb0e375fb9ca95bb69335540b85bbdaa2714348 Mon Sep 17 00:00:00 2001
|
||||
From: Bernd Eckenfels <net-tools@lina.inka.de>
|
||||
Date: Sat, 17 May 2025 21:53:23 +0200
|
||||
Subject: [PATCH] Interface statistic regression after 7a8f42fb2
|
||||
|
||||
CVE: CVE-2025-46836
|
||||
Upstream-Status: Backport [https://sourceforge.net/p/net-tools/code/ci/ddb0e375fb9ca95bb69335540b85bbdaa2714348/]
|
||||
Signed-off-by: Peter Marko <peter.marko@siemens.com>
|
||||
---
|
||||
lib/interface.c | 5 ++---
|
||||
1 file changed, 2 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/lib/interface.c b/lib/interface.c
|
||||
index a054f12..ca4adf1 100644
|
||||
--- a/lib/interface.c
|
||||
+++ b/lib/interface.c
|
||||
@@ -239,12 +239,11 @@ static const char *get_name(char *name, const char *p)
|
||||
/* copy the digits */
|
||||
while (*p && isdigit((unsigned char)*p) && dst < end)
|
||||
*dst++ = *p++;
|
||||
-
|
||||
- if (*p == ':') /* consume trailing colon */
|
||||
- ++p;
|
||||
} else { /* if so treat as normal */
|
||||
p = dot;
|
||||
}
|
||||
+ if (*p == ':') /* consume trailing colon */
|
||||
+ ++p;
|
||||
break; /* interface name ends here */
|
||||
}
|
||||
|
||||
@@ -11,6 +11,8 @@ SRC_URI = "git://git.code.sf.net/p/net-tools/code;protocol=https;branch=master \
|
||||
file://net-tools-config.h \
|
||||
file://net-tools-config.make \
|
||||
file://Add_missing_headers.patch \
|
||||
file://CVE-2025-46836-01.patch \
|
||||
file://CVE-2025-46836-02.patch \
|
||||
"
|
||||
|
||||
S = "${WORKDIR}/git"
|
||||
|
||||
146
meta/recipes-extended/screen/screen/CVE-2025-46802.patch
Normal file
146
meta/recipes-extended/screen/screen/CVE-2025-46802.patch
Normal file
@@ -0,0 +1,146 @@
|
||||
From 049b26b22e197ba3be9c46e5c193032e01a4724a Mon Sep 17 00:00:00 2001
|
||||
From: Matthias Gerstner <matthias.gerstner@suse.de>
|
||||
Date: Mon, 12 May 2025 15:15:38 +0200
|
||||
Subject: [PATCH] fix CVE-2025-46802: attacher.c - prevent temporary 0666 mode
|
||||
on PTYs
|
||||
|
||||
This temporary chmod of the PTY to mode 0666 is most likely a remnant of
|
||||
past times, before the PTY file descriptor was passed to the target
|
||||
session via the UNIX domain socket.
|
||||
|
||||
This chmod() causes a race condition during which any other user in the
|
||||
system can open the PTY for reading and writing, and thus allows PTY
|
||||
hijacking.
|
||||
|
||||
Simply remove this logic completely.
|
||||
|
||||
CVE: CVE-2025-46802
|
||||
|
||||
Upstream-Status: Backport [https://cgit.git.savannah.gnu.org/cgit/screen.git/commit/?id=049b26b22e197ba3be9c46e5c193032e01a4724a]
|
||||
|
||||
Signed-off-by: Divya Chellam <divya.chellam@windriver.com>
|
||||
---
|
||||
attacher.c | 27 ---------------------------
|
||||
screen.c | 19 -------------------
|
||||
2 files changed, 46 deletions(-)
|
||||
|
||||
diff --git a/attacher.c b/attacher.c
|
||||
index 18ba43c..257bd75 100644
|
||||
--- a/attacher.c
|
||||
+++ b/attacher.c
|
||||
@@ -73,7 +73,6 @@ extern int MasterPid, attach_fd;
|
||||
#ifdef MULTIUSER
|
||||
extern char *multi;
|
||||
extern int multiattach, multi_uid, own_uid;
|
||||
-extern int tty_mode, tty_oldmode;
|
||||
# ifndef USE_SETEUID
|
||||
static int multipipe[2];
|
||||
# endif
|
||||
@@ -160,9 +159,6 @@ int how;
|
||||
|
||||
if (pipe(multipipe))
|
||||
Panic(errno, "pipe");
|
||||
- if (chmod(attach_tty, 0666))
|
||||
- Panic(errno, "chmod %s", attach_tty);
|
||||
- tty_oldmode = tty_mode;
|
||||
eff_uid = -1; /* make UserContext fork */
|
||||
real_uid = multi_uid;
|
||||
if ((ret = UserContext()) <= 0)
|
||||
@@ -174,11 +170,6 @@ int how;
|
||||
Panic(errno, "UserContext");
|
||||
close(multipipe[1]);
|
||||
read(multipipe[0], &dummy, 1);
|
||||
- if (tty_oldmode >= 0)
|
||||
- {
|
||||
- chmod(attach_tty, tty_oldmode);
|
||||
- tty_oldmode = -1;
|
||||
- }
|
||||
ret = UserStatus();
|
||||
#ifdef LOCK
|
||||
if (ret == SIG_LOCK)
|
||||
@@ -224,9 +215,6 @@ int how;
|
||||
xseteuid(multi_uid);
|
||||
xseteuid(own_uid);
|
||||
#endif
|
||||
- if (chmod(attach_tty, 0666))
|
||||
- Panic(errno, "chmod %s", attach_tty);
|
||||
- tty_oldmode = tty_mode;
|
||||
}
|
||||
# endif /* USE_SETEUID */
|
||||
#endif /* MULTIUSER */
|
||||
@@ -423,13 +411,6 @@ int how;
|
||||
ContinuePlease = 0;
|
||||
# ifndef USE_SETEUID
|
||||
close(multipipe[1]);
|
||||
-# else
|
||||
- xseteuid(own_uid);
|
||||
- if (tty_oldmode >= 0)
|
||||
- if (chmod(attach_tty, tty_oldmode))
|
||||
- Panic(errno, "chmod %s", attach_tty);
|
||||
- tty_oldmode = -1;
|
||||
- xseteuid(real_uid);
|
||||
# endif
|
||||
}
|
||||
#endif
|
||||
@@ -505,14 +486,6 @@ AttacherFinit SIGDEFARG
|
||||
close(s);
|
||||
}
|
||||
}
|
||||
-#ifdef MULTIUSER
|
||||
- if (tty_oldmode >= 0)
|
||||
- {
|
||||
- if (setuid(own_uid))
|
||||
- Panic(errno, "setuid");
|
||||
- chmod(attach_tty, tty_oldmode);
|
||||
- }
|
||||
-#endif
|
||||
exit(0);
|
||||
SIGRETURN;
|
||||
}
|
||||
diff --git a/screen.c b/screen.c
|
||||
index 8bce303..f2e8171 100644
|
||||
--- a/screen.c
|
||||
+++ b/screen.c
|
||||
@@ -230,8 +230,6 @@ char *multi_home;
|
||||
int multi_uid;
|
||||
int own_uid;
|
||||
int multiattach;
|
||||
-int tty_mode;
|
||||
-int tty_oldmode = -1;
|
||||
#endif
|
||||
|
||||
char HostName[MAXSTR];
|
||||
@@ -1009,9 +1007,6 @@ int main(int ac, char** av)
|
||||
|
||||
/* ttyname implies isatty */
|
||||
SetTtyname(true, &st);
|
||||
-#ifdef MULTIUSER
|
||||
- tty_mode = (int)st.st_mode & 0777;
|
||||
-#endif
|
||||
|
||||
fl = fcntl(0, F_GETFL, 0);
|
||||
if (fl != -1 && (fl & (O_RDWR|O_RDONLY|O_WRONLY)) == O_RDWR)
|
||||
@@ -2170,20 +2165,6 @@ DEFINE_VARARGS_FN(Panic)
|
||||
if (D_userpid)
|
||||
Kill(D_userpid, SIG_BYE);
|
||||
}
|
||||
-#ifdef MULTIUSER
|
||||
- if (tty_oldmode >= 0) {
|
||||
-
|
||||
-# ifdef USE_SETEUID
|
||||
- if (setuid(own_uid))
|
||||
- xseteuid(own_uid); /* may be a loop. sigh. */
|
||||
-# else
|
||||
- setuid(own_uid);
|
||||
-# endif
|
||||
-
|
||||
- debug1("Panic: changing back modes from %s\n", attach_tty);
|
||||
- chmod(attach_tty, tty_oldmode);
|
||||
- }
|
||||
-#endif
|
||||
eexit(1);
|
||||
}
|
||||
|
||||
--
|
||||
2.40.0
|
||||
|
||||
131
meta/recipes-extended/screen/screen/CVE-2025-46804.patch
Normal file
131
meta/recipes-extended/screen/screen/CVE-2025-46804.patch
Normal file
@@ -0,0 +1,131 @@
|
||||
From e0eef5aac453fa98a2664416a56c50ad1d00cb30 Mon Sep 17 00:00:00 2001
|
||||
From: Matthias Gerstner <matthias.gerstner@suse.de>
|
||||
Date: Mon, 12 May 2025 15:26:11 +0200
|
||||
Subject: [PATCH] fix CVE-2025-46804: avoid file existence test information
|
||||
leaks
|
||||
|
||||
In setuid-root context the current error messages give away whether
|
||||
certain paths not accessible by the real user exist and what type they
|
||||
have. To prevent this only output generic error messages in setuid-root
|
||||
context.
|
||||
|
||||
In some situations, when an error is pertaining a directory and the
|
||||
directory is owner by the real user then we can still output more
|
||||
detailed diagnostics.
|
||||
|
||||
This change can lead to less helpful error messages when Screen is
|
||||
install setuid-root. More complex changes would be needed to avoid this
|
||||
(e.g. only open the `SocketPath` with raised privileges when
|
||||
multi-attach is requested).
|
||||
|
||||
There might still be lingering some code paths that allow such
|
||||
information leaks, since `SocketPath` is a global variable that is used
|
||||
across the code base. The majority of issues should be caught with this
|
||||
fix, however.
|
||||
|
||||
CVE: CVE-2025-46804
|
||||
|
||||
Upstream-Status: Backport [https://cgit.git.savannah.gnu.org/cgit/screen.git/commit/?id=e0eef5aac453fa98a2664416a56c50ad1d00cb30]
|
||||
|
||||
Signed-off-by: Divya Chellam <divya.chellam@windriver.com>
|
||||
---
|
||||
screen.c | 45 ++++++++++++++++++++++++++++++++++-----------
|
||||
socket.c | 9 +++++++--
|
||||
2 files changed, 41 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/screen.c b/screen.c
|
||||
index f2e8171..ef6c26a 100644
|
||||
--- a/screen.c
|
||||
+++ b/screen.c
|
||||
@@ -1122,15 +1122,28 @@ int main(int ac, char** av)
|
||||
#endif
|
||||
}
|
||||
|
||||
- if (stat(SockPath, &st) == -1)
|
||||
- Panic(errno, "Cannot access %s", SockPath);
|
||||
- else
|
||||
- if (!S_ISDIR(st.st_mode))
|
||||
+ if (stat(SockPath, &st) == -1) {
|
||||
+ if (eff_uid == real_uid) {
|
||||
+ Panic(errno, "Cannot access %s", SockPath);
|
||||
+ } else {
|
||||
+ Panic(0, "Error accessing %s", SockPath);
|
||||
+ }
|
||||
+ } else if (!S_ISDIR(st.st_mode)) {
|
||||
+ if (eff_uid == real_uid || st.st_uid == real_uid) {
|
||||
Panic(0, "%s is not a directory.", SockPath);
|
||||
+ } else {
|
||||
+ Panic(0, "Error accessing %s", SockPath);
|
||||
+ }
|
||||
+ }
|
||||
#ifdef MULTIUSER
|
||||
if (multi) {
|
||||
- if ((int)st.st_uid != multi_uid)
|
||||
- Panic(0, "%s is not the owner of %s.", multi, SockPath);
|
||||
+ if ((int)st.st_uid != multi_uid) {
|
||||
+ if (eff_uid == real_uid || st.st_uid == real_uid) {
|
||||
+ Panic(0, "%s is not the owner of %s.", multi, SockPath);
|
||||
+ } else {
|
||||
+ Panic(0, "Error accessing %s", SockPath);
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
else
|
||||
#endif
|
||||
@@ -1144,9 +1157,13 @@ int main(int ac, char** av)
|
||||
Panic(0, "You are not the owner of %s.", SockPath);
|
||||
#endif
|
||||
}
|
||||
-
|
||||
- if ((st.st_mode & 0777) != 0700)
|
||||
- Panic(0, "Directory %s must have mode 700.", SockPath);
|
||||
+ if ((st.st_mode & 0777) != 0700) {
|
||||
+ if (eff_uid == real_uid || st.st_uid == real_uid) {
|
||||
+ Panic(0, "Directory %s must have mode 700.", SockPath);
|
||||
+ } else {
|
||||
+ Panic(0, "Error accessing %s", SockPath);
|
||||
+ }
|
||||
+ }
|
||||
if (SockMatch && index(SockMatch, '/'))
|
||||
Panic(0, "Bad session name '%s'", SockMatch);
|
||||
SockName = SockPath + strlen(SockPath) + 1;
|
||||
@@ -1184,8 +1201,14 @@ int main(int ac, char** av)
|
||||
else
|
||||
exit(9 + (fo || oth ? 1 : 0) + fo);
|
||||
}
|
||||
- if (fo == 0)
|
||||
- Panic(0, "No Sockets found in %s.\n", SockPath);
|
||||
+ if (fo == 0) {
|
||||
+ if (eff_uid == real_uid || st.st_uid == real_uid) {
|
||||
+ Panic(0, "No Sockets found in %s.\n", SockPath);
|
||||
+ } else {
|
||||
+ Panic(0, "Error accessing %s", SockPath);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
Msg(0, "%d Socket%s in %s.", fo, fo > 1 ? "s" : "", SockPath);
|
||||
eexit(0);
|
||||
}
|
||||
diff --git a/socket.c b/socket.c
|
||||
index 3bbd64e..5661e6e 100644
|
||||
--- a/socket.c
|
||||
+++ b/socket.c
|
||||
@@ -169,8 +169,13 @@ bool *is_sock;
|
||||
xsetegid(real_gid);
|
||||
#endif
|
||||
|
||||
- if ((dirp = opendir(SockPath)) == 0)
|
||||
- Panic(errno, "Cannot opendir %s", SockPath);
|
||||
+ if ((dirp = opendir(SockPath)) == 0) {
|
||||
+ if (eff_uid == real_uid) {
|
||||
+ Panic(errno, "Cannot opendir %s", SockPath);
|
||||
+ } else {
|
||||
+ Panic(0, "Error accessing %s", SockPath);
|
||||
+ }
|
||||
+ }
|
||||
|
||||
slist = 0;
|
||||
slisttail = &slist;
|
||||
--
|
||||
2.40.0
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user