mirror of
https://git.yoctoproject.org/poky
synced 2026-02-22 09:29:40 +01:00
Compare commits
66 Commits
yocto-4.0.
...
kirkstone-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
54af8c5e80 | ||
|
|
f91fefe108 | ||
|
|
f634b9852e | ||
|
|
78e79d47c2 | ||
|
|
f5f650aaa4 | ||
|
|
d1a5c51431 | ||
|
|
8f6035f44d | ||
|
|
ae249a900f | ||
|
|
d9f531b374 | ||
|
|
b3e1dabe66 | ||
|
|
80b4e5f953 | ||
|
|
410d7bf8cb | ||
|
|
ce477b4d6e | ||
|
|
906af0cb8b | ||
|
|
426dfdc8d2 | ||
|
|
924b38aa01 | ||
|
|
4a900fd822 | ||
|
|
4289397aaf | ||
|
|
76d570000e | ||
|
|
33faa4d392 | ||
|
|
f96bd47ea2 | ||
|
|
a818202d85 | ||
|
|
c165a558da | ||
|
|
e318dc57e3 | ||
|
|
c0a199acdc | ||
|
|
f0f023e86d | ||
|
|
d1aae420f9 | ||
|
|
d9532264b9 | ||
|
|
6c7c9b1146 | ||
|
|
3ef22a75a3 | ||
|
|
19b0baeb81 | ||
|
|
88ba7d2d3a | ||
|
|
df2f696e68 | ||
|
|
bad31561c0 | ||
|
|
e9dbcd7a01 | ||
|
|
8ffcfd69b5 | ||
|
|
f754b5d45b | ||
|
|
d95d26073d | ||
|
|
19c1f963a9 | ||
|
|
1b0b487dcc | ||
|
|
a7eb75e292 | ||
|
|
7262c0f235 | ||
|
|
558325482c | ||
|
|
3b8c412b7f | ||
|
|
8d726b790a | ||
|
|
7008d999c5 | ||
|
|
a7f86b0e78 | ||
|
|
1520bf97aa | ||
|
|
ddbdef6e58 | ||
|
|
4a7f8470c2 | ||
|
|
9b7cc27c39 | ||
|
|
306316eb80 | ||
|
|
27ec491044 | ||
|
|
2ebcefae46 | ||
|
|
7640d1f82e | ||
|
|
ac4914f538 | ||
|
|
f4d36b60f8 | ||
|
|
7a939cd7e6 | ||
|
|
064936af55 | ||
|
|
3a5ddec4d1 | ||
|
|
d00aada1d1 | ||
|
|
cfcbf783ab | ||
|
|
15b42171a3 | ||
|
|
8caaab3252 | ||
|
|
cd6f183a34 | ||
|
|
875ce46a8d |
@@ -56,25 +56,24 @@ def main():
|
||||
nonlocal missed_hashes
|
||||
nonlocal max_time
|
||||
|
||||
client = hashserv.create_client(args.address)
|
||||
with hashserv.create_client(args.address) as client:
|
||||
for i in range(args.requests):
|
||||
taskhash = hashlib.sha256()
|
||||
taskhash.update(args.taskhash_seed.encode('utf-8'))
|
||||
taskhash.update(str(i).encode('utf-8'))
|
||||
|
||||
for i in range(args.requests):
|
||||
taskhash = hashlib.sha256()
|
||||
taskhash.update(args.taskhash_seed.encode('utf-8'))
|
||||
taskhash.update(str(i).encode('utf-8'))
|
||||
start_time = time.perf_counter()
|
||||
l = client.get_unihash(METHOD, taskhash.hexdigest())
|
||||
elapsed = time.perf_counter() - start_time
|
||||
|
||||
start_time = time.perf_counter()
|
||||
l = client.get_unihash(METHOD, taskhash.hexdigest())
|
||||
elapsed = time.perf_counter() - start_time
|
||||
with lock:
|
||||
if l:
|
||||
found_hashes += 1
|
||||
else:
|
||||
missed_hashes += 1
|
||||
|
||||
with lock:
|
||||
if l:
|
||||
found_hashes += 1
|
||||
else:
|
||||
missed_hashes += 1
|
||||
|
||||
max_time = max(elapsed, max_time)
|
||||
pbar.update()
|
||||
max_time = max(elapsed, max_time)
|
||||
pbar.update()
|
||||
|
||||
max_time = 0
|
||||
found_hashes = 0
|
||||
@@ -152,9 +151,8 @@ def main():
|
||||
|
||||
func = getattr(args, 'func', None)
|
||||
if func:
|
||||
client = hashserv.create_client(args.address)
|
||||
|
||||
return func(args, client)
|
||||
with hashserv.create_client(args.address) as client:
|
||||
return func(args, client)
|
||||
|
||||
return 0
|
||||
|
||||
|
||||
@@ -15,6 +15,13 @@ import sys
|
||||
if sys.version_info < (3, 6, 0):
|
||||
raise RuntimeError("Sorry, python 3.6.0 or later is required for this version of bitbake")
|
||||
|
||||
if sys.version_info < (3, 10, 0):
|
||||
# With python 3.8 and 3.9, we see errors of "libgcc_s.so.1 must be installed for pthread_cancel to work"
|
||||
# https://stackoverflow.com/questions/64797838/libgcc-s-so-1-must-be-installed-for-pthread-cancel-to-work
|
||||
# https://bugs.ams1.psf.io/issue42888
|
||||
# so ensure libgcc_s is loaded early on
|
||||
import ctypes
|
||||
libgcc_s = ctypes.CDLL('libgcc_s.so.1')
|
||||
|
||||
class BBHandledException(Exception):
|
||||
"""
|
||||
|
||||
@@ -126,6 +126,12 @@ class AsyncClient(object):
|
||||
{'ping': {}}
|
||||
)
|
||||
|
||||
async def __aenter__(self):
|
||||
return self
|
||||
|
||||
async def __aexit__(self, exc_type, exc_value, traceback):
|
||||
await self.close()
|
||||
|
||||
|
||||
class Client(object):
|
||||
def __init__(self):
|
||||
@@ -176,3 +182,10 @@ class Client(object):
|
||||
if sys.version_info >= (3, 6):
|
||||
self.loop.run_until_complete(self.loop.shutdown_asyncgens())
|
||||
self.loop.close()
|
||||
|
||||
def __enter__(self):
|
||||
return self
|
||||
|
||||
def __exit__(self, exc_type, exc_value, traceback):
|
||||
self.close()
|
||||
return False
|
||||
|
||||
@@ -310,6 +310,7 @@ def build_dependencies(key, keys, shelldeps, varflagsexcl, ignored_vars, d):
|
||||
value += "\n_remove of %s" % r
|
||||
deps |= r2.references
|
||||
deps = deps | (keys & r2.execs)
|
||||
value = handle_contains(value, r2.contains, exclusions, d)
|
||||
return value
|
||||
|
||||
if "vardepvalue" in varflags:
|
||||
|
||||
@@ -430,6 +430,32 @@ esac
|
||||
self.assertEqual(deps, set(["TESTVAR2"]))
|
||||
self.assertEqual(self.d.getVar('ANOTHERVAR').split(), ['testval3', 'anothervalue'])
|
||||
|
||||
def test_contains_vardeps_override_operators(self):
|
||||
# Check override operators handle dependencies correctly with the contains functionality
|
||||
expr_plain = 'testval'
|
||||
expr_prepend = '${@bb.utils.filter("TESTVAR1", "testval1", d)} '
|
||||
expr_append = ' ${@bb.utils.filter("TESTVAR2", "testval2", d)}'
|
||||
expr_remove = '${@bb.utils.contains("TESTVAR3", "no-testval", "testval", "", d)}'
|
||||
# Check dependencies
|
||||
self.d.setVar('ANOTHERVAR', expr_plain)
|
||||
self.d.prependVar('ANOTHERVAR', expr_prepend)
|
||||
self.d.appendVar('ANOTHERVAR', expr_append)
|
||||
self.d.setVar('ANOTHERVAR:remove', expr_remove)
|
||||
self.d.setVar('TESTVAR1', 'blah')
|
||||
self.d.setVar('TESTVAR2', 'testval2')
|
||||
self.d.setVar('TESTVAR3', 'no-testval')
|
||||
deps, values = bb.data.build_dependencies("ANOTHERVAR", set(self.d.keys()), set(), set(), set(), self.d)
|
||||
self.assertEqual(sorted(values.splitlines()),
|
||||
sorted([
|
||||
expr_prepend + expr_plain + expr_append,
|
||||
'_remove of ' + expr_remove,
|
||||
'TESTVAR1{testval1} = Unset',
|
||||
'TESTVAR2{testval2} = Set',
|
||||
'TESTVAR3{no-testval} = Set',
|
||||
]))
|
||||
# Check final value
|
||||
self.assertEqual(self.d.getVar('ANOTHERVAR').split(), ['testval2'])
|
||||
|
||||
#Currently no wildcard support
|
||||
#def test_vardeps_wildcards(self):
|
||||
# self.d.setVar("oe_libinstall", "echo test")
|
||||
|
||||
@@ -344,9 +344,9 @@ def auto_shutdown():
|
||||
def ping(host, port):
|
||||
from . import client
|
||||
|
||||
conn = client.PRClient()
|
||||
conn.connect_tcp(host, port)
|
||||
return conn.ping()
|
||||
with client.PRClient() as conn:
|
||||
conn.connect_tcp(host, port)
|
||||
return conn.ping()
|
||||
|
||||
def connect(host, port):
|
||||
from . import client
|
||||
|
||||
@@ -11,7 +11,7 @@ import os
|
||||
import re
|
||||
import logging
|
||||
import json
|
||||
import subprocess
|
||||
import glob
|
||||
from collections import Counter
|
||||
|
||||
from orm.models import Project, ProjectTarget, Build, Layer_Version
|
||||
@@ -234,13 +234,11 @@ class XhrSetDefaultImageUrl(View):
|
||||
|
||||
def scan_layer_content(layer,layer_version):
|
||||
# if this is a local layer directory, we can immediately scan its content
|
||||
if layer.local_source_dir:
|
||||
if os.path.isdir(layer.local_source_dir):
|
||||
try:
|
||||
# recipes-*/*/*.bb
|
||||
cmd = '%s %s' % ('ls', os.path.join(layer.local_source_dir,'recipes-*/*/*.bb'))
|
||||
recipes_list = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE,stderr=subprocess.STDOUT).stdout.read()
|
||||
recipes_list = recipes_list.decode("utf-8").strip()
|
||||
if recipes_list and 'No such' not in recipes_list:
|
||||
recipes_list = glob.glob(os.path.join(layer.local_source_dir, 'recipes-*/*/*.bb'))
|
||||
for recipe in recipes_list:
|
||||
for recipe in recipes_list.split('\n'):
|
||||
recipe_path = recipe[recipe.rfind('recipes-'):]
|
||||
recipe_name = recipe[recipe.rfind('/')+1:].replace('.bb','')
|
||||
@@ -260,6 +258,9 @@ def scan_layer_content(layer,layer_version):
|
||||
|
||||
except Exception as e:
|
||||
logger.warning("ERROR:scan_layer_content: %s" % e)
|
||||
else:
|
||||
logger.warning("ERROR: wrong path given")
|
||||
raise KeyError("local_source_dir")
|
||||
|
||||
class XhrLayer(View):
|
||||
""" Delete, Get, Add and Update Layer information
|
||||
|
||||
@@ -254,10 +254,10 @@ an entire Linux distribution, including the toolchain, from source.
|
||||
To use such mirrors, uncomment the below lines in your ``conf/local.conf``
|
||||
file in the :term:`Build Directory`::
|
||||
|
||||
BB_SIGNATURE_HANDLER = "OEEquivHash"
|
||||
BB_HASHSERVE = "auto"
|
||||
BB_HASHSERVE_UPSTREAM = "hashserv.yocto.io:8687"
|
||||
SSTATE_MIRRORS ?= "file://.* http://cdn.jsdelivr.net/yocto/sstate/all/PATH;downloadfilename=PATH"
|
||||
BB_HASHSERVE = "auto"
|
||||
BB_SIGNATURE_HANDLER = "OEEquivHash"
|
||||
|
||||
#. **Start the Build:** Continue with the following command to build an OS
|
||||
image for the target, which is ``core-image-sato`` in this example:
|
||||
|
||||
@@ -250,6 +250,18 @@ Recipes need to define both the :term:`LICENSE` and
|
||||
correct string that you can substitute into the recipe file for a
|
||||
subsequent build.
|
||||
|
||||
License Updates
|
||||
~~~~~~~~~~~~~~~
|
||||
|
||||
When you change the :term:`LICENSE` or :term:`LIC_FILES_CHKSUM` in the recipe
|
||||
you need to briefly explain the reason for the change via a ``License-Update:``
|
||||
tag. Often it's quite trivial, such as::
|
||||
|
||||
License-Update: copyright years refreshed
|
||||
|
||||
Less often, the actual licensing terms themselves will have changed. If so, do
|
||||
try to link to upstream making/justifying that decision.
|
||||
|
||||
Tips and Guidelines for Writing Recipes
|
||||
---------------------------------------
|
||||
|
||||
|
||||
@@ -57,7 +57,7 @@ Set up Git
|
||||
The first thing to do is to install Git packages. Here is an example
|
||||
on Debian and Ubuntu::
|
||||
|
||||
sudo aptitude install git-core git-email
|
||||
sudo apt install git-core git-email
|
||||
|
||||
Then, you need to set a name and e-mail address that Git will
|
||||
use to identify your commits::
|
||||
@@ -420,7 +420,7 @@ or any layer other than :oe_git:`openembedded-core </openembedded-core/>`,
|
||||
please add the appropriate prefix so that it is clear which layer the patch is intended
|
||||
to be applied to::
|
||||
|
||||
git send-email --subject-prefix="meta-oe][PATCH" ...
|
||||
git format-patch --subject-prefix="meta-oe][PATCH" ...
|
||||
|
||||
.. note::
|
||||
|
||||
|
||||
@@ -32,6 +32,10 @@ build host running Linux.
|
||||
OpenEmbedded build system, see the
|
||||
:doc:`/brief-yoctoprojectqs/index` document.
|
||||
|
||||
- You can also use the `Yocto Project BitBake
|
||||
<https://marketplace.visualstudio.com/items?itemName=yocto-project.yocto-bitbake>`__
|
||||
extension for Visual Studio Code to build images.
|
||||
|
||||
The build process creates an entire Linux distribution from source and
|
||||
places it in your :term:`Build Directory` under ``tmp/deploy/images``. For
|
||||
detailed information on the build process using BitBake, see the
|
||||
|
||||
@@ -327,7 +327,7 @@ BitBake has determined by doing the following:
|
||||
the task. This list also includes indirect dependencies from
|
||||
variables depending on other variables, recursively::
|
||||
|
||||
Task dependencies: ['PV', 'SRCREV', 'SRC_URI', 'SRC_URI[md5sum]', 'SRC_URI[sha256sum]', 'base_do_fetch']
|
||||
Task dependencies: ['PV', 'SRCREV', 'SRC_URI', 'SRC_URI[sha256sum]', 'base_do_fetch']
|
||||
|
||||
.. note::
|
||||
|
||||
|
||||
@@ -313,7 +313,7 @@ Logo for your layer and application. The process consists of two parts:
|
||||
successful compatibility registration.
|
||||
|
||||
#. Completion of an application acceptance form, which you can find at
|
||||
:yocto_home:`/webform/yocto-project-compatible-registration`.
|
||||
:yocto_home:`/compatible-registration/`.
|
||||
|
||||
To be granted permission to use the logo, you need to satisfy the
|
||||
following:
|
||||
@@ -337,7 +337,7 @@ application, you can use the Yocto Project Compatibility Logo with your
|
||||
layer and the application that uses your layer.
|
||||
|
||||
To access the form, use this link:
|
||||
:yocto_home:`/webform/yocto-project-compatible-registration`.
|
||||
:yocto_home:`/compatible-registration`.
|
||||
Follow the instructions on the form to complete your application.
|
||||
|
||||
The application consists of the following sections:
|
||||
|
||||
@@ -303,28 +303,33 @@ If your :term:`SRC_URI` statement includes URLs pointing to individual files
|
||||
fetched from a remote server other than a version control system,
|
||||
BitBake attempts to verify the files against checksums defined in your
|
||||
recipe to ensure they have not been tampered with or otherwise modified
|
||||
since the recipe was written. Two checksums are used:
|
||||
``SRC_URI[md5sum]`` and ``SRC_URI[sha256sum]``.
|
||||
since the recipe was written. Multiple checksums are supported:
|
||||
``SRC_URI[md5sum]``, ``SRC_URI[sha1sum]``, ``SRC_URI[sha256sum]``.
|
||||
``SRC_URI[sha384sum]`` and ``SRC_URI[sha512sum]``, but only
|
||||
``SRC_URI[sha256sum]`` is commonly used.
|
||||
|
||||
.. note::
|
||||
|
||||
``SRC_URI[md5sum]`` used to also be commonly used, but it is deprecated
|
||||
and should be replaced by ``SRC_URI[sha256sum]`` when updating existing
|
||||
recipes.
|
||||
|
||||
If your :term:`SRC_URI` variable points to more than a single URL (excluding
|
||||
SCM URLs), you need to provide the ``md5`` and ``sha256`` checksums for
|
||||
each URL. For these cases, you provide a name for each URL as part of
|
||||
the :term:`SRC_URI` and then reference that name in the subsequent checksum
|
||||
statements. Here is an example combining lines from the files
|
||||
``git.inc`` and ``git_2.24.1.bb``::
|
||||
SCM URLs), you need to provide the ``sha256`` checksum for each URL. For these
|
||||
cases, you provide a name for each URL as part of the :term:`SRC_URI` and then
|
||||
reference that name in the subsequent checksum statements. Here is an example
|
||||
combining lines from the files ``git.inc`` and ``git_2.24.1.bb``::
|
||||
|
||||
SRC_URI = "${KERNELORG_MIRROR}/software/scm/git/git-${PV}.tar.gz;name=tarball \
|
||||
${KERNELORG_MIRROR}/software/scm/git/git-manpages-${PV}.tar.gz;name=manpages"
|
||||
|
||||
SRC_URI[tarball.md5sum] = "166bde96adbbc11c8843d4f8f4f9811b"
|
||||
SRC_URI[tarball.sha256sum] = "ad5334956301c86841eb1e5b1bb20884a6bad89a10a6762c958220c7cf64da02"
|
||||
SRC_URI[manpages.md5sum] = "31c2272a8979022497ba3d4202df145d"
|
||||
SRC_URI[manpages.sha256sum] = "9a7ae3a093bea39770eb96ca3e5b40bff7af0b9f6123f089d7821d0e5b8e1230"
|
||||
|
||||
Proper values for ``md5`` and ``sha256`` checksums might be available
|
||||
The proper value for the ``sha256`` checksum might be available together
|
||||
with other signatures on the download page for the upstream source (e.g.
|
||||
``md5``, ``sha1``, ``sha256``, ``GPG``, and so forth). Because the
|
||||
OpenEmbedded build system only deals with ``sha256sum`` and ``md5sum``,
|
||||
OpenEmbedded build system typically only deals with ``sha256sum``,
|
||||
you should verify all the signatures you find by hand.
|
||||
|
||||
If no :term:`SRC_URI` checksums are specified when you attempt to build the
|
||||
|
||||
@@ -459,7 +459,7 @@ layer's ``layer.conf`` file as normal). Just remember the following:
|
||||
directory.
|
||||
|
||||
To create a new test, start by copying an existing module (e.g.
|
||||
``syslog.py`` or ``gcc.py`` are good ones to use). Test modules can use
|
||||
``oe_syslog.py`` or ``gcc.py`` are good ones to use). Test modules can use
|
||||
code from ``meta/lib/oeqa/utils``, which are helper classes.
|
||||
|
||||
.. note::
|
||||
|
||||
@@ -332,7 +332,10 @@ to use the Extensible SDK, see the ":doc:`/sdk-manual/extensible`" Chapter in th
|
||||
Project Application Development and the Extensible Software Development
|
||||
Kit (eSDK) manual. If you want to work on the kernel, see the :doc:`/kernel-dev/index`. If you are going to use
|
||||
Toaster, see the ":doc:`/toaster-manual/setup-and-use`"
|
||||
section in the Toaster User Manual.
|
||||
section in the Toaster User Manual. If you are a VSCode user, you can configure
|
||||
the `Yocto Project BitBake
|
||||
<https://marketplace.visualstudio.com/items?itemName=yocto-project.yocto-bitbake>`__
|
||||
extension accordingly.
|
||||
|
||||
Setting Up to Use CROss PlatformS (CROPS)
|
||||
-----------------------------------------
|
||||
@@ -424,7 +427,10 @@ section. If you are going to use the Extensible SDK container, see the
|
||||
Project Application Development and the Extensible Software Development
|
||||
Kit (eSDK) manual. If you are going to use the Toaster container, see
|
||||
the ":doc:`/toaster-manual/setup-and-use`"
|
||||
section in the Toaster User Manual.
|
||||
section in the Toaster User Manual. If you are a VSCode user, you can configure
|
||||
the `Yocto Project BitBake
|
||||
<https://marketplace.visualstudio.com/items?itemName=yocto-project.yocto-bitbake>`__
|
||||
extension accordingly.
|
||||
|
||||
Setting Up to Use Windows Subsystem For Linux (WSLv2)
|
||||
-----------------------------------------------------
|
||||
@@ -554,7 +560,10 @@ Extensible SDK container, see the ":doc:`/sdk-manual/extensible`" Chapter in the
|
||||
Project Application Development and the Extensible Software Development
|
||||
Kit (eSDK) manual. If you are going to use the Toaster container, see
|
||||
the ":doc:`/toaster-manual/setup-and-use`"
|
||||
section in the Toaster User Manual.
|
||||
section in the Toaster User Manual. If you are a VSCode user, you can configure
|
||||
the `Yocto Project BitBake
|
||||
<https://marketplace.visualstudio.com/items?itemName=yocto-project.yocto-bitbake>`__
|
||||
extension accordingly.
|
||||
|
||||
Locating Yocto Project Source Files
|
||||
===================================
|
||||
@@ -642,7 +651,7 @@ Follow these steps to locate and download a particular tarball:
|
||||
Using the Downloads Page
|
||||
------------------------
|
||||
|
||||
The :yocto_home:`Yocto Project Website <>` uses a "DOWNLOADS" page
|
||||
The :yocto_home:`Yocto Project Website <>` uses a "RELEASES" page
|
||||
from which you can locate and download tarballs of any Yocto Project
|
||||
release. Rather than Git repositories, these files represent snapshot
|
||||
tarballs similar to the tarballs located in the Index of Releases
|
||||
@@ -651,11 +660,13 @@ described in the ":ref:`dev-manual/start:accessing index of releases`" section.
|
||||
1. *Go to the Yocto Project Website:* Open The
|
||||
:yocto_home:`Yocto Project Website <>` in your browser.
|
||||
|
||||
2. *Get to the Downloads Area:* Select the "DOWNLOADS" item from the
|
||||
pull-down "SOFTWARE" tab menu near the top of the page.
|
||||
#. *Get to the Downloads Area:* Select the "RELEASES" item from the
|
||||
pull-down "DEVELOPMENT" tab menu near the top of the page.
|
||||
|
||||
3. *Select a Yocto Project Release:* Use the menu next to "RELEASE" to
|
||||
display and choose a recent or past supported Yocto Project release
|
||||
#. *Select a Yocto Project Release:* On the top of the "RELEASE" page currently
|
||||
supported releases are displayed, further down past supported Yocto Project
|
||||
releases are visible. The "Download" links in the rows of the table there
|
||||
will lead to the download tarballs for the release
|
||||
(e.g. &DISTRO_NAME_NO_CAP;, &DISTRO_NAME_NO_CAP_MINUS_ONE;, and so forth).
|
||||
|
||||
.. note::
|
||||
@@ -666,9 +677,9 @@ described in the ":ref:`dev-manual/start:accessing index of releases`" section.
|
||||
You can use the "RELEASE ARCHIVE" link to reveal a menu of all Yocto
|
||||
Project releases.
|
||||
|
||||
4. *Download Tools or Board Support Packages (BSPs):* From the
|
||||
"DOWNLOADS" page, you can download tools or BSPs as well. Just scroll
|
||||
down the page and look for what you need.
|
||||
#. *Download Tools or Board Support Packages (BSPs):* Next to the tarballs you
|
||||
will find download tools or BSPs as well. Just select a Yocto Project
|
||||
release and look for what you need.
|
||||
|
||||
Cloning and Checking Out Branches
|
||||
=================================
|
||||
|
||||
@@ -27,7 +27,7 @@ Staging Directories in Sysroot Has Been Simplified
|
||||
The way directories are staged in sysroot has been simplified and
|
||||
introduces the new :term:`SYSROOT_DIRS`,
|
||||
:term:`SYSROOT_DIRS_NATIVE`, and ``SYSROOT_DIRS_BLACKLIST``
|
||||
(replaced by :term:`SYSROOT_DIRS_IGNORE` in version 3.5). See the
|
||||
(replaced by :term:`SYSROOT_DIRS_IGNORE` in version 4.0). See the
|
||||
:oe_lists:`v2 patch series on the OE-Core Mailing List
|
||||
</pipermail/openembedded-core/2016-May/121365.html>`
|
||||
for additional information.
|
||||
@@ -442,7 +442,7 @@ The following miscellaneous changes have occurred:
|
||||
- :ref:`ref-classes-image`: Renamed COMPRESS(ION) to CONVERSION. This change
|
||||
means that ``COMPRESSIONTYPES``, ``COMPRESS_DEPENDS`` and
|
||||
``COMPRESS_CMD`` are deprecated in favor of ``CONVERSIONTYPES``,
|
||||
``CONVERSION_DEPENDS`` and ``CONVERSION_CMD``. The ``COMPRESS*``
|
||||
``CONVERSION_DEPENDS`` and :term:`CONVERSION_CMD`. The ``COMPRESS*``
|
||||
variable names will still work in the 2.2 release but metadata that
|
||||
does not need to be backwards-compatible should be changed to use the
|
||||
new names as the ``COMPRESS*`` ones will be removed in a future
|
||||
|
||||
@@ -301,7 +301,7 @@ The following are additional changes:
|
||||
likely be removed in the next Yocto Project release.
|
||||
|
||||
- The ``vmdk``, ``vdi``, and ``qcow2`` image file types are now used in
|
||||
conjunction with the "wic" image type through ``CONVERSION_CMD``.
|
||||
conjunction with the "wic" image type through :term:`CONVERSION_CMD`.
|
||||
Consequently, the equivalent image types are now ``wic.vmdk``,
|
||||
``wic.vdi``, and ``wic.qcow2``, respectively.
|
||||
|
||||
|
||||
@@ -148,7 +148,7 @@ XML feeds that ``cve-check-tool`` was using, supports CVSSv3 scoring,
|
||||
and makes other improvements.
|
||||
|
||||
Additionally, the ``CVE_CHECK_CVE_WHITELIST`` variable has been replaced
|
||||
by ``CVE_CHECK_WHITELIST`` (replaced by :term:`CVE_CHECK_IGNORE` in version 3.5).
|
||||
by ``CVE_CHECK_WHITELIST`` (replaced by :term:`CVE_CHECK_IGNORE` in version 4.0).
|
||||
|
||||
.. _migration-3.0-bitbake-changes:
|
||||
|
||||
|
||||
@@ -252,8 +252,8 @@ Miscellaneous
|
||||
|
||||
- The previously deprecated ``COMPRESS_CMD`` and
|
||||
``CVE_CHECK_CVE_WHITELIST`` variables have been removed. Use
|
||||
``CONVERSION_CMD`` and ``CVE_CHECK_WHITELIST`` (replaced by
|
||||
:term:`CVE_CHECK_IGNORE` in version 3.5) respectively
|
||||
:term:`CONVERSION_CMD` and ``CVE_CHECK_WHITELIST`` (replaced by
|
||||
:term:`CVE_CHECK_IGNORE` in version 4.0) respectively
|
||||
instead.
|
||||
|
||||
- The obsolete ``oe_machinstall`` function previously provided in the
|
||||
|
||||
@@ -21,3 +21,4 @@ Release 4.0 (kirkstone)
|
||||
release-notes-4.0.12
|
||||
release-notes-4.0.13
|
||||
release-notes-4.0.14
|
||||
release-notes-4.0.15
|
||||
|
||||
189
documentation/migration-guides/release-notes-4.0.15.rst
Normal file
189
documentation/migration-guides/release-notes-4.0.15.rst
Normal file
@@ -0,0 +1,189 @@
|
||||
.. SPDX-License-Identifier: CC-BY-SA-2.0-UK
|
||||
|
||||
Release notes for Yocto-4.0.15 (Kirkstone)
|
||||
------------------------------------------
|
||||
|
||||
Security Fixes in Yocto-4.0.15
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- avahi: Fix :cve:`2023-1981`, :cve:`2023-38469`, :cve:`2023-38470`, :cve:`2023-38471`, :cve:`2023-38472` and :cve:`2023-38473`
|
||||
- binutils: Fix :cve:`2022-47007`, :cve:`2022-47010` and :cve:`2022-48064`
|
||||
- bluez5: Fix :cve:`2023-45866`
|
||||
- ghostscript: Ignore GhostPCL :cve:`2023-38560`
|
||||
- gnutls: Fix :cve:`2023-5981`
|
||||
- go: Ignore :cve:`2023-45283` and :cve:`2023-45284`
|
||||
- grub: Fix :cve:`2023-4692` and :cve:`2023-4693`
|
||||
- gstreamer1.0-plugins-bad: Fix :cve_mitre:`2023-44429`
|
||||
- libsndfile: Fix :cve:`2022-33065`
|
||||
- libwebp: Fix :cve:`2023-4863`
|
||||
- openssl: Fix :cve:`2023-5678`
|
||||
- python3-cryptography: Fix :cve:`2023-49083`
|
||||
- qemu: Fix :cve:`2023-1544`
|
||||
- sudo: :cve:`2023-42456` and :cve_mitre:`2023-42465`
|
||||
- tiff: Fix :cve:`2023-41175`
|
||||
- vim: Fix :cve:`2023-46246`, :cve:`2023-48231`, :cve:`2023-48232`, :cve:`2023-48233`, :cve:`2023-48234`, :cve:`2023-48235`, :cve:`2023-48236`, :cve:`2023-48237` and :cve:`2023-48706`
|
||||
- xserver-xorg: Fix :cve:`2023-5367` and :cve:`2023-5380`
|
||||
- xwayland: Fix :cve:`2023-5367`
|
||||
|
||||
|
||||
Fixes in Yocto-4.0.15
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- bash: changes to SIGINT handler while waiting for a child
|
||||
- bitbake: Fix disk space monitoring on cephfs
|
||||
- bitbake: bitbake-getvar: Make --quiet work with --recipe
|
||||
- bitbake: runqueue.py: fix PSI check logic
|
||||
- bitbake: runqueue: Add pressure change logging
|
||||
- bitbake: runqueue: convert deferral messages from bb.note to bb.debug
|
||||
- bitbake: runqueue: fix PSI check calculation
|
||||
- bitbake: runqueue: show more pressure data
|
||||
- bitbake: runqueue: show number of currently running bitbake threads when pressure changes
|
||||
- bitbake: tinfoil: Do not fail when logging is disabled and full config is used
|
||||
- build-appliance-image: Update to kirkstone head revision
|
||||
- cve-check: don't warn if a patch is remote
|
||||
- cve-check: slightly more verbose warning when adding the same package twice
|
||||
- cve-check: sort the package list in the JSON report
|
||||
- cve-exclusion_5.10.inc: update for 5.10.202
|
||||
- go: Fix issue in DNS resolver
|
||||
- goarch: Move Go architecture mapping to a library
|
||||
- gstreamer1.0-plugins-base: enable glx/opengl support
|
||||
- linux-yocto/5.10: update to v5.10.202
|
||||
- manuals: update class references
|
||||
- migration-guide: add release notes for 4.0.14
|
||||
- native: Clear TUNE_FEATURES/ABIEXTENSION
|
||||
- openssh: drop sudo from ptest dependencies
|
||||
- overview-manual: concepts: Add Bitbake Tasks Map
|
||||
- poky.conf: bump version for 4.0.15
|
||||
- python3-jinja2: Fixed ptest result output as per the standard
|
||||
- ref-manual: classes: explain cml1 class name
|
||||
- ref-manual: update :term:`SDK_NAME` variable documentation
|
||||
- ref-manual: variables: add :term:`RECIPE_MAINTAINER`
|
||||
- ref-manual: variables: document OEQA_REPRODUCIBLE_* variables
|
||||
- ref-manual: variables: mention new CDN for :term:`SSTATE_MIRRORS`
|
||||
- rust-common: Set llvm-target correctly for cross SDK targets
|
||||
- rust-cross-canadian: Fix ordering of target json config generation
|
||||
- rust-cross/rust-common: Merge arm target handling code to fix cross-canadian
|
||||
- rust-cross: Simplfy the rust_gen_target calls
|
||||
- rust-llvm: Allow overriding LLVM target archs
|
||||
- sdk-manual: extensible.rst: remove instructions for using SDK functionality directly in a yocto build
|
||||
- sudo: upgrade to 1.9.15p2
|
||||
- systemtap_git: fix used uninitialized error
|
||||
- vim: Improve locale handling
|
||||
- vim: Upgrade to 9.0.2130
|
||||
- vim: use upstream generated .po files
|
||||
|
||||
|
||||
Known Issues in Yocto-4.0.15
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- N/A
|
||||
|
||||
|
||||
Contributors to Yocto-4.0.15
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- Alexander Kanavin
|
||||
- Archana Polampalli
|
||||
- BELHADJ SALEM Talel
|
||||
- Bruce Ashfield
|
||||
- Chaitanya Vadrevu
|
||||
- Chen Qi
|
||||
- Deepthi Hemraj
|
||||
- Denys Dmytriyenko
|
||||
- Hitendra Prajapati
|
||||
- Lee Chee Yang
|
||||
- Li Wang
|
||||
- Martin Jansa
|
||||
- Meenali Gupta
|
||||
- Michael Opdenacker
|
||||
- Mikko Rapeli
|
||||
- Narpat Mali
|
||||
- Niko Mauno
|
||||
- Ninad Palsule
|
||||
- Niranjan Pradhan
|
||||
- Paul Eggleton
|
||||
- Peter Kjellerstedt
|
||||
- Peter Marko
|
||||
- Richard Purdie
|
||||
- Ross Burton
|
||||
- Samantha Jalabert
|
||||
- Sanjana
|
||||
- Soumya Sambu
|
||||
- Steve Sakoman
|
||||
- Tim Orling
|
||||
- Vijay Anusuri
|
||||
- Vivek Kumbhar
|
||||
- Wenlin Kang
|
||||
- Yogita Urade
|
||||
|
||||
|
||||
Repositories / Downloads for Yocto-4.0.15
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
poky
|
||||
|
||||
- Repository Location: :yocto_git:`/poky`
|
||||
- Branch: :yocto_git:`kirkstone </poky/log/?h=kirkstone>`
|
||||
- Tag: :yocto_git:`yocto-4.0.15 </poky/log/?h=yocto-4.0.15>`
|
||||
- Git Revision: :yocto_git:`755632c2fcab43aa05cdcfa529727064b045073c </poky/commit/?id=755632c2fcab43aa05cdcfa529727064b045073c>`
|
||||
- Release Artefact: poky-755632c2fcab43aa05cdcfa529727064b045073c
|
||||
- sha: b40b43bd270d21a420c399981f9cfe0eb999f15e051fc2c89d124f249cdc0bd5
|
||||
- Download Locations:
|
||||
http://downloads.yoctoproject.org/releases/yocto/yocto-4.0.15/poky-755632c2fcab43aa05cdcfa529727064b045073c.tar.bz2
|
||||
http://mirrors.kernel.org/yocto/yocto/yocto-4.0.15/poky-755632c2fcab43aa05cdcfa529727064b045073c.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.15 </openembedded-core/log/?h=yocto-4.0.15>`
|
||||
- Git Revision: :oe_git:`eea685e1caafd8e8121006d3f8b5d0b8a4f2a933 </openembedded-core/commit/?id=eea685e1caafd8e8121006d3f8b5d0b8a4f2a933>`
|
||||
- Release Artefact: oecore-eea685e1caafd8e8121006d3f8b5d0b8a4f2a933
|
||||
- sha: ddc3d4a2c8a097f2aa7132ae716affacc44b119c616a1eeffb7db56caa7fc79e
|
||||
- Download Locations:
|
||||
http://downloads.yoctoproject.org/releases/yocto/yocto-4.0.15/oecore-eea685e1caafd8e8121006d3f8b5d0b8a4f2a933.tar.bz2
|
||||
http://mirrors.kernel.org/yocto/yocto/yocto-4.0.15/oecore-eea685e1caafd8e8121006d3f8b5d0b8a4f2a933.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.15 </meta-mingw/log/?h=yocto-4.0.15>`
|
||||
- Git Revision: :yocto_git:`f6b38ce3c90e1600d41c2ebb41e152936a0357d7 </meta-mingw/commit/?id=f6b38ce3c90e1600d41c2ebb41e152936a0357d7>`
|
||||
- Release Artefact: meta-mingw-f6b38ce3c90e1600d41c2ebb41e152936a0357d7
|
||||
- sha: 7d57167c19077f4ab95623d55a24c2267a3a3fb5ed83688659b4c03586373b25
|
||||
- Download Locations:
|
||||
http://downloads.yoctoproject.org/releases/yocto/yocto-4.0.15/meta-mingw-f6b38ce3c90e1600d41c2ebb41e152936a0357d7.tar.bz2
|
||||
http://mirrors.kernel.org/yocto/yocto/yocto-4.0.15/meta-mingw-f6b38ce3c90e1600d41c2ebb41e152936a0357d7.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.15 </meta-gplv2/log/?h=yocto-4.0.15>`
|
||||
- Git Revision: :yocto_git:`d2f8b5cdb285b72a4ed93450f6703ca27aa42e8a </meta-gplv2/commit/?id=d2f8b5cdb285b72a4ed93450f6703ca27aa42e8a>`
|
||||
- Release Artefact: meta-gplv2-d2f8b5cdb285b72a4ed93450f6703ca27aa42e8a
|
||||
- sha: c386f59f8a672747dc3d0be1d4234b6039273d0e57933eb87caa20f56b9cca6d
|
||||
- Download Locations:
|
||||
http://downloads.yoctoproject.org/releases/yocto/yocto-4.0.15/meta-gplv2-d2f8b5cdb285b72a4ed93450f6703ca27aa42e8a.tar.bz2
|
||||
http://mirrors.kernel.org/yocto/yocto/yocto-4.0.15/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.15 </bitbake/log/?h=yocto-4.0.15>`
|
||||
- Git Revision: :oe_git:`42a1c9fe698a03feb34c5bba223c6e6e0350925b </bitbake/commit/?id=42a1c9fe698a03feb34c5bba223c6e6e0350925b>`
|
||||
- Release Artefact: bitbake-42a1c9fe698a03feb34c5bba223c6e6e0350925b
|
||||
- sha: 64c684ccd661fa13e25c859dfc68d66bec79281da0f4f81b0d6a9995acb659b5
|
||||
- Download Locations:
|
||||
http://downloads.yoctoproject.org/releases/yocto/yocto-4.0.15/bitbake-42a1c9fe698a03feb34c5bba223c6e6e0350925b.tar.bz2
|
||||
http://mirrors.kernel.org/yocto/yocto/yocto-4.0.15/bitbake-42a1c9fe698a03feb34c5bba223c6e6e0350925b.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.15 </yocto-docs/log/?h=yocto-4.0.15>`
|
||||
- Git Revision: :yocto_git:`08fda7a5601393617b1ecfe89229459e14a90b1d </yocto-docs/commit/?id=08fda7a5601393617b1ecfe89229459e14a90b1d>`
|
||||
|
||||
@@ -132,6 +132,14 @@ are several ways of working in the Yocto Project environment:
|
||||
Toaster and on how to use Toaster in general, see the
|
||||
:doc:`/toaster-manual/index`.
|
||||
|
||||
- *Using the VSCode Extension:* You can use the `Yocto Project BitBake
|
||||
<https://marketplace.visualstudio.com/items?itemName=yocto-project.yocto-bitbake>`__
|
||||
extension for Visual Studio Code to start your BitBake builds through a
|
||||
graphical user interface.
|
||||
|
||||
Learn more about the VSCode Extension on the `extension's marketplace page
|
||||
<https://marketplace.visualstudio.com/items?itemName=yocto-project.yocto-bitbake>`__.
|
||||
|
||||
Yocto Project Source Repositories
|
||||
=================================
|
||||
|
||||
|
||||
@@ -340,6 +340,18 @@ the Yocto Project:
|
||||
view information about builds. For information on Toaster, see the
|
||||
:doc:`/toaster-manual/index`.
|
||||
|
||||
- *VSCode IDE Extension:* The `Yocto Project BitBake
|
||||
<https://marketplace.visualstudio.com/items?itemName=yocto-project.yocto-bitbake>`__
|
||||
extension for Visual Studio Code provides a rich set of features for working
|
||||
with BitBake recipes. The extension provides syntax highlighting,
|
||||
hover tips, and completion for BitBake files as well as embedded Python and
|
||||
Bash languages. Additional views and commands allow you to efficiently
|
||||
browse, build and edit recipes. It also provides SDK integration for
|
||||
cross-compiling and debugging through ``devtool``.
|
||||
|
||||
Learn more about the VSCode Extension on the `extension's frontpage
|
||||
<https://marketplace.visualstudio.com/items?itemName=yocto-project.yocto-bitbake>`__.
|
||||
|
||||
Production Tools
|
||||
----------------
|
||||
|
||||
@@ -610,6 +622,14 @@ Build Host runs, you have several choices.
|
||||
For information about and how to use Toaster, see the
|
||||
:doc:`/toaster-manual/index`.
|
||||
|
||||
- *Using the VSCode Extension:* You can use the `Yocto Project BitBake
|
||||
<https://marketplace.visualstudio.com/items?itemName=yocto-project.yocto-bitbake>`__
|
||||
extension for Visual Studio Code to start your BitBake builds through a
|
||||
graphical user interface.
|
||||
|
||||
Learn more about the VSCode Extension on the `extension's marketplace page
|
||||
<https://marketplace.visualstudio.com/items?itemName=yocto-project.yocto-bitbake>`__
|
||||
|
||||
Reference Embedded Distribution (Poky)
|
||||
======================================
|
||||
|
||||
|
||||
@@ -1462,16 +1462,6 @@ Here are the tests you can list with the :term:`WARN_QA` and
|
||||
automatically get these versions. Consequently, you should only need
|
||||
to explicitly add dependencies to binary driver recipes.
|
||||
|
||||
.. _ref-classes-insserv:
|
||||
|
||||
``insserv``
|
||||
===========
|
||||
|
||||
The :ref:`ref-classes-insserv` class uses the ``insserv`` utility to update the order
|
||||
of symbolic links in ``/etc/rc?.d/`` within an image based on
|
||||
dependencies specified by LSB headers in the ``init.d`` scripts
|
||||
themselves.
|
||||
|
||||
.. _ref-classes-kernel:
|
||||
|
||||
``kernel``
|
||||
@@ -3141,7 +3131,7 @@ The :ref:`ref-classes-uboot-config` class provides support for U-Boot configurat
|
||||
a machine. Specify the machine in your recipe as follows::
|
||||
|
||||
UBOOT_CONFIG ??= <default>
|
||||
UBOOT_CONFIG[foo] = "config,images"
|
||||
UBOOT_CONFIG[foo] = "config,images,binary"
|
||||
|
||||
You can also specify the machine using this method::
|
||||
|
||||
|
||||
@@ -63,26 +63,28 @@ and announcements. To subscribe to one of the following mailing lists,
|
||||
click on the appropriate URL in the following list and follow the
|
||||
instructions:
|
||||
|
||||
- :yocto_lists:`/g/yocto` - General Yocto Project
|
||||
- :yocto_lists:`/g/yocto` --- general Yocto Project
|
||||
discussion mailing list.
|
||||
|
||||
- :oe_lists:`/g/openembedded-core` - Discussion mailing
|
||||
- :oe_lists:`/g/openembedded-core` --- discussion mailing
|
||||
list about OpenEmbedded-Core (the core metadata).
|
||||
|
||||
- :oe_lists:`/g/openembedded-devel` - Discussion
|
||||
- :oe_lists:`/g/openembedded-devel` --- discussion
|
||||
mailing list about OpenEmbedded.
|
||||
|
||||
- :oe_lists:`/g/bitbake-devel` - Discussion mailing
|
||||
- :oe_lists:`/g/bitbake-devel` --- discussion mailing
|
||||
list about the :term:`BitBake` build tool.
|
||||
|
||||
- :yocto_lists:`/g/poky` - Discussion mailing list
|
||||
- :yocto_lists:`/g/poky` --- discussion mailing list
|
||||
about :term:`Poky`.
|
||||
|
||||
- :yocto_lists:`/g/yocto-announce` - Mailing list to
|
||||
- :yocto_lists:`/g/yocto-announce` --- mailing list to
|
||||
receive official Yocto Project release and milestone announcements.
|
||||
|
||||
For more Yocto Project-related mailing lists, see the
|
||||
:yocto_home:`Yocto Project Website <>`.
|
||||
- :yocto_lists:`/g/docs` --- discussion mailing list about the Yocto Project
|
||||
documentation.
|
||||
|
||||
See also :yocto_home:`the description of all mailing lists </community/mailing-lists/>`.
|
||||
|
||||
.. _resources-irc:
|
||||
|
||||
@@ -103,93 +105,96 @@ Links and Related Documentation
|
||||
|
||||
Here is a list of resources you might find helpful:
|
||||
|
||||
- :yocto_home:`The Yocto Project Website <>`\ *:* The home site
|
||||
- :yocto_home:`The Yocto Project Website <>`: The home site
|
||||
for the Yocto Project.
|
||||
|
||||
- :yocto_wiki:`The Yocto Project Main Wiki Page <>`\ *:* The main wiki page for
|
||||
- :yocto_wiki:`The Yocto Project Main Wiki Page <>`: The main wiki page for
|
||||
the Yocto Project. This page contains information about project
|
||||
planning, release engineering, QA & automation, a reference site map,
|
||||
and other resources related to the Yocto Project.
|
||||
|
||||
- :oe_home:`OpenEmbedded <>`\ *:* The build system used by the
|
||||
- :oe_home:`OpenEmbedded <>`: The build system used by the
|
||||
Yocto Project. This project is the upstream, generic, embedded
|
||||
distribution from which the Yocto Project derives its build system
|
||||
(Poky) and to which it contributes.
|
||||
|
||||
- :oe_wiki:`BitBake </BitBake>`\ *:* The tool used to process metadata.
|
||||
- :oe_wiki:`BitBake </BitBake>`: The tool used to process metadata.
|
||||
|
||||
- :doc:`BitBake User Manual <bitbake:index>`\ *:* A comprehensive
|
||||
- :doc:`BitBake User Manual <bitbake:index>`: A comprehensive
|
||||
guide to the BitBake tool. If you want information on BitBake, see
|
||||
this manual.
|
||||
|
||||
- :doc:`/brief-yoctoprojectqs/index` *:* This
|
||||
- :doc:`/brief-yoctoprojectqs/index`: This
|
||||
short document lets you experience building an image using the Yocto
|
||||
Project without having to understand any concepts or details.
|
||||
|
||||
- :doc:`/overview-manual/index` *:* This manual provides overview
|
||||
- :doc:`/overview-manual/index`: This manual provides overview
|
||||
and conceptual information about the Yocto Project.
|
||||
|
||||
- :doc:`/dev-manual/index` *:* This manual is a "how-to" guide
|
||||
- :doc:`/dev-manual/index`: This manual is a "how-to" guide
|
||||
that presents procedures useful to both application and system
|
||||
developers who use the Yocto Project.
|
||||
|
||||
- :doc:`/sdk-manual/index` *manual :* This
|
||||
- :doc:`/sdk-manual/index` manual: This
|
||||
guide provides information that lets you get going with the standard
|
||||
or extensible SDK. An SDK, with its cross-development toolchains,
|
||||
allows you to develop projects inside or outside of the Yocto Project
|
||||
environment.
|
||||
|
||||
- :doc:`/bsp-guide/bsp` *:* This guide defines the structure
|
||||
- :doc:`/bsp-guide/bsp`: This guide defines the structure
|
||||
for BSP components. Having a commonly understood structure encourages
|
||||
standardization.
|
||||
|
||||
- :doc:`/kernel-dev/index` *:* This manual describes
|
||||
- :doc:`/kernel-dev/index`: This manual describes
|
||||
how to work with Linux Yocto kernels as well as provides a bit of
|
||||
conceptual information on the construction of the Yocto Linux kernel
|
||||
tree.
|
||||
|
||||
- :doc:`/ref-manual/index` *:* This
|
||||
- :doc:`/ref-manual/index`: This
|
||||
manual provides reference material such as variable, task, and class
|
||||
descriptions.
|
||||
|
||||
- :yocto_docs:`Yocto Project Mega-Manual </singleindex.html>`\ *:* This manual
|
||||
- :yocto_docs:`Yocto Project Mega-Manual </singleindex.html>`: This manual
|
||||
is simply a single HTML file comprised of the bulk of the Yocto
|
||||
Project manuals. It makes it easy to search for phrases and terms used
|
||||
in the Yocto Project documentation set.
|
||||
|
||||
- :doc:`/profile-manual/index` *:* This manual presents a set of
|
||||
- :doc:`/profile-manual/index`: This manual presents a set of
|
||||
common and generally useful tracing and profiling schemes along with
|
||||
their applications (as appropriate) to each tool.
|
||||
|
||||
- :doc:`/toaster-manual/index` *:* This manual
|
||||
- :doc:`/toaster-manual/index`: This manual
|
||||
introduces and describes how to set up and use Toaster. Toaster is an
|
||||
Application Programming Interface (API) and web-based interface to
|
||||
the :term:`OpenEmbedded Build System`, which uses
|
||||
BitBake, that reports build information.
|
||||
|
||||
- :yocto_wiki:`FAQ </FAQ>`\ *:* A list of commonly asked
|
||||
- `Yocto Project BitBake extension for VSCode
|
||||
<https://marketplace.visualstudio.com/items?itemName=yocto-project.yocto-bitbake>`__:
|
||||
This extension provides a rich feature set when working with BitBake recipes
|
||||
within the Visual Studio Code IDE.
|
||||
|
||||
- :yocto_wiki:`FAQ </FAQ>`: A list of commonly asked
|
||||
questions and their answers.
|
||||
|
||||
- *Release Notes:* Features, updates and known issues for the current
|
||||
release of the Yocto Project. To access the Release Notes, go to the
|
||||
:yocto_home:`Downloads </software-overview/downloads>` page on
|
||||
the Yocto Project website and click on the "RELEASE INFORMATION" link
|
||||
for the appropriate release.
|
||||
- :doc:`Release Information </migration-guides/index>`:
|
||||
Migration guides, release notes, new features, updates and known issues
|
||||
for the current and past releases of the Yocto Project.
|
||||
|
||||
- :yocto_bugs:`Bugzilla <>`\ *:* The bug tracking application
|
||||
- :yocto_bugs:`Bugzilla <>`: The bug tracking application
|
||||
the Yocto Project uses. If you find problems with the Yocto Project,
|
||||
you should report them using this application.
|
||||
|
||||
- :yocto_wiki:`Bugzilla Configuration and Bug Tracking Wiki Page
|
||||
</Bugzilla_Configuration_and_Bug_Tracking>`\ *:*
|
||||
</Bugzilla_Configuration_and_Bug_Tracking>`:
|
||||
Information on how to get set up and use the Yocto Project
|
||||
implementation of Bugzilla for logging and tracking Yocto Project
|
||||
defects.
|
||||
|
||||
- *Internet Relay Chat (IRC):* Two IRC channels on
|
||||
- Internet Relay Chat (IRC): Two IRC channels on
|
||||
`Libera Chat <https://libera.chat/>`__ are
|
||||
available for Yocto Project and OpenEmbeddded discussions: ``#yocto`` and
|
||||
``#oe``, respectively.
|
||||
|
||||
- `Quick EMUlator (QEMU) <https://wiki.qemu.org/Index.html>`__\ *:* An
|
||||
- `Quick EMUlator (QEMU) <https://wiki.qemu.org/Index.html>`__: An
|
||||
open-source machine emulator and virtualizer.
|
||||
|
||||
@@ -404,15 +404,15 @@
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1846"
|
||||
inkscape:window-height="1016"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1043"
|
||||
id="namedview4"
|
||||
showgrid="true"
|
||||
inkscape:zoom="0.51166405"
|
||||
inkscape:cx="-43.974166"
|
||||
inkscape:cy="311.72798"
|
||||
inkscape:window-x="1994"
|
||||
inkscape:window-y="27"
|
||||
inkscape:zoom="1.4472045"
|
||||
inkscape:cx="736.24703"
|
||||
inkscape:cy="312.32629"
|
||||
inkscape:window-x="1728"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="g10"
|
||||
inkscape:document-rotation="0"
|
||||
@@ -669,28 +669,28 @@
|
||||
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>
|
||||
<g
|
||||
id="g32107">
|
||||
id="g1379">
|
||||
<rect
|
||||
style="opacity:0.75;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"
|
||||
width="140.00014"
|
||||
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-38"
|
||||
width="140.00003"
|
||||
height="45.000004"
|
||||
x="1199.9999"
|
||||
y="-229.99998"
|
||||
x="1220"
|
||||
y="-230.00005"
|
||||
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="1247.2329"
|
||||
x="1269.2329"
|
||||
y="-210.32925"
|
||||
id="text1185-3-55-4-0-0-0-1-1"><tspan
|
||||
sodipodi:role="line"
|
||||
x="1247.2329"
|
||||
x="1269.2329"
|
||||
y="-210.32925"
|
||||
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">Nanbield</tspan><tspan
|
||||
sodipodi:role="line"
|
||||
x="1247.2329"
|
||||
x="1269.2329"
|
||||
y="-192.33258"
|
||||
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">4.3</tspan></text>
|
||||
|
||||
|
Before Width: | Height: | Size: 106 KiB After Width: | Height: | Size: 106 KiB |
@@ -41,20 +41,17 @@ supported on the following distributions:
|
||||
|
||||
- Ubuntu 22.04 (LTS)
|
||||
|
||||
- Fedora 37
|
||||
- Fedora 38
|
||||
|
||||
- Debian GNU/Linux 11.x (Bullseye)
|
||||
|
||||
- AlmaLinux 8.8
|
||||
- AlmaLinux 8
|
||||
|
||||
The following distribution versions are still tested (being listed
|
||||
in :term:`SANITY_TESTED_DISTROS`), even though the organizations
|
||||
publishing them no longer make updates publicly available:
|
||||
The following distribution versions are still tested, even though the
|
||||
organizations publishing them no longer make updates publicly available:
|
||||
|
||||
- Ubuntu 18.04 (LTS)
|
||||
|
||||
- OpenSUSE Leap 15.3
|
||||
|
||||
Note that the Yocto Project doesn't have access to private updates
|
||||
that some of these versions may have. Therefore, our testing has
|
||||
limited value if you have access to such updates.
|
||||
@@ -72,18 +69,18 @@ tested on former revisions of "&DISTRO_NAME;", but no longer are:
|
||||
|
||||
- Fedora 36
|
||||
|
||||
- Fedora 37
|
||||
|
||||
- CentOS 7.x
|
||||
|
||||
- CentOS 8.x
|
||||
|
||||
- AlmaLinux 8.5
|
||||
|
||||
- AlmaLinux 8.7
|
||||
|
||||
- Debian GNU/Linux 9.x (Stretch)
|
||||
|
||||
- Debian GNU/Linux 10.x (Buster)
|
||||
|
||||
- OpenSUSE Leap 15.3
|
||||
|
||||
.. note::
|
||||
|
||||
- While the Yocto Project Team attempts to ensure all Yocto Project
|
||||
|
||||
@@ -1342,6 +1342,19 @@ system and gives an overview of their function and contents.
|
||||
the recipe will be skipped, and if the build system attempts to build
|
||||
the recipe then an error will be triggered.
|
||||
|
||||
:term:`CONVERSION_CMD`
|
||||
This variable is used for storing image conversion commands.
|
||||
Image conversion can convert an image into different objects like:
|
||||
|
||||
- Compressed version of the image
|
||||
|
||||
- Checksums for the image
|
||||
|
||||
An example of :term:`CONVERSION_CMD` from :ref:`image-types
|
||||
<ref-classes-image_types>` class is::
|
||||
|
||||
CONVERSION_CMD:lzo = "lzop -9 ${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.${type}"
|
||||
|
||||
:term:`COPY_LIC_DIRS`
|
||||
If set to "1" along with the
|
||||
:term:`COPY_LIC_MANIFEST` variable, the
|
||||
@@ -5028,9 +5041,8 @@ system and gives an overview of their function and contents.
|
||||
:term:`PREMIRRORS`, the upstream source, and then
|
||||
locations specified by :term:`MIRRORS` in that order.
|
||||
|
||||
Assuming your distribution (:term:`DISTRO`) is "poky",
|
||||
the default value for :term:`MIRRORS` is defined in the
|
||||
``conf/distro/poky.conf`` file in the ``meta-poky`` Git repository.
|
||||
The default value for :term:`MIRRORS` is defined in the
|
||||
``meta/classes-global/mirrors.bbclass`` file in the core metadata layer.
|
||||
|
||||
:term:`MLPREFIX`
|
||||
Specifies a prefix has been added to :term:`PN` to create a
|
||||
@@ -6248,9 +6260,8 @@ system and gives an overview of their function and contents.
|
||||
source, and then locations specified by
|
||||
:term:`MIRRORS` in that order.
|
||||
|
||||
Assuming your distribution (:term:`DISTRO`) is "poky",
|
||||
the default value for :term:`PREMIRRORS` is defined in the
|
||||
``conf/distro/poky.conf`` file in the ``meta-poky`` Git repository.
|
||||
The default value for :term:`PREMIRRORS` is defined in the
|
||||
``meta/classes-global/mirrors.bbclass`` file in the core metadata layer.
|
||||
|
||||
Typically, you could add a specific server for the build system to
|
||||
attempt before any others by adding something like the following to
|
||||
@@ -8921,23 +8932,30 @@ system and gives an overview of their function and contents.
|
||||
See the machine include files in the :term:`Source Directory`
|
||||
for these features.
|
||||
|
||||
:term:`UBOOT_BINARY`
|
||||
Specifies the name of the binary build by U-Boot.
|
||||
|
||||
:term:`UBOOT_CONFIG`
|
||||
Configures the :term:`UBOOT_MACHINE` and can
|
||||
also define :term:`IMAGE_FSTYPES` for individual
|
||||
cases.
|
||||
Configures one or more U-Boot configurations to build. Each
|
||||
configuration can define the :term:`UBOOT_MACHINE` and optionally the
|
||||
:term:`IMAGE_FSTYPES` and the :term:`UBOOT_BINARY`.
|
||||
|
||||
Following is an example from the ``meta-fsl-arm`` layer. ::
|
||||
Following is an example from the ``meta-freescale`` layer. ::
|
||||
|
||||
UBOOT_CONFIG ??= "sd"
|
||||
UBOOT_CONFIG[sd] = "mx6qsabreauto_config,sdcard"
|
||||
UBOOT_CONFIG[eimnor] = "mx6qsabreauto_eimnor_config"
|
||||
UBOOT_CONFIG[nand] = "mx6qsabreauto_nand_config,ubifs"
|
||||
UBOOT_CONFIG[spinor] = "mx6qsabreauto_spinor_config"
|
||||
UBOOT_CONFIG ??= "sdcard-ifc-secure-boot sdcard-ifc sdcard-qspi lpuart qspi secure-boot nor"
|
||||
UBOOT_CONFIG[nor] = "ls1021atwr_nor_defconfig"
|
||||
UBOOT_CONFIG[sdcard-ifc] = "ls1021atwr_sdcard_ifc_defconfig,,u-boot-with-spl-pbl.bin"
|
||||
UBOOT_CONFIG[sdcard-qspi] = "ls1021atwr_sdcard_qspi_defconfig,,u-boot-with-spl-pbl.bin"
|
||||
UBOOT_CONFIG[lpuart] = "ls1021atwr_nor_lpuart_defconfig"
|
||||
UBOOT_CONFIG[qspi] = "ls1021atwr_qspi_defconfig"
|
||||
UBOOT_CONFIG[secure-boot] = "ls1021atwr_nor_SECURE_BOOT_defconfig"
|
||||
UBOOT_CONFIG[sdcard-ifc-secure-boot] = "ls1021atwr_sdcard_ifc_SECURE_BOOT_defconfig,,u-boot-with-spl-pbl.bin"
|
||||
|
||||
In this example, "sd" is selected as the configuration of the possible four for the
|
||||
:term:`UBOOT_MACHINE`. The "sd" configuration defines
|
||||
"mx6qsabreauto_config" as the value for :term:`UBOOT_MACHINE`, while the
|
||||
"sdcard" specifies the :term:`IMAGE_FSTYPES` to use for the U-Boot image.
|
||||
In this example, all possible seven configurations are selected. Each
|
||||
configuration specifies "..._defconfig" as :term:`UBOOT_MACHINE`, and
|
||||
the "sd..." configurations define an individual name for
|
||||
:term:`UBOOT_BINARY`. No configuration defines a second parameter for
|
||||
:term:`IMAGE_FSTYPES` to use for the U-Boot image.
|
||||
|
||||
For more information on how the :term:`UBOOT_CONFIG` is handled, see the
|
||||
:ref:`uboot-config <ref-classes-uboot-config>`
|
||||
|
||||
@@ -14,15 +14,13 @@ release works as intended. All the project's testing infrastructure and
|
||||
processes are publicly visible and available so that the community can
|
||||
see what testing is being performed, how it's being done and the current
|
||||
status of the tests and the project at any given time. It is intended
|
||||
that Other organizations can leverage off the process and testing
|
||||
that other organizations can leverage off the process and testing
|
||||
environment used by the Yocto Project to create their own automated,
|
||||
production test environment, building upon the foundations from the
|
||||
project core.
|
||||
|
||||
Currently, the Yocto Project Test Environment Manual has no projected
|
||||
release date. This manual is a work-in-progress and is being initially
|
||||
loaded with information from the README files and notes from key
|
||||
engineers:
|
||||
This manual is a work-in-progress and is being initially loaded with
|
||||
information from the README files and notes from key engineers:
|
||||
|
||||
- *yocto-autobuilder2:* This
|
||||
:yocto_git:`README.md </yocto-autobuilder2/tree/README.md>`
|
||||
@@ -39,7 +37,7 @@ engineers:
|
||||
As a result, it can be used by any Continuous Improvement (CI) system
|
||||
to run builds, support getting the correct code revisions, configure
|
||||
builds and layers, run builds, and collect results. The code is
|
||||
independent of any CI system, which means the code can work `Buildbot <https://docs.buildbot.net/0.9.15.post1/>`__,
|
||||
independent of any CI system, which means the code can work `Buildbot <https://docs.buildbot.net/current/>`__,
|
||||
Jenkins, or others. This repository has a branch per release of the
|
||||
project defining the tests to run on a per release basis.
|
||||
|
||||
@@ -54,8 +52,8 @@ 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 <https://docs.buildbot.net/0.9.15.post1/>`__ (version 9) to
|
||||
drive its integration and testing. Buildbot Nine has a plug-in interface
|
||||
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
|
||||
@@ -93,8 +91,8 @@ the following types of tests:
|
||||
- *Build Testing:* Tests whether specific configurations build by
|
||||
varying :term:`MACHINE`,
|
||||
:term:`DISTRO`, other configuration
|
||||
options, and the specific target images being built (or world). Used
|
||||
to trigger builds of all the different test configurations on the
|
||||
options, and the specific target images being built (or ``world``). This is
|
||||
used to trigger builds of all the different test configurations on the
|
||||
Autobuilder. Builds usually cover many different targets for
|
||||
different architectures, machines, and distributions, as well as
|
||||
different configurations, such as different init systems. The
|
||||
@@ -121,7 +119,8 @@ the following types of tests:
|
||||
|
||||
$ bitbake image -c testsdkext
|
||||
|
||||
The tests utilize the :ref:`testsdkext <ref-classes-testsdk>` class and the ``do_testsdkext`` task.
|
||||
The tests use the :ref:`ref-classes-testsdk` class and the
|
||||
``do_testsdkext`` task.
|
||||
|
||||
- *Feature Testing:* Various scenario-based tests are run through the
|
||||
:ref:`OpenEmbedded Self test (oe-selftest) <ref-manual/release-process:Testing and Quality Assurance>`. We test oe-selftest on each of the main distributions
|
||||
@@ -131,8 +130,8 @@ the following types of tests:
|
||||
|
||||
$ bitbake image -c testimage
|
||||
|
||||
The tests utilize the :ref:`testimage* <ref-classes-testimage>`
|
||||
classes and the :ref:`ref-tasks-testimage` task.
|
||||
The tests use the :ref:`ref-classes-testimage`
|
||||
class and the :ref:`ref-tasks-testimage` task.
|
||||
|
||||
- *Layer Testing:* The Autobuilder has the possibility to test whether
|
||||
specific layers work with the test of the system. The layers tested
|
||||
@@ -151,7 +150,7 @@ the following types of tests:
|
||||
|
||||
$ bitbake image -c testsdk
|
||||
|
||||
The tests utilize the :ref:`testsdk <ref-classes-testsdk>` class and
|
||||
The tests use the :ref:`ref-classes-testsdk` class and
|
||||
the ``do_testsdk`` task.
|
||||
|
||||
- *Unit Testing:* Unit tests on various components of the system run
|
||||
@@ -179,7 +178,7 @@ Tests map into the codebase as follows:
|
||||
$ bitbake-selftest
|
||||
|
||||
To skip tests that access the Internet, use the ``BB_SKIP_NETTESTS``
|
||||
variable when running "bitbake-selftest" as follows::
|
||||
variable when running ``bitbake-selftest`` as follows::
|
||||
|
||||
$ BB_SKIP_NETTESTS=yes bitbake-selftest
|
||||
|
||||
@@ -191,31 +190,32 @@ Tests map into the codebase as follows:
|
||||
Use this option when you wish to skip tests that access the network,
|
||||
which are mostly necessary to test the fetcher modules. To specify
|
||||
individual test modules to run, append the test module name to the
|
||||
"bitbake-selftest" command. For example, to specify the tests for the
|
||||
bb.data.module, run::
|
||||
``bitbake-selftest`` command. For example, to specify the tests for
|
||||
``bb.tests.data.DataExpansions``, run::
|
||||
|
||||
$ bitbake-selftest bb.test.data.module
|
||||
$ bitbake-selftest bb.tests.data.DataExpansions
|
||||
|
||||
You can also specify individual tests by defining the full name and module
|
||||
plus the class path of the test, for example::
|
||||
|
||||
$ bitbake-selftest bb.tests.data.TestOverrides.test_one_override
|
||||
$ bitbake-selftest bb.tests.data.DataExpansions.test_one_var
|
||||
|
||||
The tests are based on `Python
|
||||
unittest <https://docs.python.org/3/library/unittest.html>`__.
|
||||
The tests are based on
|
||||
`Python unittest <https://docs.python.org/3/library/unittest.html>`__.
|
||||
|
||||
- *oe-selftest:*
|
||||
|
||||
- These tests use OE to test the workflows, which include testing
|
||||
specific features, behaviors of tasks, and API unit tests.
|
||||
|
||||
- The tests can take advantage of parallelism through the "-j"
|
||||
- The tests can take advantage of parallelism through the ``-j``
|
||||
option, which can specify a number of threads to spread the tests
|
||||
across. Note that all tests from a given class of tests will run
|
||||
in the same thread. To parallelize large numbers of tests you can
|
||||
split the class into multiple units.
|
||||
|
||||
- The tests are based on Python unittest.
|
||||
- The tests are based on
|
||||
`Python unittest <https://docs.python.org/3/library/unittest.html>`__.
|
||||
|
||||
- The code for the tests resides in
|
||||
``meta/lib/oeqa/selftest/cases/``.
|
||||
@@ -225,18 +225,18 @@ Tests map into the codebase as follows:
|
||||
$ oe-selftest -a
|
||||
|
||||
- To run a specific test, use the following command form where
|
||||
testname is the name of the specific test::
|
||||
``testname`` is the name of the specific test::
|
||||
|
||||
$ oe-selftest -r <testname>
|
||||
|
||||
For example, the following command would run the tinfoil
|
||||
getVar API test::
|
||||
For example, the following command would run the ``tinfoil``
|
||||
``getVar`` API test::
|
||||
|
||||
$ oe-selftest -r tinfoil.TinfoilTests.test_getvar
|
||||
|
||||
It is also possible to run a set
|
||||
of tests. For example the following command will run all of the
|
||||
tinfoil tests::
|
||||
``tinfoil`` tests::
|
||||
|
||||
$ oe-selftest -r tinfoil
|
||||
|
||||
@@ -271,7 +271,7 @@ Tests map into the codebase as follows:
|
||||
- These tests build an extended SDK (eSDK), install that eSDK, and
|
||||
run tests against the eSDK.
|
||||
|
||||
- The code for these tests resides in ``meta/lib/oeqa/esdk``.
|
||||
- The code for these tests resides in ``meta/lib/oeqa/sdkext/cases/``.
|
||||
|
||||
- To run the tests, use the following command form::
|
||||
|
||||
@@ -298,13 +298,13 @@ Tests map into the codebase as follows:
|
||||
Git repository.
|
||||
|
||||
Use the ``oe-build-perf-report`` command to generate text reports
|
||||
and HTML reports with graphs of the performance data. For
|
||||
examples, see
|
||||
:yocto_dl:`/releases/yocto/yocto-2.7/testresults/buildperf-centos7/perf-centos7.yoctoproject.org_warrior_20190414204758_0e39202.html`
|
||||
and HTML reports with graphs of the performance data. See
|
||||
:yocto_dl:`html </releases/yocto/yocto-4.3/testresults/buildperf-debian11/perf-debian11_nanbield_20231019191258_15b576c410.html>`
|
||||
and
|
||||
:yocto_dl:`/releases/yocto/yocto-2.7/testresults/buildperf-centos7/perf-centos7.yoctoproject.org_warrior_20190414204758_0e39202.txt`.
|
||||
:yocto_dl:`txt </releases/yocto/yocto-4.3/testresults/buildperf-debian11/perf-debian11_nanbield_20231019191258_15b576c410.txt>`
|
||||
examples.
|
||||
|
||||
- The tests are contained in ``lib/oeqa/buildperf/test_basic.py``.
|
||||
- The tests are contained in ``meta/lib/oeqa/buildperf/test_basic.py``.
|
||||
|
||||
Test Examples
|
||||
=============
|
||||
@@ -312,16 +312,14 @@ Test Examples
|
||||
This section provides example tests for each of the tests listed in the
|
||||
:ref:`test-manual/intro:How Tests Map to Areas of Code` section.
|
||||
|
||||
For oeqa tests, testcases for each area reside in the main test
|
||||
directory at ``meta/lib/oeqa/selftest/cases`` directory.
|
||||
- ``oe-selftest`` testcases reside in the ``meta/lib/oeqa/selftest/cases`` directory.
|
||||
|
||||
For oe-selftest. bitbake testcases reside in the ``lib/bb/tests/``
|
||||
directory.
|
||||
- ``bitbake-selftest`` testcases reside in the ``bitbake/lib/bb/tests/`` directory.
|
||||
|
||||
``bitbake-selftest``
|
||||
--------------------
|
||||
|
||||
A simple test example from ``lib/bb/tests/data.py`` is::
|
||||
A simple test example from ``bitbake/lib/bb/tests/data.py`` is::
|
||||
|
||||
class DataExpansions(unittest.TestCase):
|
||||
def setUp(self):
|
||||
@@ -334,21 +332,24 @@ A simple test example from ``lib/bb/tests/data.py`` is::
|
||||
val = self.d.expand("${foo}")
|
||||
self.assertEqual(str(val), "value_of_foo")
|
||||
|
||||
In this example, a ``DataExpansions`` class of tests is created,
|
||||
derived from standard python unittest. The class has a common ``setUp``
|
||||
function which is shared by all the tests in the class. A simple test is
|
||||
then added to test that when a variable is expanded, the correct value
|
||||
is found.
|
||||
In this example, a ``DataExpansions`` class of tests is created, derived from
|
||||
standard `Python unittest <https://docs.python.org/3/library/unittest.html>`__.
|
||||
The class has a common ``setUp`` function which is shared by all the tests in
|
||||
the class. A simple test is then added to test that when a variable is
|
||||
expanded, the correct value is found.
|
||||
|
||||
Bitbake selftests are straightforward python unittest. Refer to the
|
||||
Python unittest documentation for additional information on writing
|
||||
these tests at: https://docs.python.org/3/library/unittest.html.
|
||||
BitBake selftests are straightforward
|
||||
`Python unittest <https://docs.python.org/3/library/unittest.html>`__.
|
||||
Refer to the `Python unittest documentation
|
||||
<https://docs.python.org/3/library/unittest.html>`__ for additional information
|
||||
on writing such tests.
|
||||
|
||||
``oe-selftest``
|
||||
---------------
|
||||
|
||||
These tests are more complex due to the setup required behind the scenes
|
||||
for full builds. Rather than directly using Python's unittest, the code
|
||||
for full builds. Rather than directly using `Python unittest
|
||||
<https://docs.python.org/3/library/unittest.html>`__, the code
|
||||
wraps most of the standard objects. The tests can be simple, such as
|
||||
testing a command from within the OE build environment using the
|
||||
following example::
|
||||
@@ -385,14 +386,14 @@ so tests within a given test class should always run in the same build,
|
||||
while tests in different classes or modules may be split into different
|
||||
builds. There is no data store available for these tests since the tests
|
||||
launch the ``bitbake`` command and exist outside of its context. As a
|
||||
result, common bitbake library functions (bb.\*) are also unavailable.
|
||||
result, common BitBake library functions (``bb.\*``) are also unavailable.
|
||||
|
||||
``testimage``
|
||||
-------------
|
||||
|
||||
These tests are run once an image is up and running, either on target
|
||||
hardware or under QEMU. As a result, they are assumed to be running in a
|
||||
target image environment, as opposed to a host build environment. A
|
||||
target image environment, as opposed to in a host build environment. A
|
||||
simple example from ``meta/lib/oeqa/runtime/cases/python.py`` contains
|
||||
the following::
|
||||
|
||||
@@ -407,19 +408,19 @@ the following::
|
||||
|
||||
In this example, the ``OERuntimeTestCase`` class wraps
|
||||
``unittest.TestCase``. Within the test, ``self.target`` represents the
|
||||
target system, where commands can be run on it using the ``run()``
|
||||
target system, where commands can be run using the ``run()``
|
||||
method.
|
||||
|
||||
To ensure certain test or package dependencies are met, you can use the
|
||||
To ensure certain tests or package dependencies are met, you can use the
|
||||
``OETestDepends`` and ``OEHasPackage`` decorators. For example, the test
|
||||
in this example would only make sense if python3-core is installed in
|
||||
in this example would only make sense if ``python3-core`` is installed in
|
||||
the image.
|
||||
|
||||
``testsdk_ext``
|
||||
---------------
|
||||
|
||||
These tests are run against built extensible SDKs (eSDKs). The tests can
|
||||
assume that the eSDK environment has already been setup. An example from
|
||||
assume that the eSDK environment has already been set up. An example from
|
||||
``meta/lib/oeqa/sdk/cases/devtool.py`` contains the following::
|
||||
|
||||
class DevtoolTest(OESDKExtTestCase):
|
||||
@@ -466,9 +467,9 @@ following::
|
||||
output = self._run(cmd)
|
||||
self.assertEqual(output, "Hello, world\n")
|
||||
|
||||
In this example, if nativesdk-python3-core has been installed into the SDK, the code runs
|
||||
the python3 interpreter with a basic command to check it is working
|
||||
correctly. The test would only run if python3 is installed in the SDK.
|
||||
In this example, if ``nativesdk-python3-core`` has been installed into the SDK,
|
||||
the code runs the ``python3`` interpreter with a basic command to check it is
|
||||
working correctly. The test would only run if Python3 is installed in the SDK.
|
||||
|
||||
``oe-build-perf-test``
|
||||
----------------------
|
||||
@@ -512,9 +513,9 @@ an isolated directory.
|
||||
|
||||
**Running "cleansstate" is not permitted.**
|
||||
|
||||
This can delete files from SSTATE_DIR which would potentially break
|
||||
other builds running in parallel. If this is required, SSTATE_DIR must
|
||||
be set to an isolated directory. Alternatively, you can use the "-f"
|
||||
This can delete files from :term:`SSTATE_DIR` which would potentially break
|
||||
other builds running in parallel. If this is required, :term:`SSTATE_DIR` must
|
||||
be set to an isolated directory. Alternatively, you can use the ``-f``
|
||||
option with the ``bitbake`` command to "taint" tasks by changing the
|
||||
sstate checksums to ensure sstate cache items will not be reused.
|
||||
|
||||
|
||||
@@ -20,8 +20,8 @@ helps review and test patches and this is his testing tree).
|
||||
We have two broad categories of test builds, including "full" and
|
||||
"quick". On the Autobuilder, these can be seen as "a-quick" and
|
||||
"a-full", simply for ease of sorting in the UI. Use our Autobuilder
|
||||
console view to see where me manage most test-related items, available
|
||||
at: :yocto_ab:`/typhoon/#/console`.
|
||||
:yocto_ab:`console view </typhoon/#/console>` to see where we manage most
|
||||
test-related items.
|
||||
|
||||
Builds are triggered manually when the test branches are ready. The
|
||||
builds are monitored by the SWAT team. For additional information, see
|
||||
@@ -34,24 +34,21 @@ which the result was required.
|
||||
|
||||
The Autobuilder does build the ``master`` branch once daily for several
|
||||
reasons, in particular, to ensure the current ``master`` branch does
|
||||
build, but also to keep ``yocto-testresults``
|
||||
(:yocto_git:`/yocto-testresults/`),
|
||||
buildhistory
|
||||
(:yocto_git:`/poky-buildhistory/`), and
|
||||
our sstate up to date. On the weekend, there is a master-next build
|
||||
build, but also to keep (:yocto_git:`yocto-testresults </yocto-testresults/>`),
|
||||
(:yocto_git:`buildhistory </poky-buildhistory/>`), and
|
||||
our sstate up to date. On the weekend, there is a ``master-next`` build
|
||||
instead to ensure the test results are updated for the less frequently
|
||||
run targets.
|
||||
|
||||
Performance builds (buildperf-\* targets in the console) are triggered
|
||||
Performance builds (``buildperf-\*`` targets in the console) are triggered
|
||||
separately every six hours and automatically push their results to the
|
||||
buildstats repository at:
|
||||
:yocto_git:`/yocto-buildstats/`.
|
||||
:yocto_git:`buildstats </yocto-buildstats/>` repository.
|
||||
|
||||
The 'quick' targets have been selected to be the ones which catch the
|
||||
most failures or give the most valuable data. We run 'fast' ptests in
|
||||
The "quick" targets have been selected to be the ones which catch the
|
||||
most failures or give the most valuable data. We run "fast" ptests in
|
||||
this case for example but not the ones which take a long time. The quick
|
||||
target doesn't include \*-lsb builds for all architectures, some world
|
||||
builds and doesn't trigger performance tests or ltp testing. The full
|
||||
target doesn't include ``\*-lsb`` builds for all architectures, some ``world``
|
||||
builds and doesn't trigger performance tests or ``ltp`` testing. The full
|
||||
build includes all these things and is slower but more comprehensive.
|
||||
|
||||
Release Builds
|
||||
@@ -67,12 +64,12 @@ that in :ref:`test-manual/test-process:day to day development`, in that the
|
||||
a-full target of the Autobuilder is used but in addition the form is
|
||||
configured to generate and publish artifacts and the milestone number,
|
||||
version, release candidate number and other information is entered. The
|
||||
box to "generate an email to QA"is also checked.
|
||||
box to "generate an email to QA" is also checked.
|
||||
|
||||
When the build completes, an email is sent out using the send-qa-email
|
||||
script in the ``yocto-autobuilder-helper`` repository to the list of
|
||||
people configured for that release. Release builds are placed into a
|
||||
directory in https://autobuilder.yocto.io/pub/releases on the
|
||||
When the build completes, an email is sent out using the ``send-qa-email``
|
||||
script in the :yocto_git:`yocto-autobuilder-helper </yocto-autobuilder-helper>`
|
||||
repository to the list of people configured for that release. Release builds
|
||||
are placed into a directory in https://autobuilder.yocto.io/pub/releases on the
|
||||
Autobuilder which is included in the email. The process from here is
|
||||
more manual and control is effectively passed to release engineering.
|
||||
The next steps include:
|
||||
@@ -80,14 +77,15 @@ The next steps include:
|
||||
- QA teams respond to the email saying which tests they plan to run and
|
||||
when the results will be available.
|
||||
|
||||
- QA teams run their tests and share their results in the yocto-
|
||||
testresults-contrib repository, along with a summary of their
|
||||
findings.
|
||||
- QA teams run their tests and share their results in the
|
||||
:yocto_git:`yocto-testresults-contrib </yocto-testresults-contrib>`
|
||||
repository, along with a summary of their findings.
|
||||
|
||||
- Release engineering prepare the release as per their process.
|
||||
|
||||
- Test results from the QA teams are included into the release in
|
||||
separate directories and also uploaded to the yocto-testresults
|
||||
separate directories and also uploaded to the
|
||||
:yocto_git:`yocto-testresults </yocto-testresults>`
|
||||
repository alongside the other test results for the given revision.
|
||||
|
||||
- The QA report in the final release is regenerated using resulttool to
|
||||
|
||||
@@ -9,8 +9,8 @@ Execution Flow within the Autobuilder
|
||||
|
||||
The "a-full" and "a-quick" targets are the usual entry points into the
|
||||
Autobuilder and it makes sense to follow the process through the system
|
||||
starting there. This is best visualized from the Autobuilder Console
|
||||
view (:yocto_ab:`/typhoon/#/console`).
|
||||
starting there. This is best visualized from the :yocto_ab:`Autobuilder
|
||||
Console view </typhoon/#/console>`.
|
||||
|
||||
Each item along the top of that view represents some "target build" and
|
||||
these targets are all run in parallel. The 'full' build will trigger the
|
||||
@@ -18,9 +18,9 @@ majority of them, the "quick" build will trigger some subset of them.
|
||||
The Autobuilder effectively runs whichever configuration is defined for
|
||||
each of those targets on a separate buildbot worker. To understand the
|
||||
configuration, you need to look at the entry on ``config.json`` file
|
||||
within the ``yocto-autobuilder-helper`` repository. The targets are
|
||||
defined in the ‘overrides' section, a quick example could be qemux86-64
|
||||
which looks like::
|
||||
within the :yocto_git:`yocto-autobuilder-helper </yocto-autobuilder-helper>`
|
||||
repository. The targets are defined in the ``overrides`` section, a quick
|
||||
example could be ``qemux86-64`` which looks like::
|
||||
|
||||
"qemux86-64" : {
|
||||
"MACHINE" : "qemux86-64",
|
||||
@@ -32,8 +32,8 @@ which looks like::
|
||||
}
|
||||
},
|
||||
|
||||
And to expand that, you need the "arch-qemu" entry from
|
||||
the "templates" section, which looks like::
|
||||
And to expand that, you need the ``arch-qemu`` entry from
|
||||
the ``templates`` section, which looks like::
|
||||
|
||||
"arch-qemu" : {
|
||||
"BUILDINFO" : true,
|
||||
@@ -54,11 +54,11 @@ the "templates" section, which looks like::
|
||||
}
|
||||
},
|
||||
|
||||
Combining these two entries you can see that "qemux86-64" is a three step build where the
|
||||
``bitbake BBTARGETS`` would be run, then ``bitbake SANITYTARGETS`` for each step; all for
|
||||
``MACHINE="qemx86-64"`` but with differing SDKMACHINE settings. In step
|
||||
1 an extra variable is added to the ``auto.conf`` file to enable wic
|
||||
image generation.
|
||||
Combining these two entries you can see that ``qemux86-64`` is a three step
|
||||
build where ``bitbake BBTARGETS`` would be run, then ``bitbake SANITYTARGETS``
|
||||
for each step; all for ``MACHINE="qemux86-64"`` but with differing
|
||||
:term:`SDKMACHINE` settings. In step 1, an extra variable is added to the
|
||||
``auto.conf`` file to enable wic image generation.
|
||||
|
||||
While not every detail of this is covered here, you can see how the
|
||||
template mechanism allows quite complex configurations to be built up
|
||||
@@ -88,9 +88,9 @@ roughly consist of:
|
||||
|
||||
#. *Obtain yocto-autobuilder-helper*
|
||||
|
||||
This step clones the ``yocto-autobuilder-helper`` git repository.
|
||||
This is necessary to prevent the requirement to maintain all the
|
||||
release or project-specific code within Buildbot. The branch chosen
|
||||
This step clones the :yocto_git:`yocto-autobuilder-helper </yocto-autobuilder-helper>`
|
||||
git repository. This is necessary to avoid the requirement to maintain all
|
||||
the release or project-specific code within Buildbot. The branch chosen
|
||||
matches the release being built so we can support older releases and
|
||||
still make changes in newer ones.
|
||||
|
||||
@@ -163,8 +163,9 @@ Autobuilder Worker Janitor
|
||||
--------------------------
|
||||
|
||||
This is a process running on each Worker that performs two basic
|
||||
operations, including background file deletion at IO idle (see :ref:`test-manual/understand-autobuilder:Autobuilder Target Execution Overview`: Run clobberdir) and
|
||||
maintenance of a cache of cloned repositories to improve the speed
|
||||
operations, including background file deletion at IO idle (see
|
||||
"Run clobberdir" in :ref:`test-manual/understand-autobuilder:Autobuilder Target Execution Overview`)
|
||||
and maintenance of a cache of cloned repositories to improve the speed
|
||||
the system can checkout repositories.
|
||||
|
||||
Shared DL_DIR
|
||||
@@ -172,7 +173,7 @@ Shared DL_DIR
|
||||
|
||||
The Workers are all connected over NFS which allows DL_DIR to be shared
|
||||
between them. This reduces network accesses from the system and allows
|
||||
the build to be sped up. Usage of the directory within the build system
|
||||
the build to be sped up. The usage of the directory within the build system
|
||||
is designed to be able to be shared over NFS.
|
||||
|
||||
Shared SSTATE_DIR
|
||||
@@ -180,8 +181,8 @@ Shared SSTATE_DIR
|
||||
|
||||
The Workers are all connected over NFS which allows the ``sstate``
|
||||
directory to be shared between them. This means once a Worker has built
|
||||
an artifact, all the others can benefit from it. Usage of the directory
|
||||
within the directory is designed for sharing over NFS.
|
||||
an artifact, all the others can benefit from it. The usage of the directory
|
||||
within the build system is designed for sharing over NFS.
|
||||
|
||||
Resulttool
|
||||
----------
|
||||
@@ -192,7 +193,7 @@ in a given build and their status. Additional information, such as
|
||||
failure logs or the time taken to run the tests, may also be included.
|
||||
|
||||
Resulttool is part of OpenEmbedded-Core and is used to manipulate these
|
||||
json results files. It has the ability to merge files together, display
|
||||
JSON results files. It has the ability to merge files together, display
|
||||
reports of the test results and compare different result files.
|
||||
|
||||
For details, see :yocto_wiki:`/Resulttool`.
|
||||
@@ -206,7 +207,11 @@ are general setup steps that are run once and include:
|
||||
|
||||
#. Set up any ``buildtools-tarball`` if configured.
|
||||
|
||||
<<<<<<< HEAD
|
||||
#. Call "buildhistory-init" if buildhistory is configured.
|
||||
=======
|
||||
#. Call ``buildhistory-init`` if :ref:`ref-classes-buildhistory` is configured.
|
||||
>>>>>>> 7c4f616f77 (test-manual: text and formatting fixes)
|
||||
|
||||
For each step that is configured in ``config.json``, it will perform the
|
||||
following:
|
||||
@@ -250,15 +255,16 @@ Deploying Yocto Autobuilder
|
||||
===========================
|
||||
|
||||
The most up to date information about how to setup and deploy your own
|
||||
Autobuilder can be found in README.md in the ``yocto-autobuilder2``
|
||||
repository.
|
||||
Autobuilder can be found in :yocto_git:`README.md </yocto-autobuilder2/tree/README.md>`
|
||||
in the :yocto_git:`yocto-autobuilder2 </yocto-autobuilder2>` repository.
|
||||
|
||||
We hope that people can use the ``yocto-autobuilder2`` code directly but
|
||||
it is inevitable that users will end up needing to heavily customise the
|
||||
``yocto-autobuilder-helper`` repository, particularly the
|
||||
``config.json`` file as they will want to define their own test matrix.
|
||||
We hope that people can use the :yocto_git:`yocto-autobuilder2 </yocto-autobuilder2>`
|
||||
code directly but it is inevitable that users will end up needing to heavily
|
||||
customize the :yocto_git:`yocto-autobuilder-helper </yocto-autobuilder-helper>`
|
||||
repository, particularly the ``config.json`` file as they will want to define
|
||||
their own test matrix.
|
||||
|
||||
The Autobuilder supports wo customization options:
|
||||
The Autobuilder supports two customization options:
|
||||
|
||||
- variable substitution
|
||||
|
||||
@@ -278,7 +284,7 @@ environment::
|
||||
$ ABHELPER_JSON="config.json /some/location/local.json"
|
||||
|
||||
One issue users often run into is validation of the ``config.json`` files. A
|
||||
tip for minimizing issues from invalid json files is to use a Git
|
||||
tip for minimizing issues from invalid JSON files is to use a Git
|
||||
``pre-commit-hook.sh`` script to verify the JSON file before committing
|
||||
it. Create a symbolic link as follows::
|
||||
|
||||
|
||||
@@ -29,8 +29,9 @@ contact us with other suggestions.
|
||||
#. **Get to know the layer index:**
|
||||
All layers can be found in the :oe_layerindex:`layer index <>`. Layers which
|
||||
have applied for Yocto Project Compatible status (structure continuity
|
||||
assurance and testing) can be found in the :yocto_home:`Yocto Project Compatible index
|
||||
</software-over/layer/>`. Generally check the Compatible layer index first,
|
||||
assurance and testing) can be found in the :yocto_home:`Yocto Project
|
||||
Compatible Layers </development/yocto-project-compatible-layers/>` page.
|
||||
Generally check the Compatible layer index first,
|
||||
and if you don't find the necessary layer check the general layer index. The
|
||||
layer index is an original artifact from the Open Embedded Project. As such,
|
||||
that index doesn't have the curating and testing that the Yocto Project
|
||||
@@ -212,6 +213,13 @@ contact us with other suggestions.
|
||||
OpenEmbedded build system. If you are interested in using this type of
|
||||
interface to create images, see the :doc:`/toaster-manual/index`.
|
||||
|
||||
* **Discover the VSCode extension**: The `Yocto Project BitBake
|
||||
<https://marketplace.visualstudio.com/items?itemName=yocto-project.yocto-bitbake>`__
|
||||
extension for the Visual Studio Code IDE provides language features and
|
||||
commands for working with the Yocto Project. If you are interested in using
|
||||
this extension, visit its `marketplace page
|
||||
<https://marketplace.visualstudio.com/items?itemName=yocto-project.yocto-bitbake>`__.
|
||||
|
||||
* **Have Available the Yocto Project Reference Manual**: Unlike the rest of
|
||||
the Yocto Project manual set, this manual is comprised of material suited
|
||||
for reference rather than procedures. You can get build details, a closer
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
DISTRO = "poky"
|
||||
DISTRO_NAME = "Poky (Yocto Project Reference Distro)"
|
||||
#DISTRO_VERSION = "3.4+snapshot-${METADATA_REVISION}"
|
||||
DISTRO_VERSION = "4.0.15"
|
||||
DISTRO_VERSION = "4.0.16"
|
||||
DISTRO_CODENAME = "kirkstone"
|
||||
SDK_VENDOR = "-pokysdk"
|
||||
SDK_VERSION = "${@d.getVar('DISTRO_VERSION').replace('snapshot-${METADATA_REVISION}', 'snapshot')}"
|
||||
|
||||
@@ -62,6 +62,10 @@ python () {
|
||||
else:
|
||||
d.setVar('B', '${WORKDIR}/${BPN}-${PV}')
|
||||
|
||||
if d.getVar('SRCREV', "INVALID") != "INVALID":
|
||||
# Ensure SRCREV has been processed before accessing SRC_URI
|
||||
bb.fetch.get_srcrev(d)
|
||||
|
||||
local_srcuri = []
|
||||
fetch = bb.fetch2.Fetch((d.getVar('SRC_URI') or '').split(), d)
|
||||
for url in fetch.urls:
|
||||
|
||||
@@ -101,36 +101,12 @@ TESTIMAGE_DUMP_DIR ?= "${LOG_DIR}/runtime-hostdump/"
|
||||
TESTIMAGE_UPDATE_VARS ?= "DL_DIR WORKDIR DEPLOY_DIR"
|
||||
|
||||
testimage_dump_target () {
|
||||
top -bn1
|
||||
ps
|
||||
free
|
||||
df
|
||||
# The next command will export the default gateway IP
|
||||
export DEFAULT_GATEWAY=$(ip route | awk '/default/ { print $3}')
|
||||
ping -c3 $DEFAULT_GATEWAY
|
||||
dmesg
|
||||
netstat -an
|
||||
ip address
|
||||
# Next command will dump logs from /var/log/
|
||||
find /var/log/ -type f 2>/dev/null -exec echo "====================" \; -exec echo {} \; -exec echo "====================" \; -exec cat {} \; -exec echo "" \;
|
||||
}
|
||||
|
||||
testimage_dump_host () {
|
||||
top -bn1
|
||||
iostat -x -z -N -d -p ALL 20 2
|
||||
ps -ef
|
||||
free
|
||||
df
|
||||
memstat
|
||||
dmesg
|
||||
ip -s link
|
||||
netstat -an
|
||||
}
|
||||
|
||||
testimage_dump_monitor () {
|
||||
query-status
|
||||
query-block
|
||||
dump-guest-memory {"paging":false,"protocol":"file:%s.img"}
|
||||
}
|
||||
|
||||
python do_testimage() {
|
||||
|
||||
476
meta/recipes-connectivity/openssh/openssh/CVE-2023-48795.patch
Normal file
476
meta/recipes-connectivity/openssh/openssh/CVE-2023-48795.patch
Normal file
@@ -0,0 +1,476 @@
|
||||
(modified to not remove ssh_packet_read_expect() and to add to
|
||||
KexAlgorithms in sshd.c and sshconnect2.c as this version pre-dates
|
||||
kex_proposal_populate_entries())
|
||||
|
||||
Backport of:
|
||||
|
||||
From 1edb00c58f8a6875fad6a497aa2bacf37f9e6cd5 Mon Sep 17 00:00:00 2001
|
||||
From: "djm@openbsd.org" <djm@openbsd.org>
|
||||
Date: Mon, 18 Dec 2023 14:45:17 +0000
|
||||
Subject: [PATCH] upstream: implement "strict key exchange" in ssh and sshd
|
||||
|
||||
This adds a protocol extension to improve the integrity of the SSH
|
||||
transport protocol, particular in and around the initial key exchange
|
||||
(KEX) phase.
|
||||
|
||||
Full details of the extension are in the PROTOCOL file.
|
||||
|
||||
with markus@
|
||||
|
||||
OpenBSD-Commit-ID: 2a66ac962f0a630d7945fee54004ed9e9c439f14
|
||||
|
||||
Upstream-Status: Backport [import from ubuntu https://git.launchpad.net/ubuntu/+source/openssh/tree/debian/patches/CVE-2023-48795.patch?h=ubuntu/jammy-security
|
||||
Upstream commit https://github.com/openssh/openssh-portable/commit/1edb00c58f8a6875fad6a497aa2bacf37f9e6cd5]
|
||||
CVE: CVE-2023-48795
|
||||
Signed-off-by: Vijay Anusuri <vanusuri@mvista.com>
|
||||
---
|
||||
PROTOCOL | 26 +++++++++++++++++
|
||||
kex.c | 72 +++++++++++++++++++++++++++++++----------------
|
||||
kex.h | 1 +
|
||||
packet.c | 78 ++++++++++++++++++++++++++++++++++++++-------------
|
||||
sshconnect2.c | 14 +++------
|
||||
sshd.c | 7 +++--
|
||||
6 files changed, 142 insertions(+), 56 deletions(-)
|
||||
|
||||
diff --git a/PROTOCOL b/PROTOCOL
|
||||
index e6a7d60..971f01e 100644
|
||||
--- a/PROTOCOL
|
||||
+++ b/PROTOCOL
|
||||
@@ -102,6 +102,32 @@ OpenSSH supports the use of ECDH in Curve25519 for key exchange as
|
||||
described at:
|
||||
http://git.libssh.org/users/aris/libssh.git/plain/doc/curve25519-sha256@libssh.org.txt?h=curve25519
|
||||
|
||||
+1.9 transport: strict key exchange extension
|
||||
+
|
||||
+OpenSSH supports a number of transport-layer hardening measures under
|
||||
+a "strict KEX" feature. This feature is signalled similarly to the
|
||||
+RFC8308 ext-info feature: by including a additional algorithm in the
|
||||
+initiial SSH2_MSG_KEXINIT kex_algorithms field. The client may append
|
||||
+"kex-strict-c-v00@openssh.com" to its kex_algorithms and the server
|
||||
+may append "kex-strict-s-v00@openssh.com". These pseudo-algorithms
|
||||
+are only valid in the initial SSH2_MSG_KEXINIT and MUST be ignored
|
||||
+if they are present in subsequent SSH2_MSG_KEXINIT packets.
|
||||
+
|
||||
+When an endpoint that supports this extension observes this algorithm
|
||||
+name in a peer's KEXINIT packet, it MUST make the following changes to
|
||||
+the the protocol:
|
||||
+
|
||||
+a) During initial KEX, terminate the connection if any unexpected or
|
||||
+ out-of-sequence packet is received. This includes terminating the
|
||||
+ connection if the first packet received is not SSH2_MSG_KEXINIT.
|
||||
+ Unexpected packets for the purpose of strict KEX include messages
|
||||
+ that are otherwise valid at any time during the connection such as
|
||||
+ SSH2_MSG_DEBUG and SSH2_MSG_IGNORE.
|
||||
+b) After sending or receiving a SSH2_MSG_NEWKEYS message, reset the
|
||||
+ packet sequence number to zero. This behaviour persists for the
|
||||
+ duration of the connection (i.e. not just the first
|
||||
+ SSH2_MSG_NEWKEYS).
|
||||
+
|
||||
2. Connection protocol changes
|
||||
|
||||
2.1. connection: Channel write close extension "eow@openssh.com"
|
||||
diff --git a/kex.c b/kex.c
|
||||
index 0bcd27d..e7b2d4d 100644
|
||||
--- a/kex.c
|
||||
+++ b/kex.c
|
||||
@@ -63,7 +63,7 @@
|
||||
#include "digest.h"
|
||||
|
||||
/* prototype */
|
||||
-static int kex_choose_conf(struct ssh *);
|
||||
+static int kex_choose_conf(struct ssh *, uint32_t seq);
|
||||
static int kex_input_newkeys(int, u_int32_t, struct ssh *);
|
||||
|
||||
static const char * const proposal_names[PROPOSAL_MAX] = {
|
||||
@@ -175,6 +175,18 @@ kex_names_valid(const char *names)
|
||||
return 1;
|
||||
}
|
||||
|
||||
+/* returns non-zero if proposal contains any algorithm from algs */
|
||||
+static int
|
||||
+has_any_alg(const char *proposal, const char *algs)
|
||||
+{
|
||||
+ char *cp;
|
||||
+
|
||||
+ if ((cp = match_list(proposal, algs, NULL)) == NULL)
|
||||
+ return 0;
|
||||
+ free(cp);
|
||||
+ return 1;
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* Concatenate algorithm names, avoiding duplicates in the process.
|
||||
* Caller must free returned string.
|
||||
@@ -182,7 +194,7 @@ kex_names_valid(const char *names)
|
||||
char *
|
||||
kex_names_cat(const char *a, const char *b)
|
||||
{
|
||||
- char *ret = NULL, *tmp = NULL, *cp, *p, *m;
|
||||
+ char *ret = NULL, *tmp = NULL, *cp, *p;
|
||||
size_t len;
|
||||
|
||||
if (a == NULL || *a == '\0')
|
||||
@@ -199,10 +211,8 @@ kex_names_cat(const char *a, const char *b)
|
||||
}
|
||||
strlcpy(ret, a, len);
|
||||
for ((p = strsep(&cp, ",")); p && *p != '\0'; (p = strsep(&cp, ","))) {
|
||||
- if ((m = match_list(ret, p, NULL)) != NULL) {
|
||||
- free(m);
|
||||
+ if (has_any_alg(ret, p))
|
||||
continue; /* Algorithm already present */
|
||||
- }
|
||||
if (strlcat(ret, ",", len) >= len ||
|
||||
strlcat(ret, p, len) >= len) {
|
||||
free(tmp);
|
||||
@@ -410,7 +420,12 @@ kex_protocol_error(int type, u_int32_t seq, struct ssh *ssh)
|
||||
{
|
||||
int r;
|
||||
|
||||
- error("kex protocol error: type %d seq %u", type, seq);
|
||||
+ /* If in strict mode, any unexpected message is an error */
|
||||
+ if ((ssh->kex->flags & KEX_INITIAL) && ssh->kex->kex_strict) {
|
||||
+ ssh_packet_disconnect(ssh, "strict KEX violation: "
|
||||
+ "unexpected packet type %u (seqnr %u)", type, seq);
|
||||
+ }
|
||||
+ error_f("type %u seq %u", type, seq);
|
||||
if ((r = sshpkt_start(ssh, SSH2_MSG_UNIMPLEMENTED)) != 0 ||
|
||||
(r = sshpkt_put_u32(ssh, seq)) != 0 ||
|
||||
(r = sshpkt_send(ssh)) != 0)
|
||||
@@ -485,6 +500,11 @@ kex_input_ext_info(int type, u_int32_t seq, struct ssh *ssh)
|
||||
ssh_dispatch_set(ssh, SSH2_MSG_EXT_INFO, &kex_protocol_error);
|
||||
if ((r = sshpkt_get_u32(ssh, &ninfo)) != 0)
|
||||
return r;
|
||||
+ if (ninfo >= 1024) {
|
||||
+ error("SSH2_MSG_EXT_INFO with too many entries, expected "
|
||||
+ "<=1024, received %u", ninfo);
|
||||
+ return dispatch_protocol_error(type, seq, ssh);
|
||||
+ }
|
||||
for (i = 0; i < ninfo; i++) {
|
||||
if ((r = sshpkt_get_cstring(ssh, &name, NULL)) != 0)
|
||||
return r;
|
||||
@@ -600,7 +620,7 @@ kex_input_kexinit(int type, u_int32_t seq, struct ssh *ssh)
|
||||
error_f("no kex");
|
||||
return SSH_ERR_INTERNAL_ERROR;
|
||||
}
|
||||
- ssh_dispatch_set(ssh, SSH2_MSG_KEXINIT, NULL);
|
||||
+ ssh_dispatch_set(ssh, SSH2_MSG_KEXINIT, &kex_protocol_error);
|
||||
ptr = sshpkt_ptr(ssh, &dlen);
|
||||
if ((r = sshbuf_put(kex->peer, ptr, dlen)) != 0)
|
||||
return r;
|
||||
@@ -636,7 +656,7 @@ kex_input_kexinit(int type, u_int32_t seq, struct ssh *ssh)
|
||||
if (!(kex->flags & KEX_INIT_SENT))
|
||||
if ((r = kex_send_kexinit(ssh)) != 0)
|
||||
return r;
|
||||
- if ((r = kex_choose_conf(ssh)) != 0)
|
||||
+ if ((r = kex_choose_conf(ssh, seq)) != 0)
|
||||
return r;
|
||||
|
||||
if (kex->kex_type < KEX_MAX && kex->kex[kex->kex_type] != NULL)
|
||||
@@ -900,20 +920,14 @@ proposals_match(char *my[PROPOSAL_MAX], char *peer[PROPOSAL_MAX])
|
||||
return (1);
|
||||
}
|
||||
|
||||
-/* returns non-zero if proposal contains any algorithm from algs */
|
||||
static int
|
||||
-has_any_alg(const char *proposal, const char *algs)
|
||||
+kexalgs_contains(char **peer, const char *ext)
|
||||
{
|
||||
- char *cp;
|
||||
-
|
||||
- if ((cp = match_list(proposal, algs, NULL)) == NULL)
|
||||
- return 0;
|
||||
- free(cp);
|
||||
- return 1;
|
||||
+ return has_any_alg(peer[PROPOSAL_KEX_ALGS], ext);
|
||||
}
|
||||
|
||||
static int
|
||||
-kex_choose_conf(struct ssh *ssh)
|
||||
+kex_choose_conf(struct ssh *ssh, uint32_t seq)
|
||||
{
|
||||
struct kex *kex = ssh->kex;
|
||||
struct newkeys *newkeys;
|
||||
@@ -938,13 +952,23 @@ kex_choose_conf(struct ssh *ssh)
|
||||
sprop=peer;
|
||||
}
|
||||
|
||||
- /* Check whether client supports ext_info_c */
|
||||
- if (kex->server && (kex->flags & KEX_INITIAL)) {
|
||||
- char *ext;
|
||||
-
|
||||
- ext = match_list("ext-info-c", peer[PROPOSAL_KEX_ALGS], NULL);
|
||||
- kex->ext_info_c = (ext != NULL);
|
||||
- free(ext);
|
||||
+ /* Check whether peer supports ext_info/kex_strict */
|
||||
+ if ((kex->flags & KEX_INITIAL) != 0) {
|
||||
+ if (kex->server) {
|
||||
+ kex->ext_info_c = kexalgs_contains(peer, "ext-info-c");
|
||||
+ kex->kex_strict = kexalgs_contains(peer,
|
||||
+ "kex-strict-c-v00@openssh.com");
|
||||
+ } else {
|
||||
+ kex->kex_strict = kexalgs_contains(peer,
|
||||
+ "kex-strict-s-v00@openssh.com");
|
||||
+ }
|
||||
+ if (kex->kex_strict) {
|
||||
+ debug3_f("will use strict KEX ordering");
|
||||
+ if (seq != 0)
|
||||
+ ssh_packet_disconnect(ssh,
|
||||
+ "strict KEX violation: "
|
||||
+ "KEXINIT was not the first packet");
|
||||
+ }
|
||||
}
|
||||
|
||||
/* Check whether client supports rsa-sha2 algorithms */
|
||||
diff --git a/kex.h b/kex.h
|
||||
index c353295..d97323e 100644
|
||||
--- a/kex.h
|
||||
+++ b/kex.h
|
||||
@@ -148,6 +148,7 @@ struct kex {
|
||||
u_int kex_type;
|
||||
char *server_sig_algs;
|
||||
int ext_info_c;
|
||||
+ int kex_strict;
|
||||
struct sshbuf *my;
|
||||
struct sshbuf *peer;
|
||||
struct sshbuf *client_version;
|
||||
diff --git a/packet.c b/packet.c
|
||||
index bde6c10..28f3729 100644
|
||||
--- a/packet.c
|
||||
+++ b/packet.c
|
||||
@@ -1205,8 +1205,13 @@ ssh_packet_send2_wrapped(struct ssh *ssh)
|
||||
sshbuf_dump(state->output, stderr);
|
||||
#endif
|
||||
/* increment sequence number for outgoing packets */
|
||||
- if (++state->p_send.seqnr == 0)
|
||||
+ if (++state->p_send.seqnr == 0) {
|
||||
+ if ((ssh->kex->flags & KEX_INITIAL) != 0) {
|
||||
+ ssh_packet_disconnect(ssh, "outgoing sequence number "
|
||||
+ "wrapped during initial key exchange");
|
||||
+ }
|
||||
logit("outgoing seqnr wraps around");
|
||||
+ }
|
||||
if (++state->p_send.packets == 0)
|
||||
if (!(ssh->compat & SSH_BUG_NOREKEY))
|
||||
return SSH_ERR_NEED_REKEY;
|
||||
@@ -1214,6 +1219,11 @@ ssh_packet_send2_wrapped(struct ssh *ssh)
|
||||
state->p_send.bytes += len;
|
||||
sshbuf_reset(state->outgoing_packet);
|
||||
|
||||
+ if (type == SSH2_MSG_NEWKEYS && ssh->kex->kex_strict) {
|
||||
+ debug_f("resetting send seqnr %u", state->p_send.seqnr);
|
||||
+ state->p_send.seqnr = 0;
|
||||
+ }
|
||||
+
|
||||
if (type == SSH2_MSG_NEWKEYS)
|
||||
r = ssh_set_newkeys(ssh, MODE_OUT);
|
||||
else if (type == SSH2_MSG_USERAUTH_SUCCESS && state->server_side)
|
||||
@@ -1342,8 +1352,7 @@ ssh_packet_read_seqnr(struct ssh *ssh, u_char *typep, u_int32_t *seqnr_p)
|
||||
/* Stay in the loop until we have received a complete packet. */
|
||||
for (;;) {
|
||||
/* Try to read a packet from the buffer. */
|
||||
- r = ssh_packet_read_poll_seqnr(ssh, typep, seqnr_p);
|
||||
- if (r != 0)
|
||||
+ if ((r = ssh_packet_read_poll_seqnr(ssh, typep, seqnr_p)) != 0)
|
||||
break;
|
||||
/* If we got a packet, return it. */
|
||||
if (*typep != SSH_MSG_NONE)
|
||||
@@ -1627,10 +1636,16 @@ ssh_packet_read_poll2(struct ssh *ssh, u_char *typep, u_int32_t *seqnr_p)
|
||||
if ((r = sshbuf_consume(state->input, mac->mac_len)) != 0)
|
||||
goto out;
|
||||
}
|
||||
+
|
||||
if (seqnr_p != NULL)
|
||||
*seqnr_p = state->p_read.seqnr;
|
||||
- if (++state->p_read.seqnr == 0)
|
||||
+ if (++state->p_read.seqnr == 0) {
|
||||
+ if ((ssh->kex->flags & KEX_INITIAL) != 0) {
|
||||
+ ssh_packet_disconnect(ssh, "incoming sequence number "
|
||||
+ "wrapped during initial key exchange");
|
||||
+ }
|
||||
logit("incoming seqnr wraps around");
|
||||
+ }
|
||||
if (++state->p_read.packets == 0)
|
||||
if (!(ssh->compat & SSH_BUG_NOREKEY))
|
||||
return SSH_ERR_NEED_REKEY;
|
||||
@@ -1696,6 +1711,10 @@ ssh_packet_read_poll2(struct ssh *ssh, u_char *typep, u_int32_t *seqnr_p)
|
||||
#endif
|
||||
/* reset for next packet */
|
||||
state->packlen = 0;
|
||||
+ if (*typep == SSH2_MSG_NEWKEYS && ssh->kex->kex_strict) {
|
||||
+ debug_f("resetting read seqnr %u", state->p_read.seqnr);
|
||||
+ state->p_read.seqnr = 0;
|
||||
+ }
|
||||
|
||||
if ((r = ssh_packet_check_rekey(ssh)) != 0)
|
||||
return r;
|
||||
@@ -1716,10 +1735,39 @@ ssh_packet_read_poll_seqnr(struct ssh *ssh, u_char *typep, u_int32_t *seqnr_p)
|
||||
r = ssh_packet_read_poll2(ssh, typep, seqnr_p);
|
||||
if (r != 0)
|
||||
return r;
|
||||
- if (*typep) {
|
||||
- state->keep_alive_timeouts = 0;
|
||||
- DBG(debug("received packet type %d", *typep));
|
||||
+ if (*typep == 0) {
|
||||
+ /* no message ready */
|
||||
+ return 0;
|
||||
+ }
|
||||
+ state->keep_alive_timeouts = 0;
|
||||
+ DBG(debug("received packet type %d", *typep));
|
||||
+
|
||||
+ /* Always process disconnect messages */
|
||||
+ if (*typep == SSH2_MSG_DISCONNECT) {
|
||||
+ if ((r = sshpkt_get_u32(ssh, &reason)) != 0 ||
|
||||
+ (r = sshpkt_get_string(ssh, &msg, NULL)) != 0)
|
||||
+ return r;
|
||||
+ /* Ignore normal client exit notifications */
|
||||
+ do_log2(ssh->state->server_side &&
|
||||
+ reason == SSH2_DISCONNECT_BY_APPLICATION ?
|
||||
+ SYSLOG_LEVEL_INFO : SYSLOG_LEVEL_ERROR,
|
||||
+ "Received disconnect from %s port %d:"
|
||||
+ "%u: %.400s", ssh_remote_ipaddr(ssh),
|
||||
+ ssh_remote_port(ssh), reason, msg);
|
||||
+ free(msg);
|
||||
+ return SSH_ERR_DISCONNECTED;
|
||||
}
|
||||
+
|
||||
+ /*
|
||||
+ * Do not implicitly handle any messages here during initial
|
||||
+ * KEX when in strict mode. They will be need to be allowed
|
||||
+ * explicitly by the KEX dispatch table or they will generate
|
||||
+ * protocol errors.
|
||||
+ */
|
||||
+ if (ssh->kex != NULL &&
|
||||
+ (ssh->kex->flags & KEX_INITIAL) && ssh->kex->kex_strict)
|
||||
+ return 0;
|
||||
+ /* Implicitly handle transport-level messages */
|
||||
switch (*typep) {
|
||||
case SSH2_MSG_IGNORE:
|
||||
debug3("Received SSH2_MSG_IGNORE");
|
||||
@@ -1734,19 +1782,6 @@ ssh_packet_read_poll_seqnr(struct ssh *ssh, u_char *typep, u_int32_t *seqnr_p)
|
||||
debug("Remote: %.900s", msg);
|
||||
free(msg);
|
||||
break;
|
||||
- case SSH2_MSG_DISCONNECT:
|
||||
- if ((r = sshpkt_get_u32(ssh, &reason)) != 0 ||
|
||||
- (r = sshpkt_get_string(ssh, &msg, NULL)) != 0)
|
||||
- return r;
|
||||
- /* Ignore normal client exit notifications */
|
||||
- do_log2(ssh->state->server_side &&
|
||||
- reason == SSH2_DISCONNECT_BY_APPLICATION ?
|
||||
- SYSLOG_LEVEL_INFO : SYSLOG_LEVEL_ERROR,
|
||||
- "Received disconnect from %s port %d:"
|
||||
- "%u: %.400s", ssh_remote_ipaddr(ssh),
|
||||
- ssh_remote_port(ssh), reason, msg);
|
||||
- free(msg);
|
||||
- return SSH_ERR_DISCONNECTED;
|
||||
case SSH2_MSG_UNIMPLEMENTED:
|
||||
if ((r = sshpkt_get_u32(ssh, &seqnr)) != 0)
|
||||
return r;
|
||||
@@ -2211,6 +2246,7 @@ kex_to_blob(struct sshbuf *m, struct kex *kex)
|
||||
(r = sshbuf_put_u32(m, kex->hostkey_type)) != 0 ||
|
||||
(r = sshbuf_put_u32(m, kex->hostkey_nid)) != 0 ||
|
||||
(r = sshbuf_put_u32(m, kex->kex_type)) != 0 ||
|
||||
+ (r = sshbuf_put_u32(m, kex->kex_strict)) != 0 ||
|
||||
(r = sshbuf_put_stringb(m, kex->my)) != 0 ||
|
||||
(r = sshbuf_put_stringb(m, kex->peer)) != 0 ||
|
||||
(r = sshbuf_put_stringb(m, kex->client_version)) != 0 ||
|
||||
@@ -2373,6 +2409,7 @@ kex_from_blob(struct sshbuf *m, struct kex **kexp)
|
||||
(r = sshbuf_get_u32(m, (u_int *)&kex->hostkey_type)) != 0 ||
|
||||
(r = sshbuf_get_u32(m, (u_int *)&kex->hostkey_nid)) != 0 ||
|
||||
(r = sshbuf_get_u32(m, &kex->kex_type)) != 0 ||
|
||||
+ (r = sshbuf_get_u32(m, &kex->kex_strict)) != 0 ||
|
||||
(r = sshbuf_get_stringb(m, kex->my)) != 0 ||
|
||||
(r = sshbuf_get_stringb(m, kex->peer)) != 0 ||
|
||||
(r = sshbuf_get_stringb(m, kex->client_version)) != 0 ||
|
||||
@@ -2701,6 +2738,7 @@ sshpkt_disconnect(struct ssh *ssh, const char *fmt,...)
|
||||
vsnprintf(buf, sizeof(buf), fmt, args);
|
||||
va_end(args);
|
||||
|
||||
+ debug2_f("sending SSH2_MSG_DISCONNECT: %s", buf);
|
||||
if ((r = sshpkt_start(ssh, SSH2_MSG_DISCONNECT)) != 0 ||
|
||||
(r = sshpkt_put_u32(ssh, SSH2_DISCONNECT_PROTOCOL_ERROR)) != 0 ||
|
||||
(r = sshpkt_put_cstring(ssh, buf)) != 0 ||
|
||||
diff --git a/sshconnect2.c b/sshconnect2.c
|
||||
index b25225e..83ae4a4 100644
|
||||
--- a/sshconnect2.c
|
||||
+++ b/sshconnect2.c
|
||||
@@ -241,7 +241,8 @@ ssh_kex2(struct ssh *ssh, char *host, struct sockaddr *hostaddr, u_short port,
|
||||
fatal_fr(r, "kex_assemble_namelist");
|
||||
free(all_key);
|
||||
|
||||
- if ((s = kex_names_cat(options.kex_algorithms, "ext-info-c")) == NULL)
|
||||
+ if ((s = kex_names_cat(options.kex_algorithms,
|
||||
+ "ext-info-c,kex-strict-c-v00@openssh.com")) == NULL)
|
||||
fatal_f("kex_names_cat");
|
||||
myproposal[PROPOSAL_KEX_ALGS] = compat_kex_proposal(ssh, s);
|
||||
myproposal[PROPOSAL_ENC_ALGS_CTOS] =
|
||||
@@ -363,7 +364,6 @@ struct cauthmethod {
|
||||
};
|
||||
|
||||
static int input_userauth_service_accept(int, u_int32_t, struct ssh *);
|
||||
-static int input_userauth_ext_info(int, u_int32_t, struct ssh *);
|
||||
static int input_userauth_success(int, u_int32_t, struct ssh *);
|
||||
static int input_userauth_failure(int, u_int32_t, struct ssh *);
|
||||
static int input_userauth_banner(int, u_int32_t, struct ssh *);
|
||||
@@ -477,7 +477,7 @@ ssh_userauth2(struct ssh *ssh, const char *local_user,
|
||||
|
||||
ssh->authctxt = &authctxt;
|
||||
ssh_dispatch_init(ssh, &input_userauth_error);
|
||||
- ssh_dispatch_set(ssh, SSH2_MSG_EXT_INFO, &input_userauth_ext_info);
|
||||
+ ssh_dispatch_set(ssh, SSH2_MSG_EXT_INFO, kex_input_ext_info);
|
||||
ssh_dispatch_set(ssh, SSH2_MSG_SERVICE_ACCEPT, &input_userauth_service_accept);
|
||||
ssh_dispatch_run_fatal(ssh, DISPATCH_BLOCK, &authctxt.success); /* loop until success */
|
||||
pubkey_cleanup(ssh);
|
||||
@@ -529,13 +529,6 @@ input_userauth_service_accept(int type, u_int32_t seq, struct ssh *ssh)
|
||||
return r;
|
||||
}
|
||||
|
||||
-/* ARGSUSED */
|
||||
-static int
|
||||
-input_userauth_ext_info(int type, u_int32_t seqnr, struct ssh *ssh)
|
||||
-{
|
||||
- return kex_input_ext_info(type, seqnr, ssh);
|
||||
-}
|
||||
-
|
||||
void
|
||||
userauth(struct ssh *ssh, char *authlist)
|
||||
{
|
||||
@@ -617,6 +610,7 @@ input_userauth_success(int type, u_int32_t seq, struct ssh *ssh)
|
||||
free(authctxt->methoddata);
|
||||
authctxt->methoddata = NULL;
|
||||
authctxt->success = 1; /* break out */
|
||||
+ ssh_dispatch_set(ssh, SSH2_MSG_EXT_INFO, dispatch_protocol_error);
|
||||
return 0;
|
||||
}
|
||||
|
||||
diff --git a/sshd.c b/sshd.c
|
||||
index ef18ba4..652bdc3 100644
|
||||
--- a/sshd.c
|
||||
+++ b/sshd.c
|
||||
@@ -2354,11 +2354,13 @@ static void
|
||||
do_ssh2_kex(struct ssh *ssh)
|
||||
{
|
||||
char *myproposal[PROPOSAL_MAX] = { KEX_SERVER };
|
||||
+ char *s;
|
||||
struct kex *kex;
|
||||
int r;
|
||||
|
||||
- myproposal[PROPOSAL_KEX_ALGS] = compat_kex_proposal(ssh,
|
||||
- options.kex_algorithms);
|
||||
+ if ((s = kex_names_cat(options.kex_algorithms, "kex-strict-s-v00@openssh.com")) == NULL)
|
||||
+ fatal_f("kex_names_cat");
|
||||
+ myproposal[PROPOSAL_KEX_ALGS] = compat_kex_proposal(ssh, s);
|
||||
myproposal[PROPOSAL_ENC_ALGS_CTOS] = compat_cipher_proposal(ssh,
|
||||
options.ciphers);
|
||||
myproposal[PROPOSAL_ENC_ALGS_STOC] = compat_cipher_proposal(ssh,
|
||||
@@ -2411,6 +2413,7 @@ do_ssh2_kex(struct ssh *ssh)
|
||||
(r = ssh_packet_write_wait(ssh)) != 0)
|
||||
fatal_fr(r, "send test");
|
||||
#endif
|
||||
+ free(s);
|
||||
debug("KEX done");
|
||||
}
|
||||
|
||||
--
|
||||
2.25.1
|
||||
|
||||
171
meta/recipes-connectivity/openssh/openssh/CVE-2023-51384.patch
Normal file
171
meta/recipes-connectivity/openssh/openssh/CVE-2023-51384.patch
Normal file
@@ -0,0 +1,171 @@
|
||||
From 881d9c6af9da4257c69c327c4e2f1508b2fa754b Mon Sep 17 00:00:00 2001
|
||||
From: "djm@openbsd.org" <djm@openbsd.org>
|
||||
Date: Mon, 18 Dec 2023 14:46:12 +0000
|
||||
Subject: [PATCH] upstream: apply destination constraints to all p11 keys
|
||||
|
||||
Previously applied only to the first key returned from each token.
|
||||
|
||||
ok markus@
|
||||
|
||||
OpenBSD-Commit-ID: 36df3afb8eb94eec6b2541f063d0d164ef8b488d
|
||||
|
||||
CVE: CVE-2023-51384
|
||||
|
||||
Upstream-Status: Backport
|
||||
https://github.com/openssh/openssh-portable/commit/881d9c6af9da4257c69c327c4e2f1508b2fa754b
|
||||
|
||||
Signed-off-by: Archana Polampalli <archana.polampalli@windriver.com>
|
||||
---
|
||||
ssh-agent.c | 102 +++++++++++++++++++++++++++++++++++++++++++++++++---
|
||||
1 file changed, 98 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/ssh-agent.c b/ssh-agent.c
|
||||
index 19eeaae..4dbb4f3 100644
|
||||
--- a/ssh-agent.c
|
||||
+++ b/ssh-agent.c
|
||||
@@ -249,6 +249,90 @@ free_dest_constraints(struct dest_constraint *dcs, size_t ndcs)
|
||||
free(dcs);
|
||||
}
|
||||
|
||||
+static void
|
||||
+dup_dest_constraint_hop(const struct dest_constraint_hop *dch,
|
||||
+ struct dest_constraint_hop *out)
|
||||
+{
|
||||
+ u_int i;
|
||||
+ int r;
|
||||
+
|
||||
+ out->user = dch->user == NULL ? NULL : xstrdup(dch->user);
|
||||
+ out->hostname = dch->hostname == NULL ? NULL : xstrdup(dch->hostname);
|
||||
+ out->is_ca = dch->is_ca;
|
||||
+ out->nkeys = dch->nkeys;
|
||||
+ out->keys = out->nkeys == 0 ? NULL :
|
||||
+ xcalloc(out->nkeys, sizeof(*out->keys));
|
||||
+ out->key_is_ca = out->nkeys == 0 ? NULL :
|
||||
+ xcalloc(out->nkeys, sizeof(*out->key_is_ca));
|
||||
+ for (i = 0; i < dch->nkeys; i++) {
|
||||
+ if (dch->keys[i] != NULL &&
|
||||
+ (r = sshkey_from_private(dch->keys[i],
|
||||
+ &(out->keys[i]))) != 0)
|
||||
+ fatal_fr(r, "copy key");
|
||||
+ out->key_is_ca[i] = dch->key_is_ca[i];
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static struct dest_constraint *
|
||||
+dup_dest_constraints(const struct dest_constraint *dcs, size_t ndcs)
|
||||
+{
|
||||
+ size_t i;
|
||||
+ struct dest_constraint *ret;
|
||||
+
|
||||
+ if (ndcs == 0)
|
||||
+ return NULL;
|
||||
+ ret = xcalloc(ndcs, sizeof(*ret));
|
||||
+ for (i = 0; i < ndcs; i++) {
|
||||
+ dup_dest_constraint_hop(&dcs[i].from, &ret[i].from);
|
||||
+ dup_dest_constraint_hop(&dcs[i].to, &ret[i].to);
|
||||
+ }
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+#ifdef DEBUG_CONSTRAINTS
|
||||
+static void
|
||||
+dump_dest_constraint_hop(const struct dest_constraint_hop *dch)
|
||||
+{
|
||||
+ u_int i;
|
||||
+ char *fp;
|
||||
+
|
||||
+ debug_f("user %s hostname %s is_ca %d nkeys %u",
|
||||
+ dch->user == NULL ? "(null)" : dch->user,
|
||||
+ dch->hostname == NULL ? "(null)" : dch->hostname,
|
||||
+ dch->is_ca, dch->nkeys);
|
||||
+ for (i = 0; i < dch->nkeys; i++) {
|
||||
+ fp = NULL;
|
||||
+ if (dch->keys[i] != NULL &&
|
||||
+ (fp = sshkey_fingerprint(dch->keys[i],
|
||||
+ SSH_FP_HASH_DEFAULT, SSH_FP_DEFAULT)) == NULL)
|
||||
+ fatal_f("fingerprint failed");
|
||||
+ debug_f("key %u/%u: %s%s%s key_is_ca %d", i, dch->nkeys,
|
||||
+ dch->keys[i] == NULL ? "" : sshkey_ssh_name(dch->keys[i]),
|
||||
+ dch->keys[i] == NULL ? "" : " ",
|
||||
+ dch->keys[i] == NULL ? "none" : fp,
|
||||
+ dch->key_is_ca[i]);
|
||||
+ free(fp);
|
||||
+ }
|
||||
+}
|
||||
+#endif /* DEBUG_CONSTRAINTS */
|
||||
+
|
||||
+static void
|
||||
+dump_dest_constraints(const char *context,
|
||||
+ const struct dest_constraint *dcs, size_t ndcs)
|
||||
+{
|
||||
+#ifdef DEBUG_CONSTRAINTS
|
||||
+ size_t i;
|
||||
+
|
||||
+ debug_f("%s: %zu constraints", context, ndcs);
|
||||
+ for (i = 0; i < ndcs; i++) {
|
||||
+ debug_f("constraint %zu / %zu: from: ", i, ndcs);
|
||||
+ dump_dest_constraint_hop(&dcs[i].from);
|
||||
+ debug_f("constraint %zu / %zu: to: ", i, ndcs);
|
||||
+ dump_dest_constraint_hop(&dcs[i].to);
|
||||
+ }
|
||||
+ debug_f("done for %s", context);
|
||||
+#endif /* DEBUG_CONSTRAINTS */
|
||||
+}
|
||||
static void
|
||||
free_identity(Identity *id)
|
||||
{
|
||||
@@ -520,13 +604,22 @@ process_request_identities(SocketEntry *e)
|
||||
Identity *id;
|
||||
struct sshbuf *msg, *keys;
|
||||
int r;
|
||||
- u_int nentries = 0;
|
||||
+ u_int i = 0, nentries = 0;
|
||||
+ char *fp;
|
||||
|
||||
debug2_f("entering");
|
||||
|
||||
if ((msg = sshbuf_new()) == NULL || (keys = sshbuf_new()) == NULL)
|
||||
fatal_f("sshbuf_new failed");
|
||||
TAILQ_FOREACH(id, &idtab->idlist, next) {
|
||||
+ if ((fp = sshkey_fingerprint(id->key, SSH_FP_HASH_DEFAULT,
|
||||
+ SSH_FP_DEFAULT)) == NULL)
|
||||
+ fatal_f("fingerprint failed");
|
||||
+ debug_f("key %u / %u: %s %s", i++, idtab->nentries,
|
||||
+ sshkey_ssh_name(id->key), fp);
|
||||
+ dump_dest_constraints(__func__,
|
||||
+ id->dest_constraints, id->ndest_constraints);
|
||||
+ free(fp);
|
||||
/* identity not visible, don't include in response */
|
||||
if (identity_permitted(id, e, NULL, NULL, NULL) != 0)
|
||||
continue;
|
||||
@@ -1235,6 +1328,7 @@ process_add_identity(SocketEntry *e)
|
||||
sshbuf_reset(e->request);
|
||||
goto out;
|
||||
}
|
||||
+ dump_dest_constraints(__func__, dest_constraints, ndest_constraints);
|
||||
|
||||
if (sk_provider != NULL) {
|
||||
if (!sshkey_is_sk(k)) {
|
||||
@@ -1414,6 +1508,7 @@ process_add_smartcard_key(SocketEntry *e)
|
||||
error_f("failed to parse constraints");
|
||||
goto send;
|
||||
}
|
||||
+ dump_dest_constraints(__func__, dest_constraints, ndest_constraints);
|
||||
if (e->nsession_ids != 0 && !remote_add_provider) {
|
||||
verbose("failed PKCS#11 add of \"%.100s\": remote addition of "
|
||||
"providers is disabled", provider);
|
||||
@@ -1449,10 +1544,9 @@ process_add_smartcard_key(SocketEntry *e)
|
||||
}
|
||||
id->death = death;
|
||||
id->confirm = confirm;
|
||||
- id->dest_constraints = dest_constraints;
|
||||
+ id->dest_constraints = dup_dest_constraints(
|
||||
+ dest_constraints, ndest_constraints);
|
||||
id->ndest_constraints = ndest_constraints;
|
||||
- dest_constraints = NULL; /* transferred */
|
||||
- ndest_constraints = 0;
|
||||
TAILQ_INSERT_TAIL(&idtab->idlist, id, next);
|
||||
idtab->nentries++;
|
||||
success = 1;
|
||||
--
|
||||
2.40.0
|
||||
@@ -0,0 +1,97 @@
|
||||
From 7ef3787c84b6b524501211b11a26c742f829af1a Mon Sep 17 00:00:00 2001
|
||||
From: "djm@openbsd.org" <djm@openbsd.org>
|
||||
Date: Mon, 18 Dec 2023 14:47:44 +0000
|
||||
Subject: [PATCH] upstream: ban user/hostnames with most shell metacharacters
|
||||
This makes ssh(1) refuse user or host names provided on the commandline that
|
||||
contain most shell metacharacters.
|
||||
|
||||
Some programs that invoke ssh(1) using untrusted data do not filter
|
||||
metacharacters in arguments they supply. This could create
|
||||
interactions with user-specified ProxyCommand and other directives
|
||||
that allow shell injection attacks to occur.
|
||||
|
||||
It's a mistake to invoke ssh(1) with arbitrary untrusted arguments,
|
||||
but getting this stuff right can be tricky, so this should prevent
|
||||
most obvious ways of creating risky situations. It however is not
|
||||
and cannot be perfect: ssh(1) has no practical way of interpreting
|
||||
what shell quoting rules are in use and how they interact with the
|
||||
user's specified ProxyCommand.
|
||||
|
||||
To allow configurations that use strange user or hostnames to
|
||||
continue to work, this strictness is applied only to names coming
|
||||
from the commandline. Names specified using User or Hostname
|
||||
directives in ssh_config(5) are not affected.
|
||||
|
||||
feedback/ok millert@ markus@ dtucker@ deraadt@
|
||||
|
||||
OpenBSD-Commit-ID: 3b487348b5964f3e77b6b4d3da4c3b439e94b2d9
|
||||
|
||||
CVE: CVE-2023-51385
|
||||
|
||||
Upstream-Status: Backport
|
||||
[https://github.com/openssh/openssh-portable/commit/7ef3787c84b6b524501211b11a26c742f829af1a]
|
||||
|
||||
Signed-off-by: Archana Polampalli <archana.polampalli@windriver.com>
|
||||
---
|
||||
ssh.c | 39 +++++++++++++++++++++++++++++++++++++++
|
||||
1 file changed, 39 insertions(+)
|
||||
|
||||
diff --git a/ssh.c b/ssh.c
|
||||
index 8ff9788..82ed15f 100644
|
||||
--- a/ssh.c
|
||||
+++ b/ssh.c
|
||||
@@ -611,6 +611,41 @@ ssh_conn_info_free(struct ssh_conn_info *cinfo)
|
||||
free(cinfo);
|
||||
}
|
||||
|
||||
+static int
|
||||
+valid_hostname(const char *s)
|
||||
+{
|
||||
+ size_t i;
|
||||
+
|
||||
+ if (*s == '-')
|
||||
+ return 0;
|
||||
+ for (i = 0; s[i] != 0; i++) {
|
||||
+ if (strchr("'`\"$\\;&<>|(){}", s[i]) != NULL ||
|
||||
+ isspace((u_char)s[i]) || iscntrl((u_char)s[i]))
|
||||
+ return 0;
|
||||
+ }
|
||||
+ return 1;
|
||||
+}
|
||||
+
|
||||
+static int
|
||||
+valid_ruser(const char *s)
|
||||
+{
|
||||
+ size_t i;
|
||||
+
|
||||
+ if (*s == '-')
|
||||
+ return 0;
|
||||
+ for (i = 0; s[i] != 0; i++) {
|
||||
+ if (strchr("'`\";&<>|(){}", s[i]) != NULL)
|
||||
+ return 0;
|
||||
+ /* Disallow '-' after whitespace */
|
||||
+ if (isspace((u_char)s[i]) && s[i + 1] == '-')
|
||||
+ return 0;
|
||||
+ /* Disallow \ in last position */
|
||||
+ if (s[i] == '\\' && s[i + 1] == '\0')
|
||||
+ return 0;
|
||||
+ }
|
||||
+ return 1;
|
||||
+}
|
||||
+
|
||||
/*
|
||||
* Main program for the ssh client.
|
||||
*/
|
||||
@@ -1097,6 +1132,10 @@ main(int ac, char **av)
|
||||
if (!host)
|
||||
usage();
|
||||
|
||||
+ if (!valid_hostname(host))
|
||||
+ fatal("hostname contains invalid characters");
|
||||
+ if (options.user != NULL && !valid_ruser(options.user))
|
||||
+ fatal("remote username contains invalid characters");
|
||||
host_arg = xstrdup(host);
|
||||
|
||||
/* Initialize the command to execute on remote host. */
|
||||
--
|
||||
2.40.0
|
||||
@@ -0,0 +1,30 @@
|
||||
From fcd78e31cdd45a7e69ccfe6d8a3b1037dc1de290 Mon Sep 17 00:00:00 2001
|
||||
From: "djm@openbsd.org" <djm@openbsd.org>
|
||||
Date: Wed, 24 May 2023 23:01:06 +0000
|
||||
Subject: [PATCH] upstream: fix AuthorizedPrincipalsCommand when
|
||||
AuthorizedKeysCommand
|
||||
Description: Fix the wrong code as the Subject suggests
|
||||
I added that description to mention, that the file header change was
|
||||
incompatible with the proposed code below and failed to apply,
|
||||
therefore I dropped that chunk of the code.
|
||||
Origin: backport, https://github.com/openssh/openssh-portable/commit/fcd78e31cdd45a7e69ccfe6d8a3b1037dc1de290
|
||||
Bug: https://bugzilla.mindrot.org/show_bug.cgi?id=3574
|
||||
Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/openssh/+bug/2031942
|
||||
Last-Update: 2023-09-01
|
||||
|
||||
Upstream-Status: Backport [import from ubuntu https://git.launchpad.net/ubuntu/+source/openssh/tree/debian/patches/fix-authorized-principals-command.patch?h=ubuntu/jammy-security
|
||||
Upstream commit https://github.com/openssh/openssh-portable/commit/fcd78e31cdd45a7e69ccfe6d8a3b1037dc1de290]
|
||||
Signed-off-by: Vijay Anusuri <vanusuri@mvista.com>
|
||||
---
|
||||
This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
|
||||
--- a/servconf.c
|
||||
+++ b/servconf.c
|
||||
@@ -2372,7 +2372,7 @@ process_server_config_line_depth(ServerO
|
||||
fatal("%.200s line %d: %s must be an absolute path",
|
||||
filename, linenum, keyword);
|
||||
}
|
||||
- if (*activep && options->authorized_keys_command == NULL)
|
||||
+ if (*activep && *charptr == NULL)
|
||||
*charptr = xstrdup(str + len);
|
||||
argv_consume(&ac);
|
||||
break;
|
||||
@@ -32,6 +32,10 @@ SRC_URI = "http://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-${PV}.tar
|
||||
file://CVE-2023-38408-0002.patch \
|
||||
file://CVE-2023-38408-0003.patch \
|
||||
file://CVE-2023-38408-0004.patch \
|
||||
file://fix-authorized-principals-command.patch \
|
||||
file://CVE-2023-48795.patch \
|
||||
file://CVE-2023-51384.patch \
|
||||
file://CVE-2023-51385.patch \
|
||||
"
|
||||
SRC_URI[sha256sum] = "fd497654b7ab1686dac672fb83dfb4ba4096e8b5ffcdaccd262380ae58bec5e7"
|
||||
|
||||
|
||||
113
meta/recipes-connectivity/openssl/openssl/CVE-2023-6129.patch
Normal file
113
meta/recipes-connectivity/openssl/openssl/CVE-2023-6129.patch
Normal file
@@ -0,0 +1,113 @@
|
||||
From 8d847a3ffd4f0b17ee33962cf69c36224925b34f Mon Sep 17 00:00:00 2001
|
||||
From: Rohan McLure <rmclure@linux.ibm.com>
|
||||
Date: Thu, 4 Jan 2024 10:25:50 +0100
|
||||
Subject: [PATCH] poly1305-ppc.pl: Fix vector register clobbering
|
||||
|
||||
Fixes CVE-2023-6129
|
||||
|
||||
The POLY1305 MAC (message authentication code) implementation in OpenSSL for
|
||||
PowerPC CPUs saves the the contents of vector registers in different order
|
||||
than they are restored. Thus the contents of some of these vector registers
|
||||
is corrupted when returning to the caller. The vulnerable code is used only
|
||||
on newer PowerPC processors supporting the PowerISA 2.07 instructions.
|
||||
|
||||
Reviewed-by: Matt Caswell <matt@openssl.org>
|
||||
Reviewed-by: Richard Levitte <levitte@openssl.org>
|
||||
Reviewed-by: Tomas Mraz <tomas@openssl.org>
|
||||
(Merged from https://github.com/openssl/openssl/pull/23200)
|
||||
|
||||
Upstream-Status: Backport [https://github.com/openssl/openssl/commit/8d847a3ffd4f0b17ee33962cf69c36224925b34f]
|
||||
CVE: CVE-2023-6129
|
||||
Signed-off-by: Vivek Kumbhar <vkumbhar@mvista.com>
|
||||
---
|
||||
crypto/poly1305/asm/poly1305-ppc.pl | 42 ++++++++++++++---------------
|
||||
1 file changed, 21 insertions(+), 21 deletions(-)
|
||||
|
||||
diff --git a/crypto/poly1305/asm/poly1305-ppc.pl b/crypto/poly1305/asm/poly1305-ppc.pl
|
||||
index 9f86134..2e601bb 100755
|
||||
--- a/crypto/poly1305/asm/poly1305-ppc.pl
|
||||
+++ b/crypto/poly1305/asm/poly1305-ppc.pl
|
||||
@@ -744,7 +744,7 @@ ___
|
||||
my $LOCALS= 6*$SIZE_T;
|
||||
my $VSXFRAME = $LOCALS + 6*$SIZE_T;
|
||||
$VSXFRAME += 128; # local variables
|
||||
- $VSXFRAME += 13*16; # v20-v31 offload
|
||||
+ $VSXFRAME += 12*16; # v20-v31 offload
|
||||
|
||||
my $BIG_ENDIAN = ($flavour !~ /le/) ? 4 : 0;
|
||||
|
||||
@@ -919,12 +919,12 @@ __poly1305_blocks_vsx:
|
||||
addi r11,r11,32
|
||||
stvx v22,r10,$sp
|
||||
addi r10,r10,32
|
||||
- stvx v23,r10,$sp
|
||||
- addi r10,r10,32
|
||||
- stvx v24,r11,$sp
|
||||
+ stvx v23,r11,$sp
|
||||
addi r11,r11,32
|
||||
- stvx v25,r10,$sp
|
||||
+ stvx v24,r10,$sp
|
||||
addi r10,r10,32
|
||||
+ stvx v25,r11,$sp
|
||||
+ addi r11,r11,32
|
||||
stvx v26,r10,$sp
|
||||
addi r10,r10,32
|
||||
stvx v27,r11,$sp
|
||||
@@ -1153,12 +1153,12 @@ __poly1305_blocks_vsx:
|
||||
addi r11,r11,32
|
||||
stvx v22,r10,$sp
|
||||
addi r10,r10,32
|
||||
- stvx v23,r10,$sp
|
||||
- addi r10,r10,32
|
||||
- stvx v24,r11,$sp
|
||||
+ stvx v23,r11,$sp
|
||||
addi r11,r11,32
|
||||
- stvx v25,r10,$sp
|
||||
+ stvx v24,r10,$sp
|
||||
addi r10,r10,32
|
||||
+ stvx v25,r11,$sp
|
||||
+ addi r11,r11,32
|
||||
stvx v26,r10,$sp
|
||||
addi r10,r10,32
|
||||
stvx v27,r11,$sp
|
||||
@@ -1899,26 +1899,26 @@ Ldone_vsx:
|
||||
mtspr 256,r12 # restore vrsave
|
||||
lvx v20,r10,$sp
|
||||
addi r10,r10,32
|
||||
- lvx v21,r10,$sp
|
||||
- addi r10,r10,32
|
||||
- lvx v22,r11,$sp
|
||||
+ lvx v21,r11,$sp
|
||||
addi r11,r11,32
|
||||
- lvx v23,r10,$sp
|
||||
+ lvx v22,r10,$sp
|
||||
addi r10,r10,32
|
||||
- lvx v24,r11,$sp
|
||||
+ lvx v23,r11,$sp
|
||||
addi r11,r11,32
|
||||
- lvx v25,r10,$sp
|
||||
+ lvx v24,r10,$sp
|
||||
addi r10,r10,32
|
||||
- lvx v26,r11,$sp
|
||||
+ lvx v25,r11,$sp
|
||||
addi r11,r11,32
|
||||
- lvx v27,r10,$sp
|
||||
+ lvx v26,r10,$sp
|
||||
addi r10,r10,32
|
||||
- lvx v28,r11,$sp
|
||||
+ lvx v27,r11,$sp
|
||||
addi r11,r11,32
|
||||
- lvx v29,r10,$sp
|
||||
+ lvx v28,r10,$sp
|
||||
addi r10,r10,32
|
||||
- lvx v30,r11,$sp
|
||||
- lvx v31,r10,$sp
|
||||
+ lvx v29,r11,$sp
|
||||
+ addi r11,r11,32
|
||||
+ lvx v30,r10,$sp
|
||||
+ lvx v31,r11,$sp
|
||||
$POP r27,`$VSXFRAME-$SIZE_T*5`($sp)
|
||||
$POP r28,`$VSXFRAME-$SIZE_T*4`($sp)
|
||||
$POP r29,`$VSXFRAME-$SIZE_T*3`($sp)
|
||||
--
|
||||
2.39.3
|
||||
127
meta/recipes-connectivity/openssl/openssl/CVE-2023-6237.patch
Normal file
127
meta/recipes-connectivity/openssl/openssl/CVE-2023-6237.patch
Normal file
@@ -0,0 +1,127 @@
|
||||
rom e09fc1d746a4fd15bb5c3d7bbbab950aadd005db Mon Sep 17 00:00:00 2001
|
||||
From: Tomas Mraz <tomas@openssl.org>
|
||||
Date: Fri, 22 Dec 2023 16:25:56 +0100
|
||||
Subject: [PATCH] Limit the execution time of RSA public key check
|
||||
|
||||
Fixes CVE-2023-6237
|
||||
|
||||
If a large and incorrect RSA public key is checked with
|
||||
EVP_PKEY_public_check() the computation could take very long time
|
||||
due to no limit being applied to the RSA public key size and
|
||||
unnecessarily high number of Miller-Rabin algorithm rounds
|
||||
used for non-primality check of the modulus.
|
||||
|
||||
Now the keys larger than 16384 bits (OPENSSL_RSA_MAX_MODULUS_BITS)
|
||||
will fail the check with RSA_R_MODULUS_TOO_LARGE error reason.
|
||||
Also the number of Miller-Rabin rounds was set to 5.
|
||||
|
||||
Reviewed-by: Neil Horman <nhorman@openssl.org>
|
||||
Reviewed-by: Matt Caswell <matt@openssl.org>
|
||||
(Merged from https://github.com/openssl/openssl/pull/23243)
|
||||
|
||||
Upstream-Status: Backport [https://github.com/openssl/openssl/commit/e09fc1d746a4fd15bb5c3d7bbbab950aadd005db]
|
||||
CVE: CVE-2023-6237
|
||||
Signed-off-by: Hitendra Prajapati <hprajapati@mvista.com>
|
||||
---
|
||||
crypto/rsa/rsa_sp800_56b_check.c | 8 +++-
|
||||
test/recipes/91-test_pkey_check.t | 2 +-
|
||||
.../91-test_pkey_check_data/rsapub_17k.pem | 48 +++++++++++++++++++
|
||||
3 files changed, 56 insertions(+), 2 deletions(-)
|
||||
create mode 100644 test/recipes/91-test_pkey_check_data/rsapub_17k.pem
|
||||
|
||||
diff --git a/crypto/rsa/rsa_sp800_56b_check.c b/crypto/rsa/rsa_sp800_56b_check.c
|
||||
index fc8f19b..bcbdd24 100644
|
||||
--- a/crypto/rsa/rsa_sp800_56b_check.c
|
||||
+++ b/crypto/rsa/rsa_sp800_56b_check.c
|
||||
@@ -289,6 +289,11 @@ int ossl_rsa_sp800_56b_check_public(const RSA *rsa)
|
||||
return 0;
|
||||
|
||||
nbits = BN_num_bits(rsa->n);
|
||||
+ if (nbits > OPENSSL_RSA_MAX_MODULUS_BITS) {
|
||||
+ ERR_raise(ERR_LIB_RSA, RSA_R_MODULUS_TOO_LARGE);
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
#ifdef FIPS_MODULE
|
||||
/*
|
||||
* (Step a): modulus must be 2048 or 3072 (caveat from SP800-56Br1)
|
||||
@@ -324,7 +329,8 @@ int ossl_rsa_sp800_56b_check_public(const RSA *rsa)
|
||||
goto err;
|
||||
}
|
||||
|
||||
- ret = ossl_bn_miller_rabin_is_prime(rsa->n, 0, ctx, NULL, 1, &status);
|
||||
+ /* Highest number of MR rounds from FIPS 186-5 Section B.3 Table B.1 */
|
||||
+ ret = ossl_bn_miller_rabin_is_prime(rsa->n, 5, ctx, NULL, 1, &status);
|
||||
#ifdef FIPS_MODULE
|
||||
if (ret != 1 || status != BN_PRIMETEST_COMPOSITE_NOT_POWER_OF_PRIME) {
|
||||
#else
|
||||
diff --git a/test/recipes/91-test_pkey_check.t b/test/recipes/91-test_pkey_check.t
|
||||
index dc7cc64..f8088df 100644
|
||||
--- a/test/recipes/91-test_pkey_check.t
|
||||
+++ b/test/recipes/91-test_pkey_check.t
|
||||
@@ -70,7 +70,7 @@ push(@positive_tests, (
|
||||
"dhpkey.pem"
|
||||
)) unless disabled("dh");
|
||||
|
||||
-my @negative_pubtests = ();
|
||||
+my @negative_pubtests = ("rsapub_17k.pem"); # Too big RSA public key
|
||||
|
||||
push(@negative_pubtests, (
|
||||
"dsapub_noparam.der"
|
||||
diff --git a/test/recipes/91-test_pkey_check_data/rsapub_17k.pem b/test/recipes/91-test_pkey_check_data/rsapub_17k.pem
|
||||
new file mode 100644
|
||||
index 0000000..9a2eaed
|
||||
--- /dev/null
|
||||
+++ b/test/recipes/91-test_pkey_check_data/rsapub_17k.pem
|
||||
@@ -0,0 +1,48 @@
|
||||
+-----BEGIN PUBLIC KEY-----
|
||||
+MIIIbzANBgkqhkiG9w0BAQEFAAOCCFwAMIIIVwKCCE4Ang+cE5H+hg3RbapDAHqR
|
||||
+B9lUnp2MlAwsZxQ/FhYepaR60bFQeumbu7817Eo5YLMObVI99hF1C4u/qcpD4Jph
|
||||
+gZt87/JAYDbP+DIh/5gUXCL9m5Fp4u7mvZaZdnlcftBvR1uKUTCAwc9pZ/Cfr8W2
|
||||
+GzrRODzsNYnk2DcZMfe2vRDuDZRopE+Y+I72rom2SZLxoN547N1daM/M/CL9KVQ/
|
||||
+XMI/YOpJrBI0jI3brMRhLkvLckwies9joufydlGbJkeil9H7/grj3fQZtFkZ2Pkj
|
||||
+b87XDzRVX7wsEpAgPJxskL3jApokCp1kQYKG+Uc3dKM9Ade6IAPK7VKcmbAQTYw2
|
||||
+gZxsc28dtstazmfGz0ACCTSMrmbgWAM3oPL7RRzhrXDWgmYQ0jHefGh8SNTIgtPq
|
||||
+TuHxPYkDMQNaf0LmDGCxqlnf4b5ld3YaU8zZ/RqIRx5v/+w0rJUvU53qY1bYSnL1
|
||||
+vbqKSnN2mip0GYyQ4AUgkS1NBV4rGYU/VTvzEjLfkg02KOtHKandvEoUjmZPzCT0
|
||||
+V2ZhGc8K1UJNGYlIiHqCdwCBoghvly/pYajTkDXyd6BsukzA5H3IkZB1xDgl035j
|
||||
+/0Cr7QeZLEOdi9fPdSSaBT6OmD0WFuZfJF0wMr7ucRhWzPXvSensD9v7MBE7tNfH
|
||||
+SLeTSx8tLt8UeWriiM+0CnkPR1IOqMOxubOyf1eV8NQqEWm5wEQG/0IskbOKnaHa
|
||||
+PqLFJZn/bvyL3XK5OxVIJG3z6bnRDOMS9SzkjqgPdIO8tkySEHVSi/6iuGUltx3Y
|
||||
+Fmq6ye/r34ekyHPbfn6UuTON7joM6SIXb5bHM64x4iMVWx4hMvDjfy0UqfywAUyu
|
||||
+C1o7BExSMxxFG8GJcqR0K8akpPp7EM588PC+YuItoxzXgfUJnP3BQ1Beev2Ve7/J
|
||||
+xeGZH0N4ntfr+cuaLAakAER9zDglwChWflw3NNFgIdAgSxXv3XXx5xDXpdP4lxUo
|
||||
+F5zAN4Mero3yV90FaJl7Vhq/UFVidbwFc15jUDwaE0mKRcsBeVd3GOhoECAgE0id
|
||||
+aIPT20z8oVY0FyTJlRk7QSjo8WjJSrHY/Fn14gctX07ZdfkufyL6w+NijBdYluvB
|
||||
+nIrgHEvpkDEWoIa8qcx0EppoIcmqgMV2mTShfFYSybsO33Pm8WXec2FXjwhzs1Pi
|
||||
+R/BuIW8rHPI67xqWm0h8dEw11vtfi9a/BBBikFHe59KBjMTG+lW/gADNvRoTzGh7
|
||||
+kN4+UVDS3jlSisRZZOn1XoeQtpubNYWgUsecjKy45IwIj8h1SHgn3wkmUesY0woN
|
||||
+mOdoNtq+NezN4RFtbCOHhxFVpKKDi/HQP2ro0ykkXMDjwEIVf2Lii1Mg9UP8m+Ux
|
||||
+AOqkTrIkdogkRx+70h7/wUOfDIFUq2JbKzqxJYamyEphcdAko7/B8efQKc61Z93O
|
||||
+f2SHa4++4WI7wIIx18v5KV4M/cRmrfc8w9WRkQN3gBT5AJMuqwcSHVXBWvNQeGmi
|
||||
+ScMh7X6cCZ0daEujqb8svq4WgsJ8UT4GaGBRIYtt7QUKEh+JQwNJzneRYZ3pzpaH
|
||||
+UJeeoYobMlkp3rM9cYzdq90nBQiI9Jsbim9m9ggb2dMOS5CsI9S/IuG2O5uTjfxx
|
||||
+wkwsd5nLDFtNXHYZ7W6XlVJ1Rc6zShnEmdCn3mmibb6OaMUmun2yl9ryEjVSoXLP
|
||||
+fSA8W9K9yNhKTRkzdXJfqlC+s/ovX2xBGxsuOoUDaXhRVz0qmpKIHeSFjIP4iXq4
|
||||
+y8gDiwvM3HbZfvVonbg6siPwpn4uvw3hesojk1DKAENS52i6U3uK2fs1ALVxsFNS
|
||||
+Yh914rDu0Q3e4RXVhURaYzoEbLCot6WGYeCCfQOK0rkETMv+sTYYscC8/THuW7SL
|
||||
+HG5zy9Ed95N1Xmf8J+My7gM7ZFodGdHsWvdzEmqsdOFh6IVx/VfHFX0MDBq0t6lZ
|
||||
+eRvVgVCfu3gkYLwPScn/04E02vOom51ISKHsF/I11erC66jjNYV9BSpH8O7sAHxZ
|
||||
+EmPT2ZVVRSgivOHdQW/FZ3UZQQhVaVSympo2Eb4yWEMFn84Q8T+9Honj6gnB5PXz
|
||||
+chmeCsOMlcg1mwWwhn0k+OAWEZy7VRUk5Ahp0fBAGJgwBdqrZ3kM356DjUkVBiYq
|
||||
+4eHyvafNKmjf2mnFsI3g2NKRNyl1Lh63wyCFx60yYvBUfXF/W9PFJbD9CiP83kEW
|
||||
+gV36gxTsbOSfhpO1OXR90ODy0kx06XzWmJCUugK8u9bx4F/CjV+LIHExuNJiethC
|
||||
+A8sIup/MT0fWp4RO/SsVblGqfoqJTaPnhptQzeH2N07pbWkxeMuL6ppPuwFmfVjK
|
||||
+FJndqCVrAukcPEOQ16iVURuloJMudqYRc9QKkJFsnv0W/iMNbqQGmXe8Q/5qFiys
|
||||
+26NIQBiE2ad9hNLnoccEnmYSRgnW3ZPSKuq5TDdYyDqTZH2r8cam65pr3beKw2XC
|
||||
+xw4cc7VaxiwGC2Mg2wRmwwPaTjrcEt6sMa3RjwFEVBxBFyM26wnTEZsTBquCxV0J
|
||||
+pgERaeplkixP2Q0m7XAdlDaob973SM2vOoUgypzDchWmpx7u775bnOfU5CihwXl+
|
||||
+k0i09WZuT8bPmhEAiGCw5sNzMkz1BC2cCZFfJIkE2vc/wXYOrGxBTJo0EKaUFswa
|
||||
+2dnP/u0bn+VksBUM7ywW9LJSXh4mN+tpzdeJtxEObKwX1I0dQxSPWmjd2++wMr9q
|
||||
+Unre5fCrDToy2H7C2VKSpuOCT2/Kv4JDQRWwI4KxQOpn0UknAGNmfBoTtpIZ3LEb
|
||||
+77oBUJdMQD7tQBBLL0a6f1TdK0dHVprWWawJ+gGFMiMQXqAqblHcxFKWuHv9bQID
|
||||
+AQAB
|
||||
+-----END PUBLIC KEY-----
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@@ -13,6 +13,8 @@ SRC_URI = "http://www.openssl.org/source/openssl-${PV}.tar.gz \
|
||||
file://afalg.patch \
|
||||
file://0001-Configure-do-not-tweak-mips-cflags.patch \
|
||||
file://CVE-2023-5678.patch \
|
||||
file://CVE-2023-6129.patch \
|
||||
file://CVE-2023-6237.patch \
|
||||
"
|
||||
|
||||
SRC_URI:append:class-nativesdk = " \
|
||||
|
||||
@@ -30,6 +30,7 @@ SRC_URI = "http://matt.ucc.asn.au/dropbear/releases/dropbear-${PV}.tar.bz2 \
|
||||
${@bb.utils.contains('PACKAGECONFIG', 'disable-weak-ciphers', 'file://dropbear-disable-weak-ciphers.patch', '', d)} \
|
||||
file://CVE-2021-36369.patch \
|
||||
file://CVE-2023-36328.patch \
|
||||
file://CVE-2023-48795.patch \
|
||||
"
|
||||
|
||||
PAM_SRC_URI = "file://0005-dropbear-enable-pam.patch \
|
||||
|
||||
234
meta/recipes-core/dropbear/dropbear/CVE-2023-48795.patch
Normal file
234
meta/recipes-core/dropbear/dropbear/CVE-2023-48795.patch
Normal file
@@ -0,0 +1,234 @@
|
||||
From 6e43be5c7b99dbee49dc72b6f989f29fdd7e9356 Mon Sep 17 00:00:00 2001
|
||||
From: Matt Johnston <matt@ucc.asn.au>
|
||||
Date: Mon, 20 Nov 2023 14:02:47 +0800
|
||||
Subject: [PATCH] Implement Strict KEX mode
|
||||
|
||||
As specified by OpenSSH with kex-strict-c-v00@openssh.com and
|
||||
kex-strict-s-v00@openssh.com.
|
||||
|
||||
CVE: CVE-2023-48795
|
||||
Upstream-Status: Backport [https://github.com/mkj/dropbear/commit/6e43be5c7b99dbee49dc72b6f989f29fdd7e9356]
|
||||
|
||||
Signed-off-by: Peter Marko <peter.marko@siemens.com>
|
||||
---
|
||||
cli-session.c | 11 +++++++++++
|
||||
common-algo.c | 6 ++++++
|
||||
common-kex.c | 26 +++++++++++++++++++++++++-
|
||||
kex.h | 3 +++
|
||||
process-packet.c | 34 +++++++++++++++++++---------------
|
||||
ssh.h | 4 ++++
|
||||
svr-session.c | 3 +++
|
||||
7 files changed, 71 insertions(+), 16 deletions(-)
|
||||
|
||||
diff --git a/cli-session.c b/src/cli-session.c
|
||||
index 5981b2470..d261c8f82 100644
|
||||
--- a/cli-session.c
|
||||
+++ b/cli-session.c
|
||||
@@ -46,6 +46,7 @@ static void cli_finished(void) ATTRIB_NORETURN;
|
||||
static void recv_msg_service_accept(void);
|
||||
static void cli_session_cleanup(void);
|
||||
static void recv_msg_global_request_cli(void);
|
||||
+static void cli_algos_initialise(void);
|
||||
|
||||
struct clientsession cli_ses; /* GLOBAL */
|
||||
|
||||
@@ -114,6 +115,7 @@ void cli_session(int sock_in, int sock_out, struct dropbear_progress_connection
|
||||
}
|
||||
|
||||
chaninitialise(cli_chantypes);
|
||||
+ cli_algos_initialise();
|
||||
|
||||
/* Set up cli_ses vars */
|
||||
cli_session_init(proxy_cmd_pid);
|
||||
@@ -473,3 +475,12 @@ void cli_dropbear_log(int priority, const char* format, va_list param) {
|
||||
fflush(stderr);
|
||||
}
|
||||
|
||||
+static void cli_algos_initialise(void) {
|
||||
+ algo_type *algo;
|
||||
+ for (algo = sshkex; algo->name; algo++) {
|
||||
+ if (strcmp(algo->name, SSH_STRICT_KEX_S) == 0) {
|
||||
+ algo->usable = 0;
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
diff --git a/common-algo.c b/src/common-algo.c
|
||||
index 378f0ca8e..f9d46ebb6 100644
|
||||
--- a/common-algo.c
|
||||
+++ b/common-algo.c
|
||||
@@ -332,6 +332,12 @@ algo_type sshkex[] = {
|
||||
/* Set unusable by svr_algos_initialise() */
|
||||
{SSH_EXT_INFO_C, 0, NULL, 1, NULL},
|
||||
#endif
|
||||
+#endif
|
||||
+#if DROPBEAR_CLIENT
|
||||
+ {SSH_STRICT_KEX_C, 0, NULL, 1, NULL},
|
||||
+#endif
|
||||
+#if DROPBEAR_SERVER
|
||||
+ {SSH_STRICT_KEX_S, 0, NULL, 1, NULL},
|
||||
#endif
|
||||
{NULL, 0, NULL, 0, NULL}
|
||||
};
|
||||
diff --git a/common-kex.c b/src/common-kex.c
|
||||
index ac8844246..8e33b12a6 100644
|
||||
--- a/common-kex.c
|
||||
+++ b/common-kex.c
|
||||
@@ -183,6 +183,10 @@ void send_msg_newkeys() {
|
||||
gen_new_keys();
|
||||
switch_keys();
|
||||
|
||||
+ if (ses.kexstate.strict_kex) {
|
||||
+ ses.transseq = 0;
|
||||
+ }
|
||||
+
|
||||
TRACE(("leave send_msg_newkeys"))
|
||||
}
|
||||
|
||||
@@ -193,7 +197,11 @@ void recv_msg_newkeys() {
|
||||
|
||||
ses.kexstate.recvnewkeys = 1;
|
||||
switch_keys();
|
||||
-
|
||||
+
|
||||
+ if (ses.kexstate.strict_kex) {
|
||||
+ ses.recvseq = 0;
|
||||
+ }
|
||||
+
|
||||
TRACE(("leave recv_msg_newkeys"))
|
||||
}
|
||||
|
||||
@@ -551,6 +559,10 @@ void recv_msg_kexinit() {
|
||||
|
||||
ses.kexstate.recvkexinit = 1;
|
||||
|
||||
+ if (ses.kexstate.strict_kex && !ses.kexstate.donefirstkex && ses.recvseq != 1) {
|
||||
+ dropbear_exit("First packet wasn't kexinit");
|
||||
+ }
|
||||
+
|
||||
TRACE(("leave recv_msg_kexinit"))
|
||||
}
|
||||
|
||||
@@ -861,6 +873,18 @@ static void read_kex_algos() {
|
||||
}
|
||||
#endif
|
||||
|
||||
+ if (!ses.kexstate.donefirstkex) {
|
||||
+ const char* strict_name;
|
||||
+ if (IS_DROPBEAR_CLIENT) {
|
||||
+ strict_name = SSH_STRICT_KEX_S;
|
||||
+ } else {
|
||||
+ strict_name = SSH_STRICT_KEX_C;
|
||||
+ }
|
||||
+ if (buf_has_algo(ses.payload, strict_name) == DROPBEAR_SUCCESS) {
|
||||
+ ses.kexstate.strict_kex = 1;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
algo = buf_match_algo(ses.payload, sshkex, kexguess2, &goodguess);
|
||||
allgood &= goodguess;
|
||||
if (algo == NULL || algo->data == NULL) {
|
||||
diff --git a/kex.h b/src/kex.h
|
||||
index 77cf21a37..7fcc3c252 100644
|
||||
--- a/kex.h
|
||||
+++ b/kex.h
|
||||
@@ -83,6 +83,9 @@ struct KEXState {
|
||||
|
||||
unsigned our_first_follows_matches : 1;
|
||||
|
||||
+ /* Boolean indicating that strict kex mode is in use */
|
||||
+ unsigned int strict_kex;
|
||||
+
|
||||
time_t lastkextime; /* time of the last kex */
|
||||
unsigned int datatrans; /* data transmitted since last kex */
|
||||
unsigned int datarecv; /* data received since last kex */
|
||||
diff --git a/process-packet.c b/src/process-packet.c
|
||||
index 945416023..133a152d0 100644
|
||||
--- a/process-packet.c
|
||||
+++ b/process-packet.c
|
||||
@@ -44,6 +44,7 @@ void process_packet() {
|
||||
|
||||
unsigned char type;
|
||||
unsigned int i;
|
||||
+ unsigned int first_strict_kex = ses.kexstate.strict_kex && !ses.kexstate.donefirstkex;
|
||||
time_t now;
|
||||
|
||||
TRACE2(("enter process_packet"))
|
||||
@@ -54,22 +55,24 @@ void process_packet() {
|
||||
now = monotonic_now();
|
||||
ses.last_packet_time_keepalive_recv = now;
|
||||
|
||||
- /* These packets we can receive at any time */
|
||||
- switch(type) {
|
||||
|
||||
- case SSH_MSG_IGNORE:
|
||||
- goto out;
|
||||
- case SSH_MSG_DEBUG:
|
||||
- goto out;
|
||||
+ if (type == SSH_MSG_DISCONNECT) {
|
||||
+ /* Allowed at any time */
|
||||
+ dropbear_close("Disconnect received");
|
||||
+ }
|
||||
|
||||
- case SSH_MSG_UNIMPLEMENTED:
|
||||
- /* debugging XXX */
|
||||
- TRACE(("SSH_MSG_UNIMPLEMENTED"))
|
||||
- goto out;
|
||||
-
|
||||
- case SSH_MSG_DISCONNECT:
|
||||
- /* TODO cleanup? */
|
||||
- dropbear_close("Disconnect received");
|
||||
+ /* These packets may be received at any time,
|
||||
+ except during first kex with strict kex */
|
||||
+ if (!first_strict_kex) {
|
||||
+ switch(type) {
|
||||
+ case SSH_MSG_IGNORE:
|
||||
+ goto out;
|
||||
+ case SSH_MSG_DEBUG:
|
||||
+ goto out;
|
||||
+ case SSH_MSG_UNIMPLEMENTED:
|
||||
+ TRACE(("SSH_MSG_UNIMPLEMENTED"))
|
||||
+ goto out;
|
||||
+ }
|
||||
}
|
||||
|
||||
/* Ignore these packet types so that keepalives don't interfere with
|
||||
@@ -98,7 +101,8 @@ void process_packet() {
|
||||
if (type >= 1 && type <= 49
|
||||
&& type != SSH_MSG_SERVICE_REQUEST
|
||||
&& type != SSH_MSG_SERVICE_ACCEPT
|
||||
- && type != SSH_MSG_KEXINIT)
|
||||
+ && type != SSH_MSG_KEXINIT
|
||||
+ && !first_strict_kex)
|
||||
{
|
||||
TRACE(("unknown allowed packet during kexinit"))
|
||||
recv_unimplemented();
|
||||
diff --git a/ssh.h b/src/ssh.h
|
||||
index 1b4fec65f..ef3efdca0 100644
|
||||
--- a/ssh.h
|
||||
+++ b/ssh.h
|
||||
@@ -100,6 +100,10 @@
|
||||
#define SSH_EXT_INFO_C "ext-info-c"
|
||||
#define SSH_SERVER_SIG_ALGS "server-sig-algs"
|
||||
|
||||
+/* OpenSSH strict KEX feature */
|
||||
+#define SSH_STRICT_KEX_S "kex-strict-s-v00@openssh.com"
|
||||
+#define SSH_STRICT_KEX_C "kex-strict-c-v00@openssh.com"
|
||||
+
|
||||
/* service types */
|
||||
#define SSH_SERVICE_USERAUTH "ssh-userauth"
|
||||
#define SSH_SERVICE_USERAUTH_LEN 12
|
||||
diff --git a/svr-session.c b/src/svr-session.c
|
||||
index 769f0731d..a538e2c5c 100644
|
||||
--- a/svr-session.c
|
||||
+++ b/svr-session.c
|
||||
@@ -342,6 +342,9 @@ static void svr_algos_initialise(void) {
|
||||
algo->usable = 0;
|
||||
}
|
||||
#endif
|
||||
+ if (strcmp(algo->name, SSH_STRICT_KEX_C) == 0) {
|
||||
+ algo->usable = 0;
|
||||
+ }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,7 +24,7 @@ IMAGE_FSTYPES = "wic.vmdk wic.vhd wic.vhdx"
|
||||
|
||||
inherit core-image setuptools3
|
||||
|
||||
SRCREV ?= "387d01b0a46bf0adb3f4cb2188299f88ac58db2f"
|
||||
SRCREV ?= "f91fefe108568a1587c804c9ebc857a6fe7d8a33"
|
||||
SRC_URI = "git://git.yoctoproject.org/poky;branch=kirkstone \
|
||||
file://Yocto_Build_Appliance.vmx \
|
||||
file://Yocto_Build_Appliance.vmxf \
|
||||
|
||||
@@ -26,8 +26,8 @@ NVDCVE_API_KEY ?= ""
|
||||
# Use a negative value to skip the update
|
||||
CVE_DB_UPDATE_INTERVAL ?= "86400"
|
||||
|
||||
# Timeout for blocking socket operations, such as the connection attempt.
|
||||
CVE_SOCKET_TIMEOUT ?= "60"
|
||||
# Number of attmepts for each http query to nvd server before giving up
|
||||
CVE_DB_UPDATE_ATTEMPTS ?= "5"
|
||||
|
||||
CVE_DB_TEMP_FILE ?= "${CVE_CHECK_DB_DIR}/temp_nvdcve_2.db"
|
||||
|
||||
@@ -114,7 +114,10 @@ def cleanup_db_download(db_file, db_tmp_file):
|
||||
if os.path.exists(db_tmp_file):
|
||||
os.remove(db_tmp_file)
|
||||
|
||||
def nvd_request_next(url, api_key, args):
|
||||
def nvd_request_wait(attempt, min_wait):
|
||||
return min ( ( (2 * attempt) + min_wait ) , 30)
|
||||
|
||||
def nvd_request_next(url, attempts, api_key, args, min_wait):
|
||||
"""
|
||||
Request next part of the NVD dabase
|
||||
"""
|
||||
@@ -130,7 +133,7 @@ def nvd_request_next(url, api_key, args):
|
||||
request.add_header("apiKey", api_key)
|
||||
bb.note("Requesting %s" % request.full_url)
|
||||
|
||||
for attempt in range(5):
|
||||
for attempt in range(attempts):
|
||||
try:
|
||||
r = urllib.request.urlopen(request)
|
||||
|
||||
@@ -143,8 +146,10 @@ def nvd_request_next(url, api_key, args):
|
||||
r.close()
|
||||
|
||||
except Exception as e:
|
||||
bb.note("CVE database: received error (%s), retrying" % (e))
|
||||
time.sleep(6)
|
||||
wait_time = nvd_request_wait(attempt, min_wait)
|
||||
bb.note("CVE database: received error (%s)" % (e))
|
||||
bb.note("CVE database: retrying download after %d seconds. attempted (%d/%d)" % (wait_time, attempt+1, attempts))
|
||||
time.sleep(wait_time)
|
||||
pass
|
||||
else:
|
||||
return raw_data
|
||||
@@ -186,10 +191,16 @@ def update_db_file(db_tmp_file, d, database_time):
|
||||
index = 0
|
||||
url = d.getVar("NVDCVE_URL")
|
||||
api_key = d.getVar("NVDCVE_API_KEY") or None
|
||||
attempts = int(d.getVar("CVE_DB_UPDATE_ATTEMPTS"))
|
||||
|
||||
# Recommended by NVD
|
||||
wait_time = 6
|
||||
if api_key:
|
||||
wait_time = 2
|
||||
|
||||
while True:
|
||||
req_args['startIndex'] = index
|
||||
raw_data = nvd_request_next(url, api_key, req_args)
|
||||
raw_data = nvd_request_next(url, attempts, api_key, req_args, wait_time)
|
||||
if raw_data is None:
|
||||
# We haven't managed to download data
|
||||
return False
|
||||
@@ -209,7 +220,7 @@ def update_db_file(db_tmp_file, d, database_time):
|
||||
break
|
||||
|
||||
# Recommended by NVD
|
||||
time.sleep(6)
|
||||
time.sleep(wait_time)
|
||||
|
||||
# Update success, set the date to cve_check file.
|
||||
cve_f.write('CVE database update : %s\n\n' % datetime.date.today())
|
||||
|
||||
40
meta/recipes-core/systemd/systemd/CVE-2023-7008.patch
Normal file
40
meta/recipes-core/systemd/systemd/CVE-2023-7008.patch
Normal file
@@ -0,0 +1,40 @@
|
||||
From 3b4cc1437b51fcc0b08da8cc3f5d1175eed25eb1 Mon Sep 17 00:00:00 2001
|
||||
From: Michal Sekletar <msekleta@redhat.com>
|
||||
Date: Wed, 20 Dec 2023 16:44:14 +0100
|
||||
Subject: [PATCH] resolved: actually check authenticated flag of SOA
|
||||
transaction
|
||||
|
||||
Fixes #25676
|
||||
|
||||
Upstream-Status: Backport [https://github.com/systemd/systemd/commit/3b4cc1437b51fcc0b08da8cc3f5d1175eed25eb1]
|
||||
CVE: CVE-2023-7008
|
||||
Signed-off-by: Hitendra Prajapati <hprajapati@mvista.com>
|
||||
---
|
||||
src/resolve/resolved-dns-transaction.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/resolve/resolved-dns-transaction.c b/src/resolve/resolved-dns-transaction.c
|
||||
index f937f9f7b5..7deb598400 100644
|
||||
--- a/src/resolve/resolved-dns-transaction.c
|
||||
+++ b/src/resolve/resolved-dns-transaction.c
|
||||
@@ -2761,7 +2761,7 @@ static int dns_transaction_requires_rrsig(DnsTransaction *t, DnsResourceRecord *
|
||||
if (r == 0)
|
||||
continue;
|
||||
|
||||
- return FLAGS_SET(t->answer_query_flags, SD_RESOLVED_AUTHENTICATED);
|
||||
+ return FLAGS_SET(dt->answer_query_flags, SD_RESOLVED_AUTHENTICATED);
|
||||
}
|
||||
|
||||
return true;
|
||||
@@ -2788,7 +2788,7 @@ static int dns_transaction_requires_rrsig(DnsTransaction *t, DnsResourceRecord *
|
||||
/* We found the transaction that was supposed to find the SOA RR for us. It was
|
||||
* successful, but found no RR for us. This means we are not at a zone cut. In this
|
||||
* case, we require authentication if the SOA lookup was authenticated too. */
|
||||
- return FLAGS_SET(t->answer_query_flags, SD_RESOLVED_AUTHENTICATED);
|
||||
+ return FLAGS_SET(dt->answer_query_flags, SD_RESOLVED_AUTHENTICATED);
|
||||
}
|
||||
|
||||
return true;
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@@ -32,6 +32,7 @@ SRC_URI += "file://touchscreen.rules \
|
||||
file://CVE-2022-4415-2.patch \
|
||||
file://0001-network-remove-only-managed-configs-on-reconfigure-o.patch \
|
||||
file://0001-nspawn-make-sure-host-root-can-write-to-the-uidmappe.patch \
|
||||
file://CVE-2023-7008.patch \
|
||||
"
|
||||
|
||||
# patches needed by musl
|
||||
|
||||
@@ -54,3 +54,6 @@ do_install:append:class-target() {
|
||||
}
|
||||
|
||||
BBCLASSEXTEND = "native nativesdk"
|
||||
|
||||
# this CVE is for cloudflare zlib
|
||||
CVE_CHECK_IGNORE += "CVE-2023-6992"
|
||||
|
||||
@@ -35,6 +35,8 @@ PTEST_ENABLED:libc-musl = "0"
|
||||
|
||||
EXTRA_OECONF = "--program-prefix=eu-"
|
||||
|
||||
BUILD_CFLAGS += "-Wno-error=stringop-overflow"
|
||||
|
||||
DEPENDS_BZIP2 = "bzip2-replacement-native"
|
||||
DEPENDS_BZIP2:class-target = "bzip2"
|
||||
|
||||
|
||||
@@ -47,6 +47,7 @@ SRC_URI += "\
|
||||
file://CVE-2023-29409.patch \
|
||||
file://CVE-2023-39319.patch \
|
||||
file://CVE-2023-39318.patch \
|
||||
file://CVE-2023-39326.patch \
|
||||
"
|
||||
SRC_URI[main.sha256sum] = "a1a48b23afb206f95e7bbaa9b898d965f90826f6f1d1fc0c1d784ada0cd300fd"
|
||||
|
||||
|
||||
182
meta/recipes-devtools/go/go-1.20/CVE-2023-39326.patch
Normal file
182
meta/recipes-devtools/go/go-1.20/CVE-2023-39326.patch
Normal file
@@ -0,0 +1,182 @@
|
||||
From 6446af942e2e2b161c4ec1b60d9703a2b55dc4dd Mon Sep 17 00:00:00 2001
|
||||
From: Damien Neil <dneil@google.com>
|
||||
Date: Tue, 7 Nov 2023 10:47:56 -0800
|
||||
Subject: [PATCH] net/http: limit chunked data overhead
|
||||
|
||||
The chunked transfer encoding adds some overhead to
|
||||
the content transferred. When writing one byte per
|
||||
chunk, for example, there are five bytes of overhead
|
||||
per byte of data transferred: "1\r\nX\r\n" to send "X".
|
||||
|
||||
Chunks may include "chunk extensions",
|
||||
which we skip over and do not use.
|
||||
For example: "1;chunk extension here\r\nX\r\n".
|
||||
|
||||
A malicious sender can use chunk extensions to add
|
||||
about 4k of overhead per byte of data.
|
||||
(The maximum chunk header line size we will accept.)
|
||||
|
||||
Track the amount of overhead read in chunked data,
|
||||
and produce an error if it seems excessive.
|
||||
|
||||
Updates #64433
|
||||
Fixes #64434
|
||||
Fixes CVE-2023-39326
|
||||
|
||||
Change-Id: I40f8d70eb6f9575fb43f506eb19132ccedafcf39
|
||||
Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/2076135
|
||||
Reviewed-by: Tatiana Bradley <tatianabradley@google.com>
|
||||
Reviewed-by: Roland Shoemaker <bracewell@google.com>
|
||||
(cherry picked from commit 3473ae72ee66c60744665a24b2fde143e8964d4f)
|
||||
Reviewed-on: https://team-review.git.corp.google.com/c/golang/go-private/+/2095407
|
||||
Run-TryBot: Roland Shoemaker <bracewell@google.com>
|
||||
TryBot-Result: Security TryBots <security-trybots@go-security-trybots.iam.gserviceaccount.com>
|
||||
Reviewed-by: Damien Neil <dneil@google.com>
|
||||
Reviewed-on: https://go-review.googlesource.com/c/go/+/547355
|
||||
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
|
||||
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
|
||||
|
||||
CVE: CVE-2023-39326
|
||||
|
||||
Upstream-Status: Backport [https://github.com/golang/go/commit/6446af942e2e2b161c4ec1b60d9703a2b55dc4dd]
|
||||
|
||||
Signed-off-by: Soumya Sambu <soumya.sambu@windriver.com>
|
||||
---
|
||||
src/net/http/internal/chunked.go | 36 +++++++++++++---
|
||||
src/net/http/internal/chunked_test.go | 59 +++++++++++++++++++++++++++
|
||||
2 files changed, 89 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/src/net/http/internal/chunked.go b/src/net/http/internal/chunked.go
|
||||
index f06e572..ddbaacb 100644
|
||||
--- a/src/net/http/internal/chunked.go
|
||||
+++ b/src/net/http/internal/chunked.go
|
||||
@@ -39,7 +39,8 @@ type chunkedReader struct {
|
||||
n uint64 // unread bytes in chunk
|
||||
err error
|
||||
buf [2]byte
|
||||
- checkEnd bool // whether need to check for \r\n chunk footer
|
||||
+ checkEnd bool // whether need to check for \r\n chunk footer
|
||||
+ excess int64 // "excessive" chunk overhead, for malicious sender detection
|
||||
}
|
||||
|
||||
func (cr *chunkedReader) beginChunk() {
|
||||
@@ -49,10 +50,38 @@ func (cr *chunkedReader) beginChunk() {
|
||||
if cr.err != nil {
|
||||
return
|
||||
}
|
||||
+ cr.excess += int64(len(line)) + 2 // header, plus \r\n after the chunk data
|
||||
+ line = trimTrailingWhitespace(line)
|
||||
+ line, cr.err = removeChunkExtension(line)
|
||||
+ if cr.err != nil {
|
||||
+ return
|
||||
+ }
|
||||
cr.n, cr.err = parseHexUint(line)
|
||||
if cr.err != nil {
|
||||
return
|
||||
}
|
||||
+ // A sender who sends one byte per chunk will send 5 bytes of overhead
|
||||
+ // for every byte of data. ("1\r\nX\r\n" to send "X".)
|
||||
+ // We want to allow this, since streaming a byte at a time can be legitimate.
|
||||
+ //
|
||||
+ // A sender can use chunk extensions to add arbitrary amounts of additional
|
||||
+ // data per byte read. ("1;very long extension\r\nX\r\n" to send "X".)
|
||||
+ // We don't want to disallow extensions (although we discard them),
|
||||
+ // but we also don't want to allow a sender to reduce the signal/noise ratio
|
||||
+ // arbitrarily.
|
||||
+ //
|
||||
+ // We track the amount of excess overhead read,
|
||||
+ // and produce an error if it grows too large.
|
||||
+ //
|
||||
+ // Currently, we say that we're willing to accept 16 bytes of overhead per chunk,
|
||||
+ // plus twice the amount of real data in the chunk.
|
||||
+ cr.excess -= 16 + (2 * int64(cr.n))
|
||||
+ if cr.excess < 0 {
|
||||
+ cr.excess = 0
|
||||
+ }
|
||||
+ if cr.excess > 16*1024 {
|
||||
+ cr.err = errors.New("chunked encoding contains too much non-data")
|
||||
+ }
|
||||
if cr.n == 0 {
|
||||
cr.err = io.EOF
|
||||
}
|
||||
@@ -133,11 +162,6 @@ func readChunkLine(b *bufio.Reader) ([]byte, error) {
|
||||
if len(p) >= maxLineLength {
|
||||
return nil, ErrLineTooLong
|
||||
}
|
||||
- p = trimTrailingWhitespace(p)
|
||||
- p, err = removeChunkExtension(p)
|
||||
- if err != nil {
|
||||
- return nil, err
|
||||
- }
|
||||
return p, nil
|
||||
}
|
||||
|
||||
diff --git a/src/net/http/internal/chunked_test.go b/src/net/http/internal/chunked_test.go
|
||||
index 08152ed..5fbeb08 100644
|
||||
--- a/src/net/http/internal/chunked_test.go
|
||||
+++ b/src/net/http/internal/chunked_test.go
|
||||
@@ -211,3 +211,62 @@ func TestChunkReadPartial(t *testing.T) {
|
||||
}
|
||||
|
||||
}
|
||||
+
|
||||
+func TestChunkReaderTooMuchOverhead(t *testing.T) {
|
||||
+ // If the sender is sending 100x as many chunk header bytes as chunk data,
|
||||
+ // we should reject the stream at some point.
|
||||
+ chunk := []byte("1;")
|
||||
+ for i := 0; i < 100; i++ {
|
||||
+ chunk = append(chunk, 'a') // chunk extension
|
||||
+ }
|
||||
+ chunk = append(chunk, "\r\nX\r\n"...)
|
||||
+ const bodylen = 1 << 20
|
||||
+ r := NewChunkedReader(&funcReader{f: func(i int) ([]byte, error) {
|
||||
+ if i < bodylen {
|
||||
+ return chunk, nil
|
||||
+ }
|
||||
+ return []byte("0\r\n"), nil
|
||||
+ }})
|
||||
+ _, err := io.ReadAll(r)
|
||||
+ if err == nil {
|
||||
+ t.Fatalf("successfully read body with excessive overhead; want error")
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+func TestChunkReaderByteAtATime(t *testing.T) {
|
||||
+ // Sending one byte per chunk should not trip the excess-overhead detection.
|
||||
+ const bodylen = 1 << 20
|
||||
+ r := NewChunkedReader(&funcReader{f: func(i int) ([]byte, error) {
|
||||
+ if i < bodylen {
|
||||
+ return []byte("1\r\nX\r\n"), nil
|
||||
+ }
|
||||
+ return []byte("0\r\n"), nil
|
||||
+ }})
|
||||
+ got, err := io.ReadAll(r)
|
||||
+ if err != nil {
|
||||
+ t.Errorf("unexpected error: %v", err)
|
||||
+ }
|
||||
+ if len(got) != bodylen {
|
||||
+ t.Errorf("read %v bytes, want %v", len(got), bodylen)
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+type funcReader struct {
|
||||
+ f func(iteration int) ([]byte, error)
|
||||
+ i int
|
||||
+ b []byte
|
||||
+ err error
|
||||
+}
|
||||
+
|
||||
+func (r *funcReader) Read(p []byte) (n int, err error) {
|
||||
+ if len(r.b) == 0 && r.err == nil {
|
||||
+ r.b, r.err = r.f(r.i)
|
||||
+ r.i++
|
||||
+ }
|
||||
+ n = copy(p, r.b)
|
||||
+ r.b = r.b[n:]
|
||||
+ if len(r.b) > 0 {
|
||||
+ return n, nil
|
||||
+ }
|
||||
+ return n, r.err
|
||||
+}
|
||||
--
|
||||
2.40.0
|
||||
@@ -21,8 +21,8 @@ index f4a26f5..7bc748e 100644
|
||||
# Original versions are not saved anymore; patch generally takes care of this,
|
||||
# and if that fails, reaching for the source tarball is the safest option.
|
||||
$(CROSSPATCHED): %.applied: %.patch
|
||||
- patch -p1 -i $< && touch $@
|
||||
+ test ! -f $@ && (patch -p1 -i $< && touch $@) || echo "$@ exist"
|
||||
- $(cpatch) -p1 -i $< && touch $@
|
||||
+ test ! -f $@ && ($(cpatch) -p1 -i $< && touch $@) || echo "$@ exist"
|
||||
|
||||
# ---[ common ]-----------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -18,7 +18,7 @@ SRC_URI = "https://github.com/arsv/perl-cross/releases/download/${PV}/perl-cross
|
||||
"
|
||||
UPSTREAM_CHECK_URI = "https://github.com/arsv/perl-cross/releases/"
|
||||
|
||||
SRC_URI[perl-cross.sha256sum] = "77f13ca84a63025053852331b72d4046c1f90ded98bd45ccedea738621907335"
|
||||
SRC_URI[perl-cross.sha256sum] = "584dc54c48dca25e032b676a15bef377c1fed9de318b4fc140292a5dbf326e90"
|
||||
|
||||
S = "${WORKDIR}/perl-cross-${PV}"
|
||||
|
||||
@@ -29,7 +29,7 @@ SRC_URI:append:class-target = " \
|
||||
file://encodefix.patch \
|
||||
"
|
||||
|
||||
SRC_URI[perl.sha256sum] = "357951a491b0ba1ce3611263922feec78ccd581dddc24a446b033e25acf242a1"
|
||||
SRC_URI[perl.sha256sum] = "5b12f62863332b2a5f54102af9cdf8c010877e4bf3294911edbd594b2a1e8ede"
|
||||
|
||||
S = "${WORKDIR}/perl-${PV}"
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
From 013ff01fdf2aa6ca69a7c80a2a2996630877e4ea Mon Sep 17 00:00:00 2001
|
||||
From: Trevor Gamblin <tgamblin@baylibre.com>
|
||||
Date: Fri, 6 Oct 2023 10:59:44 -0400
|
||||
Subject: [PATCH] test_storlines: skip due to load variability
|
||||
|
||||
This is yet another test that intermittently fails on the Yocto AB when
|
||||
a worker is under heavy load, so skip it during testing.
|
||||
|
||||
Upstream-Status: Inappropriate [OE-Specific]
|
||||
|
||||
[YOCTO #14933]
|
||||
|
||||
Signed-off-by: Trevor Gamblin <tgamblin@baylibre.com>
|
||||
---
|
||||
Lib/test/test_ftplib.py | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
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):
|
||||
self.client.storbinary('stor', f, rest=r)
|
||||
self.assertEqual(self.server.handler_instance.rest, str(r))
|
||||
|
||||
+ @unittest.skip('timing related test, dependent on load')
|
||||
def test_storlines(self):
|
||||
data = RETR_DATA.replace('\r\n', '\n').encode(self.client.encoding)
|
||||
f = io.BytesIO(data)
|
||||
--
|
||||
2.41.0
|
||||
|
||||
@@ -35,6 +35,7 @@ SRC_URI = "http://www.python.org/ftp/python/${PV}/Python-${PV}.tar.xz \
|
||||
file://0001-setup.py-Do-not-detect-multiarch-paths-when-cross-co.patch \
|
||||
file://deterministic_imports.patch \
|
||||
file://0001-Avoid-shebang-overflow-on-python-config.py.patch \
|
||||
file://0001-test_storlines-skip-due-to-load-variability.patch \
|
||||
"
|
||||
|
||||
SRC_URI:append:class-native = " \
|
||||
|
||||
@@ -102,6 +102,7 @@ SRC_URI = "https://download.qemu.org/${BPN}-${PV}.tar.xz \
|
||||
file://CVE-2023-3180.patch \
|
||||
file://CVE-2021-3638.patch \
|
||||
file://CVE-2023-1544.patch \
|
||||
file://CVE-2023-5088.patch \
|
||||
"
|
||||
UPSTREAM_CHECK_REGEX = "qemu-(?P<pver>\d+(\.\d+)+)\.tar"
|
||||
|
||||
|
||||
112
meta/recipes-devtools/qemu/qemu/CVE-2023-5088.patch
Normal file
112
meta/recipes-devtools/qemu/qemu/CVE-2023-5088.patch
Normal file
@@ -0,0 +1,112 @@
|
||||
From 7d7512019fc40c577e2bdd61f114f31a9eb84a8e Mon Sep 17 00:00:00 2001
|
||||
From: Fiona Ebner <f.ebner@proxmox.com>
|
||||
Date: Wed, 6 Sep 2023 15:09:21 +0200
|
||||
Subject: [PATCH] hw/ide: reset: cancel async DMA operation before resetting
|
||||
state
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
If there is a pending DMA operation during ide_bus_reset(), the fact
|
||||
that the IDEState is already reset before the operation is canceled
|
||||
can be problematic. In particular, ide_dma_cb() might be called and
|
||||
then use the reset IDEState which contains the signature after the
|
||||
reset. When used to construct the IO operation this leads to
|
||||
ide_get_sector() returning 0 and nsector being 1. This is particularly
|
||||
bad, because a write command will thus destroy the first sector which
|
||||
often contains a partition table or similar.
|
||||
|
||||
Traces showing the unsolicited write happening with IDEState
|
||||
0x5595af6949d0 being used after reset:
|
||||
|
||||
> ahci_port_write ahci(0x5595af6923f0)[0]: port write [reg:PxSCTL] @ 0x2c: 0x00000300
|
||||
> ahci_reset_port ahci(0x5595af6923f0)[0]: reset port
|
||||
> ide_reset IDEstate 0x5595af6949d0
|
||||
> ide_reset IDEstate 0x5595af694da8
|
||||
> ide_bus_reset_aio aio_cancel
|
||||
> dma_aio_cancel dbs=0x7f64600089a0
|
||||
> dma_blk_cb dbs=0x7f64600089a0 ret=0
|
||||
> dma_complete dbs=0x7f64600089a0 ret=0 cb=0x5595acd40b30
|
||||
> ahci_populate_sglist ahci(0x5595af6923f0)[0]
|
||||
> ahci_dma_prepare_buf ahci(0x5595af6923f0)[0]: prepare buf limit=512 prepared=512
|
||||
> ide_dma_cb IDEState 0x5595af6949d0; sector_num=0 n=1 cmd=DMA WRITE
|
||||
> dma_blk_io dbs=0x7f6420802010 bs=0x5595ae2c6c30 offset=0 to_dev=1
|
||||
> dma_blk_cb dbs=0x7f6420802010 ret=0
|
||||
|
||||
> (gdb) p *qiov
|
||||
> $11 = {iov = 0x7f647c76d840, niov = 1, {{nalloc = 1, local_iov = {iov_base = 0x0,
|
||||
> iov_len = 512}}, {__pad = "\001\000\000\000\000\000\000\000\000\000\000",
|
||||
> size = 512}}}
|
||||
> (gdb) bt
|
||||
> #0 blk_aio_pwritev (blk=0x5595ae2c6c30, offset=0, qiov=0x7f6420802070, flags=0,
|
||||
> cb=0x5595ace6f0b0 <dma_blk_cb>, opaque=0x7f6420802010)
|
||||
> at ../block/block-backend.c:1682
|
||||
> #1 0x00005595ace6f185 in dma_blk_cb (opaque=0x7f6420802010, ret=<optimized out>)
|
||||
> at ../softmmu/dma-helpers.c:179
|
||||
> #2 0x00005595ace6f778 in dma_blk_io (ctx=0x5595ae0609f0,
|
||||
> sg=sg@entry=0x5595af694d00, offset=offset@entry=0, align=align@entry=512,
|
||||
> io_func=io_func@entry=0x5595ace6ee30 <dma_blk_write_io_func>,
|
||||
> io_func_opaque=io_func_opaque@entry=0x5595ae2c6c30,
|
||||
> cb=0x5595acd40b30 <ide_dma_cb>, opaque=0x5595af6949d0,
|
||||
> dir=DMA_DIRECTION_TO_DEVICE) at ../softmmu/dma-helpers.c:244
|
||||
> #3 0x00005595ace6f90a in dma_blk_write (blk=0x5595ae2c6c30,
|
||||
> sg=sg@entry=0x5595af694d00, offset=offset@entry=0, align=align@entry=512,
|
||||
> cb=cb@entry=0x5595acd40b30 <ide_dma_cb>, opaque=opaque@entry=0x5595af6949d0)
|
||||
> at ../softmmu/dma-helpers.c:280
|
||||
> #4 0x00005595acd40e18 in ide_dma_cb (opaque=0x5595af6949d0, ret=<optimized out>)
|
||||
> at ../hw/ide/core.c:953
|
||||
> #5 0x00005595ace6f319 in dma_complete (ret=0, dbs=0x7f64600089a0)
|
||||
> at ../softmmu/dma-helpers.c:107
|
||||
> #6 dma_blk_cb (opaque=0x7f64600089a0, ret=0) at ../softmmu/dma-helpers.c:127
|
||||
> #7 0x00005595ad12227d in blk_aio_complete (acb=0x7f6460005b10)
|
||||
> at ../block/block-backend.c:1527
|
||||
> #8 blk_aio_complete (acb=0x7f6460005b10) at ../block/block-backend.c:1524
|
||||
> #9 blk_aio_write_entry (opaque=0x7f6460005b10) at ../block/block-backend.c:1594
|
||||
> #10 0x00005595ad258cfb in coroutine_trampoline (i0=<optimized out>,
|
||||
> i1=<optimized out>) at ../util/coroutine-ucontext.c:177
|
||||
|
||||
CVE: CVE-2023-5088
|
||||
Upstream-Status: Backport [https://gitlab.com/qemu-project/qemu/-/commit/7d7512019fc40c577e2bdd61f114f31a9eb84a8e]
|
||||
|
||||
Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
|
||||
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
|
||||
Tested-by: simon.rowe@nutanix.com
|
||||
Message-ID: <20230906130922.142845-1-f.ebner@proxmox.com>
|
||||
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
|
||||
Signed-off-by: Sourav Pramanik <sourav.pramanik@kpit.com>
|
||||
---
|
||||
hw/ide/core.c | 14 +++++++-------
|
||||
1 file changed, 7 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/hw/ide/core.c b/hw/ide/core.c
|
||||
index b5e0dcd29b2..63ba665f3d2 100644
|
||||
--- a/hw/ide/core.c
|
||||
+++ b/hw/ide/core.c
|
||||
@@ -2515,19 +2515,19 @@ static void ide_dummy_transfer_stop(IDEState *s)
|
||||
|
||||
void ide_bus_reset(IDEBus *bus)
|
||||
{
|
||||
- bus->unit = 0;
|
||||
- bus->cmd = 0;
|
||||
- ide_reset(&bus->ifs[0]);
|
||||
- ide_reset(&bus->ifs[1]);
|
||||
- ide_clear_hob(bus);
|
||||
-
|
||||
- /* pending async DMA */
|
||||
+ /* pending async DMA - needs the IDEState before it is reset */
|
||||
if (bus->dma->aiocb) {
|
||||
trace_ide_bus_reset_aio();
|
||||
blk_aio_cancel(bus->dma->aiocb);
|
||||
bus->dma->aiocb = NULL;
|
||||
}
|
||||
|
||||
+ bus->unit = 0;
|
||||
+ bus->cmd = 0;
|
||||
+ ide_reset(&bus->ifs[0]);
|
||||
+ ide_reset(&bus->ifs[1]);
|
||||
+ ide_clear_hob(bus);
|
||||
+
|
||||
/* reset dma provider too */
|
||||
if (bus->dma->ops->reset) {
|
||||
bus->dma->ops->reset(bus->dma);
|
||||
--
|
||||
@@ -1,30 +0,0 @@
|
||||
From b9565dc2fe0c4f7daaec91b7e83bc7313dee2f4a Mon Sep 17 00:00:00 2001
|
||||
From: Khem Raj <raj.khem@gmail.com>
|
||||
Date: Mon, 13 Apr 2015 17:02:13 -0700
|
||||
Subject: [PATCH] Unset need_charset_alias when building for musl
|
||||
|
||||
localcharset uses ac_cv_gnu_library_2_1 from glibc21.m4
|
||||
which actually shoudl be fixed in gnulib and then all downstream
|
||||
projects will get it eventually. For now we apply the fix to
|
||||
coreutils
|
||||
|
||||
Upstream-Status: Pending
|
||||
|
||||
Signed-off-by: Khem Raj <raj.khem@gmail.com>
|
||||
---
|
||||
lib/gnulib.mk | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
Index: cpio-2.11/gnu/Makefile.am
|
||||
===================================================================
|
||||
--- cpio-2.11.orig/gnu/Makefile.am
|
||||
+++ cpio-2.11/gnu/Makefile.am
|
||||
@@ -734,7 +734,7 @@ install-exec-localcharset: all-local
|
||||
case '$(host_os)' in \
|
||||
darwin[56]*) \
|
||||
need_charset_alias=true ;; \
|
||||
- darwin* | cygwin* | mingw* | pw32* | cegcc*) \
|
||||
+ darwin* | cygwin* | mingw* | pw32* | cegcc* | linux-musl*) \
|
||||
need_charset_alias=false ;; \
|
||||
*) \
|
||||
need_charset_alias=true ;; \
|
||||
@@ -1,28 +0,0 @@
|
||||
From 33e6cb5a28fab3d99bd6818f8c01e6f33805390f Mon Sep 17 00:00:00 2001
|
||||
From: Sergey Poznyakoff <gray@gnu.org>
|
||||
Date: Mon, 20 Jan 2020 07:45:39 +0200
|
||||
Subject: [PATCH] src/global.c: Remove superfluous declaration of program_name
|
||||
|
||||
Upstream-Status: Backport (commit 641d3f4)
|
||||
Signed-off-by: Richard Leitner <richard.leitner@skidata.com>
|
||||
---
|
||||
src/global.c | 3 ---
|
||||
1 file changed, 3 deletions(-)
|
||||
|
||||
diff --git a/src/global.c b/src/global.c
|
||||
index fb3abe9..acf92bc 100644
|
||||
--- a/src/global.c
|
||||
+++ b/src/global.c
|
||||
@@ -184,9 +184,6 @@ unsigned int warn_option = 0;
|
||||
/* Extract to standard output? */
|
||||
bool to_stdout_option = false;
|
||||
|
||||
-/* The name this program was run with. */
|
||||
-char *program_name;
|
||||
-
|
||||
/* A pointer to either lstat or stat, depending on whether
|
||||
dereferencing of symlinks is done for input files. */
|
||||
int (*xstat) ();
|
||||
--
|
||||
2.26.2
|
||||
|
||||
@@ -1,58 +0,0 @@
|
||||
From d257e47a6c6b41ba727b196ac96c05ab91bd9d65 Mon Sep 17 00:00:00 2001
|
||||
From: Sergey Poznyakoff <gray@gnu.org>
|
||||
Date: Fri, 7 Apr 2023 11:23:37 +0300
|
||||
Subject: [PATCH 3/4] Fix calculation of CRC in copy-out mode.
|
||||
|
||||
* src/copyout.c (read_for_checksum): Fix type of the file_size argument.
|
||||
Rewrite the reading loop.
|
||||
|
||||
Original patch by Stefano Babic <sbabic@denx.de>
|
||||
|
||||
Upstream-Status: Backport [a1b2f7871c3ae5113e0102b870b15ea06a8f0e3d]
|
||||
Signed-off-by: Marek Vasut <marex@denx.de>
|
||||
---
|
||||
src/copyout.c | 16 +++++++---------
|
||||
1 file changed, 7 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/src/copyout.c b/src/copyout.c
|
||||
index 8b0beb6..f1ff351 100644
|
||||
--- a/src/copyout.c
|
||||
+++ b/src/copyout.c
|
||||
@@ -34,27 +34,25 @@
|
||||
compute and return a checksum for them. */
|
||||
|
||||
static uint32_t
|
||||
-read_for_checksum (int in_file_des, int file_size, char *file_name)
|
||||
+read_for_checksum (int in_file_des, off_t file_size, char *file_name)
|
||||
{
|
||||
uint32_t crc;
|
||||
- char buf[BUFSIZ];
|
||||
- int bytes_left;
|
||||
- int bytes_read;
|
||||
- int i;
|
||||
+ unsigned char buf[BUFSIZ];
|
||||
+ ssize_t bytes_read;
|
||||
+ ssize_t i;
|
||||
|
||||
crc = 0;
|
||||
|
||||
- for (bytes_left = file_size; bytes_left > 0; bytes_left -= bytes_read)
|
||||
+ while (file_size > 0)
|
||||
{
|
||||
bytes_read = read (in_file_des, buf, BUFSIZ);
|
||||
if (bytes_read < 0)
|
||||
error (PAXEXIT_FAILURE, errno, _("cannot read checksum for %s"), file_name);
|
||||
if (bytes_read == 0)
|
||||
break;
|
||||
- if (bytes_left < bytes_read)
|
||||
- bytes_read = bytes_left;
|
||||
- for (i = 0; i < bytes_read; ++i)
|
||||
+ for (i = 0; i < bytes_read; i++)
|
||||
crc += buf[i] & 0xff;
|
||||
+ file_size -= bytes_read;
|
||||
}
|
||||
if (lseek (in_file_des, 0L, SEEK_SET))
|
||||
error (PAXEXIT_FAILURE, errno, _("cannot read checksum for %s"), file_name);
|
||||
--
|
||||
2.39.2
|
||||
|
||||
@@ -1,312 +0,0 @@
|
||||
From 8513495ab5cfb63eb7c4c933fdf0b78c6196cd27 Mon Sep 17 00:00:00 2001
|
||||
From: Sergey Poznyakoff <gray@gnu.org>
|
||||
Date: Fri, 28 Apr 2023 15:23:46 +0300
|
||||
Subject: [PATCH 4/4] Fix appending to archives bigger than 2G
|
||||
|
||||
* src/extern.h (last_header_start): Change type to off_t.
|
||||
* src/global.c: Likewise.
|
||||
* src/util.c (prepare_append): Use off_t for file offsets.
|
||||
|
||||
Upstream-Status: Backport [0987d63384f0419b4b14aecdc6a61729b75ce86a]
|
||||
Signed-off-by: Marek Vasut <marex@denx.de>
|
||||
---
|
||||
src/extern.h | 11 ++++-----
|
||||
src/global.c | 2 +-
|
||||
src/util.c | 66 ++++++++++++++++++++++++++--------------------------
|
||||
3 files changed, 39 insertions(+), 40 deletions(-)
|
||||
|
||||
diff --git a/src/extern.h b/src/extern.h
|
||||
index 11ac6bf..12f14a9 100644
|
||||
--- a/src/extern.h
|
||||
+++ b/src/extern.h
|
||||
@@ -67,7 +67,7 @@ extern int ignore_devno_option;
|
||||
|
||||
extern bool to_stdout_option;
|
||||
|
||||
-extern int last_header_start;
|
||||
+extern off_t last_header_start;
|
||||
extern int copy_matching_files;
|
||||
extern int numeric_uid;
|
||||
extern char *pattern_file_name;
|
||||
@@ -123,7 +123,7 @@ void field_width_error (const char *filename, const char *fieldname,
|
||||
|
||||
/* copypass.c */
|
||||
void process_copy_pass (void);
|
||||
-int link_to_maj_min_ino (char *file_name, int st_dev_maj,
|
||||
+int link_to_maj_min_ino (char *file_name, int st_dev_maj,
|
||||
int st_dev_min, ino_t st_ino);
|
||||
int link_to_name (char const *link_name, char const *link_target);
|
||||
|
||||
@@ -171,7 +171,7 @@ void copy_files_tape_to_disk (int in_des, int out_des, off_t num_bytes);
|
||||
void copy_files_disk_to_tape (int in_des, int out_des, off_t num_bytes, char *filename);
|
||||
void copy_files_disk_to_disk (int in_des, int out_des, off_t num_bytes, char *filename);
|
||||
void warn_if_file_changed (char *file_name, off_t old_file_size,
|
||||
- time_t old_file_mtime);
|
||||
+ time_t old_file_mtime);
|
||||
void create_all_directories (char const *name);
|
||||
void prepare_append (int out_file_des);
|
||||
char *find_inode_file (ino_t node_num,
|
||||
@@ -185,7 +185,7 @@ void set_new_media_message (char *message);
|
||||
#ifdef HPUX_CDF
|
||||
char *add_cdf_double_slashes (char *filename);
|
||||
#endif
|
||||
-void write_nuls_to_file (off_t num_bytes, int out_des,
|
||||
+void write_nuls_to_file (off_t num_bytes, int out_des,
|
||||
void (*writer) (char *in_buf,
|
||||
int out_des, off_t num_bytes));
|
||||
#define DISK_IO_BLOCK_SIZE 512
|
||||
@@ -229,6 +229,5 @@ void delay_set_stat (char const *file_name, struct stat *st,
|
||||
mode_t invert_permissions);
|
||||
int repair_delayed_set_stat (struct cpio_file_stat *file_hdr);
|
||||
void apply_delayed_set_stat (void);
|
||||
-
|
||||
-int arf_stores_inode_p (enum archive_format arf);
|
||||
|
||||
+int arf_stores_inode_p (enum archive_format arf);
|
||||
diff --git a/src/global.c b/src/global.c
|
||||
index fb3abe9..5c9fc05 100644
|
||||
--- a/src/global.c
|
||||
+++ b/src/global.c
|
||||
@@ -114,7 +114,7 @@ int debug_flag = false;
|
||||
|
||||
/* File position of last header read. Only used during -A to determine
|
||||
where the old TRAILER!!! record started. */
|
||||
-int last_header_start = 0;
|
||||
+off_t last_header_start = 0;
|
||||
|
||||
/* With -i; if true, copy only files that match any of the given patterns;
|
||||
if false, copy only files that do not match any of the patterns. (-f) */
|
||||
diff --git a/src/util.c b/src/util.c
|
||||
index 4421b20..3be89a4 100644
|
||||
--- a/src/util.c
|
||||
+++ b/src/util.c
|
||||
@@ -60,8 +60,8 @@ tape_empty_output_buffer (int out_des)
|
||||
static long output_bytes_before_lseek = 0;
|
||||
|
||||
/* Some tape drivers seem to have a signed internal seek pointer and
|
||||
- they lose if it overflows and becomes negative (e.g. when writing
|
||||
- tapes > 2Gb). Doing an lseek (des, 0, SEEK_SET) seems to reset the
|
||||
+ they lose if it overflows and becomes negative (e.g. when writing
|
||||
+ tapes > 2Gb). Doing an lseek (des, 0, SEEK_SET) seems to reset the
|
||||
seek pointer and prevent it from overflowing. */
|
||||
if (output_is_special
|
||||
&& ( (output_bytes_before_lseek += output_size) >= 1073741824L) )
|
||||
@@ -106,7 +106,7 @@ static ssize_t sparse_write (int fildes, char *buf, size_t nbyte, bool flush);
|
||||
descriptor OUT_DES and reset `output_size' and `out_buff'.
|
||||
If `swapping_halfwords' or `swapping_bytes' is set,
|
||||
do the appropriate swapping first. Our callers have
|
||||
- to make sure to only set these flags if `output_size'
|
||||
+ to make sure to only set these flags if `output_size'
|
||||
is appropriate (a multiple of 4 for `swapping_halfwords',
|
||||
2 for `swapping_bytes'). The fact that DISK_IO_BLOCK_SIZE
|
||||
must always be a multiple of 4 helps us (and our callers)
|
||||
@@ -188,8 +188,8 @@ tape_fill_input_buffer (int in_des, int num_bytes)
|
||||
{
|
||||
#ifdef BROKEN_LONG_TAPE_DRIVER
|
||||
/* Some tape drivers seem to have a signed internal seek pointer and
|
||||
- they lose if it overflows and becomes negative (e.g. when writing
|
||||
- tapes > 4Gb). Doing an lseek (des, 0, SEEK_SET) seems to reset the
|
||||
+ they lose if it overflows and becomes negative (e.g. when writing
|
||||
+ tapes > 4Gb). Doing an lseek (des, 0, SEEK_SET) seems to reset the
|
||||
seek pointer and prevent it from overflowing. */
|
||||
if (input_is_special
|
||||
&& ( (input_bytes_before_lseek += num_bytes) >= 1073741824L) )
|
||||
@@ -332,8 +332,8 @@ tape_buffered_peek (char *peek_buf, int in_des, int num_bytes)
|
||||
|
||||
#ifdef BROKEN_LONG_TAPE_DRIVER
|
||||
/* Some tape drivers seem to have a signed internal seek pointer and
|
||||
- they lose if it overflows and becomes negative (e.g. when writing
|
||||
- tapes > 4Gb). Doing an lseek (des, 0, SEEK_SET) seems to reset the
|
||||
+ they lose if it overflows and becomes negative (e.g. when writing
|
||||
+ tapes > 4Gb). Doing an lseek (des, 0, SEEK_SET) seems to reset the
|
||||
seek pointer and prevent it from overflowing. */
|
||||
if (input_is_special
|
||||
&& ( (input_bytes_before_lseek += num_bytes) >= 1073741824L) )
|
||||
@@ -404,7 +404,7 @@ tape_toss_input (int in_des, off_t num_bytes)
|
||||
|
||||
if (crc_i_flag && only_verify_crc_flag)
|
||||
{
|
||||
- int k;
|
||||
+ int k;
|
||||
for (k = 0; k < space_left; ++k)
|
||||
crc += in_buff[k] & 0xff;
|
||||
}
|
||||
@@ -416,14 +416,14 @@ tape_toss_input (int in_des, off_t num_bytes)
|
||||
}
|
||||
|
||||
void
|
||||
-write_nuls_to_file (off_t num_bytes, int out_des,
|
||||
- void (*writer) (char *in_buf, int out_des, off_t num_bytes))
|
||||
+write_nuls_to_file (off_t num_bytes, int out_des,
|
||||
+ void (*writer) (char *in_buf, int out_des, off_t num_bytes))
|
||||
{
|
||||
off_t blocks;
|
||||
off_t extra_bytes;
|
||||
off_t i;
|
||||
static char zeros_512[512];
|
||||
-
|
||||
+
|
||||
blocks = num_bytes / sizeof zeros_512;
|
||||
extra_bytes = num_bytes % sizeof zeros_512;
|
||||
for (i = 0; i < blocks; ++i)
|
||||
@@ -603,7 +603,7 @@ create_all_directories (char const *name)
|
||||
char *dir;
|
||||
|
||||
dir = dir_name (name);
|
||||
-
|
||||
+
|
||||
if (dir == NULL)
|
||||
error (PAXEXIT_FAILURE, 0, _("virtual memory exhausted"));
|
||||
|
||||
@@ -637,9 +637,9 @@ create_all_directories (char const *name)
|
||||
void
|
||||
prepare_append (int out_file_des)
|
||||
{
|
||||
- int start_of_header;
|
||||
- int start_of_block;
|
||||
- int useful_bytes_in_block;
|
||||
+ off_t start_of_header;
|
||||
+ off_t start_of_block;
|
||||
+ size_t useful_bytes_in_block;
|
||||
char *tmp_buf;
|
||||
|
||||
start_of_header = last_header_start;
|
||||
@@ -697,8 +697,8 @@ inode_val_compare (const void *val1, const void *val2)
|
||||
const struct inode_val *ival1 = val1;
|
||||
const struct inode_val *ival2 = val2;
|
||||
return ival1->inode == ival2->inode
|
||||
- && ival1->major_num == ival2->major_num
|
||||
- && ival1->minor_num == ival2->minor_num;
|
||||
+ && ival1->major_num == ival2->major_num
|
||||
+ && ival1->minor_num == ival2->minor_num;
|
||||
}
|
||||
|
||||
static struct inode_val *
|
||||
@@ -706,10 +706,10 @@ find_inode_val (ino_t node_num, unsigned long major_num,
|
||||
unsigned long minor_num)
|
||||
{
|
||||
struct inode_val sample;
|
||||
-
|
||||
+
|
||||
if (!hash_table)
|
||||
return NULL;
|
||||
-
|
||||
+
|
||||
sample.inode = node_num;
|
||||
sample.major_num = major_num;
|
||||
sample.minor_num = minor_num;
|
||||
@@ -734,7 +734,7 @@ add_inode (ino_t node_num, char *file_name, unsigned long major_num,
|
||||
{
|
||||
struct inode_val *temp;
|
||||
struct inode_val *e = NULL;
|
||||
-
|
||||
+
|
||||
/* Create new inode record. */
|
||||
temp = (struct inode_val *) xmalloc (sizeof (struct inode_val));
|
||||
temp->inode = node_num;
|
||||
@@ -1007,7 +1007,7 @@ buf_all_zeros (char *buf, int bufsize)
|
||||
|
||||
/* Write NBYTE bytes from BUF to file descriptor FILDES, trying to
|
||||
create holes instead of writing blockfuls of zeros.
|
||||
-
|
||||
+
|
||||
Return the number of bytes written (including bytes in zero
|
||||
regions) on success, -1 on error.
|
||||
|
||||
@@ -1027,7 +1027,7 @@ sparse_write (int fildes, char *buf, size_t nbytes, bool flush)
|
||||
|
||||
enum { begin, in_zeros, not_in_zeros } state =
|
||||
delayed_seek_count ? in_zeros : begin;
|
||||
-
|
||||
+
|
||||
while (nbytes)
|
||||
{
|
||||
size_t rest = nbytes;
|
||||
@@ -1042,7 +1042,7 @@ sparse_write (int fildes, char *buf, size_t nbytes, bool flush)
|
||||
if (state == not_in_zeros)
|
||||
{
|
||||
ssize_t bytes = buf - start_ptr + rest;
|
||||
-
|
||||
+
|
||||
n = write (fildes, start_ptr, bytes);
|
||||
if (n == -1)
|
||||
return -1;
|
||||
@@ -1091,8 +1091,8 @@ sparse_write (int fildes, char *buf, size_t nbytes, bool flush)
|
||||
if (n != 1)
|
||||
return n;
|
||||
delayed_seek_count = 0;
|
||||
- }
|
||||
-
|
||||
+ }
|
||||
+
|
||||
return nwritten + seek_count;
|
||||
}
|
||||
|
||||
@@ -1222,7 +1222,7 @@ set_perms (int fd, struct cpio_file_stat *header)
|
||||
if (!no_chown_flag)
|
||||
{
|
||||
uid_t uid = CPIO_UID (header->c_uid);
|
||||
- gid_t gid = CPIO_GID (header->c_gid);
|
||||
+ gid_t gid = CPIO_GID (header->c_gid);
|
||||
if ((fchown_or_chown (fd, header->c_name, uid, gid) < 0)
|
||||
&& errno != EPERM)
|
||||
chown_error_details (header->c_name, uid, gid);
|
||||
@@ -1239,13 +1239,13 @@ set_file_times (int fd,
|
||||
const char *name, unsigned long atime, unsigned long mtime)
|
||||
{
|
||||
struct timespec ts[2];
|
||||
-
|
||||
+
|
||||
memset (&ts, 0, sizeof ts);
|
||||
|
||||
ts[0].tv_sec = atime;
|
||||
ts[1].tv_sec = mtime;
|
||||
|
||||
- /* Silently ignore EROFS because reading the file won't have upset its
|
||||
+ /* Silently ignore EROFS because reading the file won't have upset its
|
||||
timestamp if it's on a read-only filesystem. */
|
||||
if (fdutimens (fd, name, ts) < 0 && errno != EROFS)
|
||||
utime_error (name);
|
||||
@@ -1297,7 +1297,7 @@ cpio_safer_name_suffix (char *name, bool link_target, bool absolute_names,
|
||||
|
||||
/* This is a simplified form of delayed set_stat used by GNU tar.
|
||||
With the time, both forms will merge and pass to paxutils
|
||||
-
|
||||
+
|
||||
List of directories whose statuses we need to extract after we've
|
||||
finished extracting their subsidiary files. If you consider each
|
||||
contiguous subsequence of elements of the form [D]?[^D]*, where [D]
|
||||
@@ -1415,7 +1415,7 @@ cpio_mkdir (struct cpio_file_stat *file_hdr, int *setstat_delayed)
|
||||
{
|
||||
int rc;
|
||||
mode_t mode = file_hdr->c_mode;
|
||||
-
|
||||
+
|
||||
if (!(file_hdr->c_mode & S_IWUSR))
|
||||
{
|
||||
rc = mkdir (file_hdr->c_name, mode | S_IWUSR);
|
||||
@@ -1438,10 +1438,10 @@ cpio_create_dir (struct cpio_file_stat *file_hdr, int existing_dir)
|
||||
{
|
||||
int res; /* Result of various function calls. */
|
||||
int setstat_delayed = 0;
|
||||
-
|
||||
+
|
||||
if (to_stdout_option)
|
||||
return 0;
|
||||
-
|
||||
+
|
||||
/* Strip any trailing `/'s off the filename; tar puts
|
||||
them on. We might as well do it here in case anybody
|
||||
else does too, since they cause strange things to happen. */
|
||||
@@ -1530,7 +1530,7 @@ arf_stores_inode_p (enum archive_format arf)
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
-
|
||||
+
|
||||
void
|
||||
cpio_file_stat_init (struct cpio_file_stat *file_hdr)
|
||||
{
|
||||
--
|
||||
2.39.2
|
||||
|
||||
@@ -1,581 +0,0 @@
|
||||
GNU cpio through 2.13 allows attackers to execute arbitrary code via a crafted
|
||||
pattern file, because of a dstring.c ds_fgetstr integer overflow that triggers
|
||||
an out-of-bounds heap write.
|
||||
|
||||
CVE: CVE-2021-38185
|
||||
Upstream-Status: Backport
|
||||
Signed-off-by: Ross Burton <ross.burton@arm.com>
|
||||
|
||||
From e494c68a3a0951b1eaba77e2db93f71a890e15d8 Mon Sep 17 00:00:00 2001
|
||||
From: Sergey Poznyakoff <gray@gnu.org>
|
||||
Date: Sat, 7 Aug 2021 12:52:21 +0300
|
||||
Subject: [PATCH 1/3] Rewrite dynamic string support.
|
||||
|
||||
* src/dstring.c (ds_init): Take a single argument.
|
||||
(ds_free): New function.
|
||||
(ds_resize): Take a single argument. Use x2nrealloc to expand
|
||||
the storage.
|
||||
(ds_reset,ds_append,ds_concat,ds_endswith): New function.
|
||||
(ds_fgetstr): Rewrite. In particular, this fixes integer overflow.
|
||||
* src/dstring.h (dynamic_string): Keep both the allocated length
|
||||
(ds_size) and index of the next free byte in the string (ds_idx).
|
||||
(ds_init,ds_resize): Change signature.
|
||||
(ds_len): New macro.
|
||||
(ds_free,ds_reset,ds_append,ds_concat,ds_endswith): New protos.
|
||||
* src/copyin.c: Use new ds_ functions.
|
||||
* src/copyout.c: Likewise.
|
||||
* src/copypass.c: Likewise.
|
||||
* src/util.c: Likewise.
|
||||
---
|
||||
src/copyin.c | 40 +++++++++++------------
|
||||
src/copyout.c | 16 ++++-----
|
||||
src/copypass.c | 34 +++++++++----------
|
||||
src/dstring.c | 88 ++++++++++++++++++++++++++++++++++++--------------
|
||||
src/dstring.h | 31 +++++++++---------
|
||||
src/util.c | 6 ++--
|
||||
6 files changed, 123 insertions(+), 92 deletions(-)
|
||||
|
||||
diff --git a/src/copyin.c b/src/copyin.c
|
||||
index b29f348..37e503a 100644
|
||||
--- a/src/copyin.c
|
||||
+++ b/src/copyin.c
|
||||
@@ -55,11 +55,12 @@ query_rename(struct cpio_file_stat* file_hdr, FILE *tty_in, FILE *tty_out,
|
||||
char *str_res; /* Result for string function. */
|
||||
static dynamic_string new_name; /* New file name for rename option. */
|
||||
static int initialized_new_name = false;
|
||||
+
|
||||
if (!initialized_new_name)
|
||||
- {
|
||||
- ds_init (&new_name, 128);
|
||||
- initialized_new_name = true;
|
||||
- }
|
||||
+ {
|
||||
+ ds_init (&new_name);
|
||||
+ initialized_new_name = true;
|
||||
+ }
|
||||
|
||||
if (rename_flag)
|
||||
{
|
||||
@@ -779,37 +780,36 @@ long_format (struct cpio_file_stat *file_hdr, char const *link_name)
|
||||
already in `save_patterns' (from the command line) are preserved. */
|
||||
|
||||
static void
|
||||
-read_pattern_file ()
|
||||
+read_pattern_file (void)
|
||||
{
|
||||
- int max_new_patterns;
|
||||
- char **new_save_patterns;
|
||||
- int new_num_patterns;
|
||||
+ char **new_save_patterns = NULL;
|
||||
+ size_t max_new_patterns;
|
||||
+ size_t new_num_patterns;
|
||||
int i;
|
||||
- dynamic_string pattern_name;
|
||||
+ dynamic_string pattern_name = DYNAMIC_STRING_INITIALIZER;
|
||||
FILE *pattern_fp;
|
||||
|
||||
if (num_patterns < 0)
|
||||
num_patterns = 0;
|
||||
- max_new_patterns = 1 + num_patterns;
|
||||
- new_save_patterns = (char **) xmalloc (max_new_patterns * sizeof (char *));
|
||||
new_num_patterns = num_patterns;
|
||||
- ds_init (&pattern_name, 128);
|
||||
+ max_new_patterns = num_patterns;
|
||||
+ new_save_patterns = xcalloc (max_new_patterns, sizeof (new_save_patterns[0]));
|
||||
|
||||
pattern_fp = fopen (pattern_file_name, "r");
|
||||
if (pattern_fp == NULL)
|
||||
open_fatal (pattern_file_name);
|
||||
while (ds_fgetstr (pattern_fp, &pattern_name, '\n') != NULL)
|
||||
{
|
||||
- if (new_num_patterns >= max_new_patterns)
|
||||
- {
|
||||
- max_new_patterns += 1;
|
||||
- new_save_patterns = (char **)
|
||||
- xrealloc ((char *) new_save_patterns,
|
||||
- max_new_patterns * sizeof (char *));
|
||||
- }
|
||||
+ if (new_num_patterns == max_new_patterns)
|
||||
+ new_save_patterns = x2nrealloc (new_save_patterns,
|
||||
+ &max_new_patterns,
|
||||
+ sizeof (new_save_patterns[0]));
|
||||
new_save_patterns[new_num_patterns] = xstrdup (pattern_name.ds_string);
|
||||
++new_num_patterns;
|
||||
}
|
||||
+
|
||||
+ ds_free (&pattern_name);
|
||||
+
|
||||
if (ferror (pattern_fp) || fclose (pattern_fp) == EOF)
|
||||
close_error (pattern_file_name);
|
||||
|
||||
@@ -1196,7 +1196,7 @@ swab_array (char *ptr, int count)
|
||||
in the file system. */
|
||||
|
||||
void
|
||||
-process_copy_in ()
|
||||
+process_copy_in (void)
|
||||
{
|
||||
char done = false; /* True if trailer reached. */
|
||||
FILE *tty_in = NULL; /* Interactive file for rename option. */
|
||||
diff --git a/src/copyout.c b/src/copyout.c
|
||||
index 8b0beb6..26e3dda 100644
|
||||
--- a/src/copyout.c
|
||||
+++ b/src/copyout.c
|
||||
@@ -594,9 +594,10 @@ assign_string (char **pvar, char *value)
|
||||
The format of the header depends on the compatibility (-c) flag. */
|
||||
|
||||
void
|
||||
-process_copy_out ()
|
||||
+process_copy_out (void)
|
||||
{
|
||||
- dynamic_string input_name; /* Name of file read from stdin. */
|
||||
+ dynamic_string input_name = DYNAMIC_STRING_INITIALIZER;
|
||||
+ /* Name of file read from stdin. */
|
||||
struct stat file_stat; /* Stat record for file. */
|
||||
struct cpio_file_stat file_hdr = CPIO_FILE_STAT_INITIALIZER;
|
||||
/* Output header information. */
|
||||
@@ -605,7 +606,6 @@ process_copy_out ()
|
||||
char *orig_file_name = NULL;
|
||||
|
||||
/* Initialize the copy out. */
|
||||
- ds_init (&input_name, 128);
|
||||
file_hdr.c_magic = 070707;
|
||||
|
||||
/* Check whether the output file might be a tape. */
|
||||
@@ -657,14 +657,9 @@ process_copy_out ()
|
||||
{
|
||||
if (file_hdr.c_mode & CP_IFDIR)
|
||||
{
|
||||
- int len = strlen (input_name.ds_string);
|
||||
/* Make sure the name ends with a slash */
|
||||
- if (input_name.ds_string[len-1] != '/')
|
||||
- {
|
||||
- ds_resize (&input_name, len + 2);
|
||||
- input_name.ds_string[len] = '/';
|
||||
- input_name.ds_string[len+1] = 0;
|
||||
- }
|
||||
+ if (!ds_endswith (&input_name, '/'))
|
||||
+ ds_append (&input_name, '/');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -875,6 +870,7 @@ process_copy_out ()
|
||||
(unsigned long) blocks), (unsigned long) blocks);
|
||||
}
|
||||
cpio_file_stat_free (&file_hdr);
|
||||
+ ds_free (&input_name);
|
||||
}
|
||||
|
||||
|
||||
diff --git a/src/copypass.c b/src/copypass.c
|
||||
index dc13b5b..62f31c6 100644
|
||||
--- a/src/copypass.c
|
||||
+++ b/src/copypass.c
|
||||
@@ -48,10 +48,12 @@ set_copypass_perms (int fd, const char *name, struct stat *st)
|
||||
If `link_flag', link instead of copying. */
|
||||
|
||||
void
|
||||
-process_copy_pass ()
|
||||
+process_copy_pass (void)
|
||||
{
|
||||
- dynamic_string input_name; /* Name of file from stdin. */
|
||||
- dynamic_string output_name; /* Name of new file. */
|
||||
+ dynamic_string input_name = DYNAMIC_STRING_INITIALIZER;
|
||||
+ /* Name of file from stdin. */
|
||||
+ dynamic_string output_name = DYNAMIC_STRING_INITIALIZER;
|
||||
+ /* Name of new file. */
|
||||
size_t dirname_len; /* Length of `directory_name'. */
|
||||
int res; /* Result of functions. */
|
||||
char *slash; /* For moving past slashes in input name. */
|
||||
@@ -65,25 +67,18 @@ process_copy_pass ()
|
||||
created files */
|
||||
|
||||
/* Initialize the copy pass. */
|
||||
- ds_init (&input_name, 128);
|
||||
|
||||
dirname_len = strlen (directory_name);
|
||||
if (change_directory_option && !ISSLASH (directory_name[0]))
|
||||
{
|
||||
char *pwd = xgetcwd ();
|
||||
-
|
||||
- dirname_len += strlen (pwd) + 1;
|
||||
- ds_init (&output_name, dirname_len + 2);
|
||||
- strcpy (output_name.ds_string, pwd);
|
||||
- strcat (output_name.ds_string, "/");
|
||||
- strcat (output_name.ds_string, directory_name);
|
||||
+
|
||||
+ ds_concat (&output_name, pwd);
|
||||
+ ds_append (&output_name, '/');
|
||||
}
|
||||
- else
|
||||
- {
|
||||
- ds_init (&output_name, dirname_len + 2);
|
||||
- strcpy (output_name.ds_string, directory_name);
|
||||
- }
|
||||
- output_name.ds_string[dirname_len] = '/';
|
||||
+ ds_concat (&output_name, directory_name);
|
||||
+ ds_append (&output_name, '/');
|
||||
+ dirname_len = ds_len (&output_name);
|
||||
output_is_seekable = true;
|
||||
|
||||
change_dir ();
|
||||
@@ -116,8 +111,8 @@ process_copy_pass ()
|
||||
/* Make the name of the new file. */
|
||||
for (slash = input_name.ds_string; *slash == '/'; ++slash)
|
||||
;
|
||||
- ds_resize (&output_name, dirname_len + strlen (slash) + 2);
|
||||
- strcpy (output_name.ds_string + dirname_len + 1, slash);
|
||||
+ ds_reset (&output_name, dirname_len);
|
||||
+ ds_concat (&output_name, slash);
|
||||
|
||||
existing_dir = false;
|
||||
if (lstat (output_name.ds_string, &out_file_stat) == 0)
|
||||
@@ -333,6 +328,9 @@ process_copy_pass ()
|
||||
(unsigned long) blocks),
|
||||
(unsigned long) blocks);
|
||||
}
|
||||
+
|
||||
+ ds_free (&input_name);
|
||||
+ ds_free (&output_name);
|
||||
}
|
||||
|
||||
/* Try and create a hard link from FILE_NAME to another file
|
||||
diff --git a/src/dstring.c b/src/dstring.c
|
||||
index e9c063f..358f356 100644
|
||||
--- a/src/dstring.c
|
||||
+++ b/src/dstring.c
|
||||
@@ -20,8 +20,8 @@
|
||||
#if defined(HAVE_CONFIG_H)
|
||||
# include <config.h>
|
||||
#endif
|
||||
-
|
||||
#include <stdio.h>
|
||||
+#include <stdlib.h>
|
||||
#if defined(HAVE_STRING_H) || defined(STDC_HEADERS)
|
||||
#include <string.h>
|
||||
#else
|
||||
@@ -33,24 +33,41 @@
|
||||
/* Initialiaze dynamic string STRING with space for SIZE characters. */
|
||||
|
||||
void
|
||||
-ds_init (dynamic_string *string, int size)
|
||||
+ds_init (dynamic_string *string)
|
||||
+{
|
||||
+ memset (string, 0, sizeof *string);
|
||||
+}
|
||||
+
|
||||
+/* Free the dynamic string storage. */
|
||||
+
|
||||
+void
|
||||
+ds_free (dynamic_string *string)
|
||||
{
|
||||
- string->ds_length = size;
|
||||
- string->ds_string = (char *) xmalloc (size);
|
||||
+ free (string->ds_string);
|
||||
}
|
||||
|
||||
-/* Expand dynamic string STRING, if necessary, to hold SIZE characters. */
|
||||
+/* Expand dynamic string STRING, if necessary. */
|
||||
|
||||
void
|
||||
-ds_resize (dynamic_string *string, int size)
|
||||
+ds_resize (dynamic_string *string)
|
||||
{
|
||||
- if (size > string->ds_length)
|
||||
+ if (string->ds_idx == string->ds_size)
|
||||
{
|
||||
- string->ds_length = size;
|
||||
- string->ds_string = (char *) xrealloc ((char *) string->ds_string, size);
|
||||
+ string->ds_string = x2nrealloc (string->ds_string, &string->ds_size,
|
||||
+ 1);
|
||||
}
|
||||
}
|
||||
|
||||
+/* Reset the index of the dynamic string S to LEN. */
|
||||
+
|
||||
+void
|
||||
+ds_reset (dynamic_string *s, size_t len)
|
||||
+{
|
||||
+ while (len > s->ds_size)
|
||||
+ ds_resize (s);
|
||||
+ s->ds_idx = len;
|
||||
+}
|
||||
+
|
||||
/* Dynamic string S gets a string terminated by the EOS character
|
||||
(which is removed) from file F. S will increase
|
||||
in size during the function if the string from F is longer than
|
||||
@@ -61,34 +78,50 @@ ds_resize (dynamic_string *string, int size)
|
||||
char *
|
||||
ds_fgetstr (FILE *f, dynamic_string *s, char eos)
|
||||
{
|
||||
- int insize; /* Amount needed for line. */
|
||||
- int strsize; /* Amount allocated for S. */
|
||||
int next_ch;
|
||||
|
||||
/* Initialize. */
|
||||
- insize = 0;
|
||||
- strsize = s->ds_length;
|
||||
+ s->ds_idx = 0;
|
||||
|
||||
/* Read the input string. */
|
||||
- next_ch = getc (f);
|
||||
- while (next_ch != eos && next_ch != EOF)
|
||||
+ while ((next_ch = getc (f)) != eos && next_ch != EOF)
|
||||
{
|
||||
- if (insize >= strsize - 1)
|
||||
- {
|
||||
- ds_resize (s, strsize * 2 + 2);
|
||||
- strsize = s->ds_length;
|
||||
- }
|
||||
- s->ds_string[insize++] = next_ch;
|
||||
- next_ch = getc (f);
|
||||
+ ds_resize (s);
|
||||
+ s->ds_string[s->ds_idx++] = next_ch;
|
||||
}
|
||||
- s->ds_string[insize++] = '\0';
|
||||
+ ds_resize (s);
|
||||
+ s->ds_string[s->ds_idx] = '\0';
|
||||
|
||||
- if (insize == 1 && next_ch == EOF)
|
||||
+ if (s->ds_idx == 0 && next_ch == EOF)
|
||||
return NULL;
|
||||
else
|
||||
return s->ds_string;
|
||||
}
|
||||
|
||||
+void
|
||||
+ds_append (dynamic_string *s, int c)
|
||||
+{
|
||||
+ ds_resize (s);
|
||||
+ s->ds_string[s->ds_idx] = c;
|
||||
+ if (c)
|
||||
+ {
|
||||
+ s->ds_idx++;
|
||||
+ ds_resize (s);
|
||||
+ s->ds_string[s->ds_idx] = 0;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+ds_concat (dynamic_string *s, char const *str)
|
||||
+{
|
||||
+ size_t len = strlen (str);
|
||||
+ while (len + 1 > s->ds_size)
|
||||
+ ds_resize (s);
|
||||
+ memcpy (s->ds_string + s->ds_idx, str, len);
|
||||
+ s->ds_idx += len;
|
||||
+ s->ds_string[s->ds_idx] = 0;
|
||||
+}
|
||||
+
|
||||
char *
|
||||
ds_fgets (FILE *f, dynamic_string *s)
|
||||
{
|
||||
@@ -100,3 +133,10 @@ ds_fgetname (FILE *f, dynamic_string *s)
|
||||
{
|
||||
return ds_fgetstr (f, s, '\0');
|
||||
}
|
||||
+
|
||||
+/* Return true if the dynamic string S ends with character C. */
|
||||
+int
|
||||
+ds_endswith (dynamic_string *s, int c)
|
||||
+{
|
||||
+ return (s->ds_idx > 0 && s->ds_string[s->ds_idx - 1] == c);
|
||||
+}
|
||||
diff --git a/src/dstring.h b/src/dstring.h
|
||||
index b5135fe..f5b04ef 100644
|
||||
--- a/src/dstring.h
|
||||
+++ b/src/dstring.h
|
||||
@@ -17,10 +17,6 @@
|
||||
Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||
Boston, MA 02110-1301 USA. */
|
||||
|
||||
-#ifndef NULL
|
||||
-#define NULL 0
|
||||
-#endif
|
||||
-
|
||||
/* A dynamic string consists of record that records the size of an
|
||||
allocated string and the pointer to that string. The actual string
|
||||
is a normal zero byte terminated string that can be used with the
|
||||
@@ -30,22 +26,25 @@
|
||||
|
||||
typedef struct
|
||||
{
|
||||
- int ds_length; /* Actual amount of storage allocated. */
|
||||
- char *ds_string; /* String. */
|
||||
+ size_t ds_size; /* Actual amount of storage allocated. */
|
||||
+ size_t ds_idx; /* Index of the next free byte in the string. */
|
||||
+ char *ds_string; /* String storage. */
|
||||
} dynamic_string;
|
||||
|
||||
+#define DYNAMIC_STRING_INITIALIZER { 0, 0, NULL }
|
||||
|
||||
-/* Macros that look similar to the original string functions.
|
||||
- WARNING: These macros work only on pointers to dynamic string records.
|
||||
- If used with a real record, an "&" must be used to get the pointer. */
|
||||
-#define ds_strlen(s) strlen ((s)->ds_string)
|
||||
-#define ds_strcmp(s1, s2) strcmp ((s1)->ds_string, (s2)->ds_string)
|
||||
-#define ds_strncmp(s1, s2, n) strncmp ((s1)->ds_string, (s2)->ds_string, n)
|
||||
-#define ds_index(s, c) index ((s)->ds_string, c)
|
||||
-#define ds_rindex(s, c) rindex ((s)->ds_string, c)
|
||||
+void ds_init (dynamic_string *string);
|
||||
+void ds_free (dynamic_string *string);
|
||||
+void ds_reset (dynamic_string *s, size_t len);
|
||||
|
||||
-void ds_init (dynamic_string *string, int size);
|
||||
-void ds_resize (dynamic_string *string, int size);
|
||||
+/* All functions below guarantee that s->ds_string[s->ds_idx] == '\0' */
|
||||
char *ds_fgetname (FILE *f, dynamic_string *s);
|
||||
char *ds_fgets (FILE *f, dynamic_string *s);
|
||||
char *ds_fgetstr (FILE *f, dynamic_string *s, char eos);
|
||||
+void ds_append (dynamic_string *s, int c);
|
||||
+void ds_concat (dynamic_string *s, char const *str);
|
||||
+
|
||||
+#define ds_len(s) ((s)->ds_idx)
|
||||
+
|
||||
+int ds_endswith (dynamic_string *s, int c);
|
||||
+
|
||||
diff --git a/src/util.c b/src/util.c
|
||||
index 4421b20..6d6bbaa 100644
|
||||
--- a/src/util.c
|
||||
+++ b/src/util.c
|
||||
@@ -846,11 +846,9 @@ get_next_reel (int tape_des)
|
||||
FILE *tty_out; /* File for interacting with user. */
|
||||
int old_tape_des;
|
||||
char *next_archive_name;
|
||||
- dynamic_string new_name;
|
||||
+ dynamic_string new_name = DYNAMIC_STRING_INITIALIZER;
|
||||
char *str_res;
|
||||
|
||||
- ds_init (&new_name, 128);
|
||||
-
|
||||
/* Open files for interactive communication. */
|
||||
tty_in = fopen (TTY_NAME, "r");
|
||||
if (tty_in == NULL)
|
||||
@@ -925,7 +923,7 @@ get_next_reel (int tape_des)
|
||||
error (PAXEXIT_FAILURE, 0, _("internal error: tape descriptor changed from %d to %d"),
|
||||
old_tape_des, tape_des);
|
||||
|
||||
- free (new_name.ds_string);
|
||||
+ ds_free (&new_name);
|
||||
fclose (tty_in);
|
||||
fclose (tty_out);
|
||||
}
|
||||
--
|
||||
2.25.1
|
||||
|
||||
|
||||
From fb7a51bf85b8e6f045cacb4fb783db4a414741bf Mon Sep 17 00:00:00 2001
|
||||
From: Sergey Poznyakoff <gray@gnu.org>
|
||||
Date: Wed, 11 Aug 2021 18:10:38 +0300
|
||||
Subject: [PATCH 2/3] Fix previous commit
|
||||
|
||||
* src/dstring.c (ds_reset,ds_concat): Don't call ds_resize in a
|
||||
loop.
|
||||
---
|
||||
src/dstring.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/dstring.c b/src/dstring.c
|
||||
index 358f356..90c691c 100644
|
||||
--- a/src/dstring.c
|
||||
+++ b/src/dstring.c
|
||||
@@ -64,7 +64,7 @@ void
|
||||
ds_reset (dynamic_string *s, size_t len)
|
||||
{
|
||||
while (len > s->ds_size)
|
||||
- ds_resize (s);
|
||||
+ s->ds_string = x2nrealloc (s->ds_string, &s->ds_size, 1);
|
||||
s->ds_idx = len;
|
||||
}
|
||||
|
||||
@@ -116,7 +116,7 @@ ds_concat (dynamic_string *s, char const *str)
|
||||
{
|
||||
size_t len = strlen (str);
|
||||
while (len + 1 > s->ds_size)
|
||||
- ds_resize (s);
|
||||
+ s->ds_string = x2nrealloc (s->ds_string, &s->ds_size, 1);
|
||||
memcpy (s->ds_string + s->ds_idx, str, len);
|
||||
s->ds_idx += len;
|
||||
s->ds_string[s->ds_idx] = 0;
|
||||
--
|
||||
2.25.1
|
||||
|
||||
|
||||
From 86b37d74b15f9bb5fe62fd1642cc126d3ace0189 Mon Sep 17 00:00:00 2001
|
||||
From: Sergey Poznyakoff <gray@gnu.org>
|
||||
Date: Wed, 18 Aug 2021 09:41:39 +0300
|
||||
Subject: [PATCH 3/3] Fix dynamic string reallocations
|
||||
|
||||
* src/dstring.c (ds_resize): Take additional argument: number of
|
||||
bytes to leave available after ds_idx. All uses changed.
|
||||
---
|
||||
src/dstring.c | 18 ++++++++----------
|
||||
1 file changed, 8 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/src/dstring.c b/src/dstring.c
|
||||
index 90c691c..0f597cc 100644
|
||||
--- a/src/dstring.c
|
||||
+++ b/src/dstring.c
|
||||
@@ -49,9 +49,9 @@ ds_free (dynamic_string *string)
|
||||
/* Expand dynamic string STRING, if necessary. */
|
||||
|
||||
void
|
||||
-ds_resize (dynamic_string *string)
|
||||
+ds_resize (dynamic_string *string, size_t len)
|
||||
{
|
||||
- if (string->ds_idx == string->ds_size)
|
||||
+ while (len + string->ds_idx >= string->ds_size)
|
||||
{
|
||||
string->ds_string = x2nrealloc (string->ds_string, &string->ds_size,
|
||||
1);
|
||||
@@ -63,8 +63,7 @@ ds_resize (dynamic_string *string)
|
||||
void
|
||||
ds_reset (dynamic_string *s, size_t len)
|
||||
{
|
||||
- while (len > s->ds_size)
|
||||
- s->ds_string = x2nrealloc (s->ds_string, &s->ds_size, 1);
|
||||
+ ds_resize (s, len);
|
||||
s->ds_idx = len;
|
||||
}
|
||||
|
||||
@@ -86,10 +85,10 @@ ds_fgetstr (FILE *f, dynamic_string *s, char eos)
|
||||
/* Read the input string. */
|
||||
while ((next_ch = getc (f)) != eos && next_ch != EOF)
|
||||
{
|
||||
- ds_resize (s);
|
||||
+ ds_resize (s, 0);
|
||||
s->ds_string[s->ds_idx++] = next_ch;
|
||||
}
|
||||
- ds_resize (s);
|
||||
+ ds_resize (s, 0);
|
||||
s->ds_string[s->ds_idx] = '\0';
|
||||
|
||||
if (s->ds_idx == 0 && next_ch == EOF)
|
||||
@@ -101,12 +100,12 @@ ds_fgetstr (FILE *f, dynamic_string *s, char eos)
|
||||
void
|
||||
ds_append (dynamic_string *s, int c)
|
||||
{
|
||||
- ds_resize (s);
|
||||
+ ds_resize (s, 0);
|
||||
s->ds_string[s->ds_idx] = c;
|
||||
if (c)
|
||||
{
|
||||
s->ds_idx++;
|
||||
- ds_resize (s);
|
||||
+ ds_resize (s, 0);
|
||||
s->ds_string[s->ds_idx] = 0;
|
||||
}
|
||||
}
|
||||
@@ -115,8 +114,7 @@ void
|
||||
ds_concat (dynamic_string *s, char const *str)
|
||||
{
|
||||
size_t len = strlen (str);
|
||||
- while (len + 1 > s->ds_size)
|
||||
- s->ds_string = x2nrealloc (s->ds_string, &s->ds_size, 1);
|
||||
+ ds_resize (s, len);
|
||||
memcpy (s->ds_string + s->ds_idx, str, len);
|
||||
s->ds_idx += len;
|
||||
s->ds_string[s->ds_idx] = 0;
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@@ -7,15 +7,10 @@ LICENSE = "GPL-3.0-only"
|
||||
LIC_FILES_CHKSUM = "file://COPYING;md5=f27defe1e96c2e1ecd4e0c9be8967949"
|
||||
|
||||
SRC_URI = "${GNU_MIRROR}/cpio/cpio-${PV}.tar.gz \
|
||||
file://0001-Unset-need_charset_alias-when-building-for-musl.patch \
|
||||
file://0002-src-global.c-Remove-superfluous-declaration-of-progr.patch \
|
||||
file://CVE-2021-38185.patch \
|
||||
file://0003-Fix-calculation-of-CRC-in-copy-out-mode.patch \
|
||||
file://0004-Fix-appending-to-archives-bigger-than-2G.patch \
|
||||
file://0001-configure-Include-needed-header-for-major-minor-macr.patch \
|
||||
"
|
||||
|
||||
SRC_URI[md5sum] = "389c5452d667c23b5eceb206f5000810"
|
||||
SRC_URI[sha256sum] = "e87470d9c984317f658567c03bfefb6b0c829ff17dbf6b0de48d71a4c8f3db88"
|
||||
SRC_URI[sha256sum] = "145a340fd9d55f0b84779a44a12d5f79d77c99663967f8cfa168d7905ca52454"
|
||||
|
||||
inherit autotools gettext texinfo
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
From 8179be21e664cedb2e9d238cc2f6d04965e97275 Mon Sep 17 00:00:00 2001
|
||||
From: Sergey Poznyakoff <gray@gnu.org>
|
||||
Date: Thu, 11 May 2023 10:18:44 +0300
|
||||
Subject: [PATCH] configure: Include needed header for major/minor macros
|
||||
|
||||
This helps in avoiding the warning about implicit function declaration
|
||||
which is elevated as error with newer compilers e.g. clang 16
|
||||
|
||||
Signed-off-by: Khem Raj <raj.khem@gmail.com>
|
||||
|
||||
Upstream-Status: Backport [https://git.savannah.gnu.org/cgit/cpio.git/commit/?id=8179be21e664cedb2e9d238cc2f6d04965e97275]
|
||||
Signed-off-by: Soumya Sambu <soumya.sambu@windriver.com>
|
||||
---
|
||||
configure.ac | 18 ++++++++++++++++--
|
||||
1 file changed, 16 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index de479e7..c601029 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -43,8 +43,22 @@ AC_TYPE_UID_T
|
||||
AC_CHECK_TYPE(gid_t, int)
|
||||
|
||||
AC_HEADER_DIRENT
|
||||
-AX_COMPILE_CHECK_RETTYPE([major], [0])
|
||||
-AX_COMPILE_CHECK_RETTYPE([minor], [0])
|
||||
+AX_COMPILE_CHECK_RETTYPE([major], [0], [
|
||||
+#include <sys/types.h>
|
||||
+#ifdef MAJOR_IN_MKDEV
|
||||
+# include <sys/mkdev.h>
|
||||
+#endif
|
||||
+#ifdef MAJOR_IN_SYSMACROS
|
||||
+# include <sys/sysmacros.h>
|
||||
+#endif])
|
||||
+AX_COMPILE_CHECK_RETTYPE([minor], [0], [
|
||||
+#include <sys/types.h>
|
||||
+#ifdef MAJOR_IN_MKDEV
|
||||
+# include <sys/mkdev.h>
|
||||
+#endif
|
||||
+#ifdef MAJOR_IN_SYSMACROS
|
||||
+# include <sys/sysmacros.h>
|
||||
+#endif])
|
||||
|
||||
AC_CHECK_FUNCS([fchmod fchown])
|
||||
# This is needed for mingw build
|
||||
--
|
||||
2.34.1
|
||||
@@ -0,0 +1,41 @@
|
||||
From 5d2da96e81c7455338302c71a291088a8396245a Mon Sep 17 00:00:00 2001
|
||||
From: Chris Liddell <chris.liddell@artifex.com>
|
||||
Date: Mon, 16 Oct 2023 16:49:40 +0100
|
||||
Subject: [PATCH] Bug 707264: Fix tiffsep(1) requirement for seekable output
|
||||
files
|
||||
|
||||
In the device initialization redesign, tiffsep and tiffsep1 lost the requirement
|
||||
for the output files to be seekable.
|
||||
|
||||
Fixing that highlighted a problem with the error handling in
|
||||
gdev_prn_open_printer_seekable() where closing the erroring file would leave a
|
||||
dangling pointer, and lead to a crash.
|
||||
|
||||
Upstream-Status: Backport [https://git.ghostscript.com/?p=ghostpdl.git;a=commit;h=5d2da96e81c7455338302c71a291088a8396245a]
|
||||
CVE: CVE-2023-46751
|
||||
Signed-off-by: Vijay Anusuri <vanusuri@mvista.com>
|
||||
---
|
||||
base/gdevprn.c | 1 +
|
||||
devices/gdevtsep.c | 1 +
|
||||
2 files changed, 2 insertions(+)
|
||||
|
||||
--- a/base/gdevprn.c
|
||||
+++ b/base/gdevprn.c
|
||||
@@ -1251,6 +1251,7 @@ gdev_prn_open_printer_seekable(gx_device
|
||||
&& !IS_LIBCTX_STDERR(pdev->memory, gp_get_file(ppdev->file))) {
|
||||
|
||||
code = gx_device_close_output_file(pdev, ppdev->fname, ppdev->file);
|
||||
+ ppdev->file = NULL;
|
||||
if (code < 0)
|
||||
return code;
|
||||
}
|
||||
--- a/devices/gdevtsep.c
|
||||
+++ b/devices/gdevtsep.c
|
||||
@@ -738,6 +738,7 @@ tiffsep_initialize_device_procs(gx_devic
|
||||
{
|
||||
gdev_prn_initialize_device_procs(dev);
|
||||
|
||||
+ set_dev_proc(dev, output_page, gdev_prn_output_page_seekable);
|
||||
set_dev_proc(dev, open_device, tiffsep_prn_open);
|
||||
set_dev_proc(dev, close_device, tiffsep_prn_close);
|
||||
set_dev_proc(dev, map_color_rgb, tiffsep_decode_color);
|
||||
@@ -42,6 +42,7 @@ SRC_URI_BASE = "https://github.com/ArtifexSoftware/ghostpdl-downloads/releases/d
|
||||
file://CVE-2023-36664-0002.patch \
|
||||
file://CVE-2023-38559.patch \
|
||||
file://CVE-2023-43115.patch \
|
||||
file://CVE-2023-46751.patch \
|
||||
"
|
||||
|
||||
SRC_URI = "${SRC_URI_BASE} \
|
||||
|
||||
62
meta/recipes-extended/pam/libpam/CVE-2024-22365.patch
Normal file
62
meta/recipes-extended/pam/libpam/CVE-2024-22365.patch
Normal file
@@ -0,0 +1,62 @@
|
||||
From 031bb5a5d0d950253b68138b498dc93be69a64cb Mon Sep 17 00:00:00 2001
|
||||
From: Matthias Gerstner <matthias.gerstner@suse.de>
|
||||
Date: Wed, 27 Dec 2023 14:01:59 +0100
|
||||
Subject: [PATCH] pam_namespace: protect_dir(): use O_DIRECTORY to prevent
|
||||
local DoS situations
|
||||
|
||||
Without O_DIRECTORY the path crawling logic is subject to e.g. FIFOs
|
||||
being placed in user controlled directories, causing the PAM module to
|
||||
block indefinitely during `openat()`.
|
||||
|
||||
Pass O_DIRECTORY to cause the `openat()` to fail if the path does not
|
||||
refer to a directory.
|
||||
|
||||
With this the check whether the final path element is a directory
|
||||
becomes unnecessary, drop it.
|
||||
|
||||
Upstream-Status: Backport [https://github.com/linux-pam/linux-pam/commit/031bb5a5d0d950253b68138b498dc93be69a64cb]
|
||||
CVE: CVE-2024-22365
|
||||
Signed-off-by: Hitendra Prajapati <hprajapati@mvista.com>
|
||||
---
|
||||
modules/pam_namespace/pam_namespace.c | 18 +-----------------
|
||||
1 file changed, 1 insertion(+), 17 deletions(-)
|
||||
|
||||
diff --git a/modules/pam_namespace/pam_namespace.c b/modules/pam_namespace/pam_namespace.c
|
||||
index 4d4188d..d6b1d3c 100644
|
||||
--- a/modules/pam_namespace/pam_namespace.c
|
||||
+++ b/modules/pam_namespace/pam_namespace.c
|
||||
@@ -1103,7 +1103,7 @@ static int protect_dir(const char *path, mode_t mode, int do_mkdir,
|
||||
int dfd = AT_FDCWD;
|
||||
int dfd_next;
|
||||
int save_errno;
|
||||
- int flags = O_RDONLY;
|
||||
+ int flags = O_RDONLY | O_DIRECTORY;
|
||||
int rv = -1;
|
||||
struct stat st;
|
||||
|
||||
@@ -1157,22 +1157,6 @@ static int protect_dir(const char *path, mode_t mode, int do_mkdir,
|
||||
rv = openat(dfd, dir, flags);
|
||||
}
|
||||
|
||||
- if (rv != -1) {
|
||||
- if (fstat(rv, &st) != 0) {
|
||||
- save_errno = errno;
|
||||
- close(rv);
|
||||
- rv = -1;
|
||||
- errno = save_errno;
|
||||
- goto error;
|
||||
- }
|
||||
- if (!S_ISDIR(st.st_mode)) {
|
||||
- close(rv);
|
||||
- errno = ENOTDIR;
|
||||
- rv = -1;
|
||||
- goto error;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
if (flags & O_NOFOLLOW) {
|
||||
/* we are inside user-owned dir - protect */
|
||||
if (protect_mount(rv, p, idata) == -1) {
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@@ -26,6 +26,7 @@ SRC_URI = "https://github.com/linux-pam/linux-pam/releases/download/v${PV}/Linux
|
||||
file://pam-volatiles.conf \
|
||||
file://CVE-2022-28321-0002.patch \
|
||||
file://0001-pam_motd-do-not-rely-on-all-filesystems-providing-a-.patch \
|
||||
file://CVE-2024-22365.patch \
|
||||
"
|
||||
|
||||
SRC_URI[sha256sum] = "e4ec7131a91da44512574268f493c6d8ca105c87091691b8e9b56ca685d4f94d"
|
||||
|
||||
@@ -6,7 +6,7 @@ SECTION = "base"
|
||||
LICENSE = "PD & BSD-3-Clause"
|
||||
LIC_FILES_CHKSUM = "file://LICENSE;md5=c679c9d6b02bc2757b3eaf8f53c43fba"
|
||||
|
||||
PV = "2023c"
|
||||
PV = "2023d"
|
||||
|
||||
SRC_URI =" http://www.iana.org/time-zones/repository/releases/tzcode${PV}.tar.gz;name=tzcode;subdir=tz \
|
||||
http://www.iana.org/time-zones/repository/releases/tzdata${PV}.tar.gz;name=tzdata;subdir=tz \
|
||||
@@ -16,5 +16,5 @@ S = "${WORKDIR}/tz"
|
||||
|
||||
UPSTREAM_CHECK_URI = "http://www.iana.org/time-zones"
|
||||
|
||||
SRC_URI[tzcode.sha256sum] = "46d17f2bb19ad73290f03a203006152e0fa0d7b11e5b71467c4a823811b214e7"
|
||||
SRC_URI[tzdata.sha256sum] = "3f510b5d1b4ae9bb38e485aa302a776b317fb3637bdb6404c4adf7b6cadd965c"
|
||||
SRC_URI[tzcode.sha256sum] = "e9a5f9e118886d2de92b62bb05510a28cc6c058d791c93bd6b84d3292c3c161e"
|
||||
SRC_URI[tzdata.sha256sum] = "dbca21970b0a8b8c0ceceec1d7b91fa903be0f6eca5ae732b5329672232a08f3"
|
||||
|
||||
@@ -0,0 +1,79 @@
|
||||
From 0c1a93d319558fe3ab2d94f51d174b4f93810afd Mon Sep 17 00:00:00 2001
|
||||
From: Peter Hutterer <peter.hutterer@who-t.net>
|
||||
Date: Tue, 28 Nov 2023 15:19:04 +1000
|
||||
Subject: [PATCH] Xi: allocate enough XkbActions for our buttons
|
||||
|
||||
button->xkb_acts is supposed to be an array sufficiently large for all
|
||||
our buttons, not just a single XkbActions struct. Allocating
|
||||
insufficient memory here means when we memcpy() later in
|
||||
XkbSetDeviceInfo we write into memory that wasn't ours to begin with,
|
||||
leading to the usual security ooopsiedaisies.
|
||||
|
||||
CVE-2023-6377, ZDI-CAN-22412, ZDI-CAN-22413
|
||||
|
||||
This vulnerability was discovered by:
|
||||
Jan-Niklas Sohn working with Trend Micro Zero Day Initiative
|
||||
|
||||
Upstream-Status: Backport [https://gitlab.freedesktop.org/xorg/xserver/-/commit/0c1a93d319558fe3ab2d94f51d174b4f93810afd]
|
||||
CVE: CVE-2023-6377
|
||||
Signed-off-by: Vijay Anusuri <vanusuri@mvista.com>
|
||||
---
|
||||
Xi/exevents.c | 12 ++++++------
|
||||
dix/devices.c | 10 ++++++++++
|
||||
2 files changed, 16 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/Xi/exevents.c b/Xi/exevents.c
|
||||
index dcd4efb3bc..54ea11a938 100644
|
||||
--- a/Xi/exevents.c
|
||||
+++ b/Xi/exevents.c
|
||||
@@ -611,13 +611,13 @@ DeepCopyPointerClasses(DeviceIntPtr from, DeviceIntPtr to)
|
||||
}
|
||||
|
||||
if (from->button->xkb_acts) {
|
||||
- if (!to->button->xkb_acts) {
|
||||
- to->button->xkb_acts = calloc(1, sizeof(XkbAction));
|
||||
- if (!to->button->xkb_acts)
|
||||
- FatalError("[Xi] not enough memory for xkb_acts.\n");
|
||||
- }
|
||||
+ size_t maxbuttons = max(to->button->numButtons, from->button->numButtons);
|
||||
+ to->button->xkb_acts = xnfreallocarray(to->button->xkb_acts,
|
||||
+ maxbuttons,
|
||||
+ sizeof(XkbAction));
|
||||
+ memset(to->button->xkb_acts, 0, maxbuttons * sizeof(XkbAction));
|
||||
memcpy(to->button->xkb_acts, from->button->xkb_acts,
|
||||
- sizeof(XkbAction));
|
||||
+ from->button->numButtons * sizeof(XkbAction));
|
||||
}
|
||||
else {
|
||||
free(to->button->xkb_acts);
|
||||
diff --git a/dix/devices.c b/dix/devices.c
|
||||
index b063128df0..3f3224d626 100644
|
||||
--- a/dix/devices.c
|
||||
+++ b/dix/devices.c
|
||||
@@ -2539,6 +2539,8 @@ RecalculateMasterButtons(DeviceIntPtr slave)
|
||||
|
||||
if (master->button && master->button->numButtons != maxbuttons) {
|
||||
int i;
|
||||
+ int last_num_buttons = master->button->numButtons;
|
||||
+
|
||||
DeviceChangedEvent event = {
|
||||
.header = ET_Internal,
|
||||
.type = ET_DeviceChanged,
|
||||
@@ -2549,6 +2551,14 @@ RecalculateMasterButtons(DeviceIntPtr slave)
|
||||
};
|
||||
|
||||
master->button->numButtons = maxbuttons;
|
||||
+ if (last_num_buttons < maxbuttons) {
|
||||
+ master->button->xkb_acts = xnfreallocarray(master->button->xkb_acts,
|
||||
+ maxbuttons,
|
||||
+ sizeof(XkbAction));
|
||||
+ memset(&master->button->xkb_acts[last_num_buttons],
|
||||
+ 0,
|
||||
+ (maxbuttons - last_num_buttons) * sizeof(XkbAction));
|
||||
+ }
|
||||
|
||||
memcpy(&event.buttons.names, master->button->labels, maxbuttons *
|
||||
sizeof(Atom));
|
||||
--
|
||||
GitLab
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
From 14f480010a93ff962fef66a16412fafff81ad632 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Hutterer <peter.hutterer@who-t.net>
|
||||
Date: Mon, 27 Nov 2023 16:27:49 +1000
|
||||
Subject: [PATCH] randr: avoid integer truncation in length check of
|
||||
ProcRRChange*Property
|
||||
|
||||
Affected are ProcRRChangeProviderProperty and ProcRRChangeOutputProperty.
|
||||
See also xserver@8f454b79 where this same bug was fixed for the core
|
||||
protocol and XI.
|
||||
|
||||
This fixes an OOB read and the resulting information disclosure.
|
||||
|
||||
Length calculation for the request was clipped to a 32-bit integer. With
|
||||
the correct stuff->nUnits value the expected request size was
|
||||
truncated, passing the REQUEST_FIXED_SIZE check.
|
||||
|
||||
The server then proceeded with reading at least stuff->num_items bytes
|
||||
(depending on stuff->format) from the request and stuffing whatever it
|
||||
finds into the property. In the process it would also allocate at least
|
||||
stuff->nUnits bytes, i.e. 4GB.
|
||||
|
||||
CVE-2023-6478, ZDI-CAN-22561
|
||||
|
||||
This vulnerability was discovered by:
|
||||
Jan-Niklas Sohn working with Trend Micro Zero Day Initiative
|
||||
|
||||
Upstream-Status: Backport [https://gitlab.freedesktop.org/xorg/xserver/-/commit/14f480010a93ff962fef66a16412fafff81ad632]
|
||||
CVE: CVE-2023-6478
|
||||
Signed-off-by: Vijay Anusuri <vanusuri@mvista.com>
|
||||
---
|
||||
randr/rrproperty.c | 2 +-
|
||||
randr/rrproviderproperty.c | 2 +-
|
||||
2 files changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/randr/rrproperty.c b/randr/rrproperty.c
|
||||
index 25469f57b2..c4fef8a1f6 100644
|
||||
--- a/randr/rrproperty.c
|
||||
+++ b/randr/rrproperty.c
|
||||
@@ -530,7 +530,7 @@ ProcRRChangeOutputProperty(ClientPtr client)
|
||||
char format, mode;
|
||||
unsigned long len;
|
||||
int sizeInBytes;
|
||||
- int totalSize;
|
||||
+ uint64_t totalSize;
|
||||
int err;
|
||||
|
||||
REQUEST_AT_LEAST_SIZE(xRRChangeOutputPropertyReq);
|
||||
diff --git a/randr/rrproviderproperty.c b/randr/rrproviderproperty.c
|
||||
index b79c17f9bf..90c5a9a933 100644
|
||||
--- a/randr/rrproviderproperty.c
|
||||
+++ b/randr/rrproviderproperty.c
|
||||
@@ -498,7 +498,7 @@ ProcRRChangeProviderProperty(ClientPtr client)
|
||||
char format, mode;
|
||||
unsigned long len;
|
||||
int sizeInBytes;
|
||||
- int totalSize;
|
||||
+ uint64_t totalSize;
|
||||
int err;
|
||||
|
||||
REQUEST_AT_LEAST_SIZE(xRRChangeProviderPropertyReq);
|
||||
--
|
||||
GitLab
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
From 9e2ecb2af8302dedc49cb6a63ebe063c58a9e7e3 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Hutterer <peter.hutterer@who-t.net>
|
||||
Date: Thu, 14 Dec 2023 11:29:49 +1000
|
||||
Subject: [PATCH] dix: allocate enough space for logical button maps
|
||||
|
||||
Both DeviceFocusEvent and the XIQueryPointer reply contain a bit for
|
||||
each logical button currently down. Since buttons can be arbitrarily mapped
|
||||
to anything up to 255 make sure we have enough bits for the maximum mapping.
|
||||
|
||||
CVE-2023-6816, ZDI-CAN-22664, ZDI-CAN-22665
|
||||
|
||||
This vulnerability was discovered by:
|
||||
Jan-Niklas Sohn working with Trend Micro Zero Day Initiative
|
||||
|
||||
Upstream-Status: Backport [https://gitlab.freedesktop.org/xorg/xserver/-/commit/9e2ecb2af8302dedc49cb6a63ebe063c58a9e7e3]
|
||||
CVE: CVE-2023-6816
|
||||
Signed-off-by: Vijay Anusuri <vanusuri@mvista.com>
|
||||
---
|
||||
Xi/xiquerypointer.c | 3 +--
|
||||
dix/enterleave.c | 5 +++--
|
||||
2 files changed, 4 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/Xi/xiquerypointer.c b/Xi/xiquerypointer.c
|
||||
index 5b77b1a444..2b05ac5f39 100644
|
||||
--- a/Xi/xiquerypointer.c
|
||||
+++ b/Xi/xiquerypointer.c
|
||||
@@ -149,8 +149,7 @@ ProcXIQueryPointer(ClientPtr client)
|
||||
if (pDev->button) {
|
||||
int i;
|
||||
|
||||
- rep.buttons_len =
|
||||
- bytes_to_int32(bits_to_bytes(pDev->button->numButtons));
|
||||
+ rep.buttons_len = bytes_to_int32(bits_to_bytes(256)); /* button map up to 255 */
|
||||
rep.length += rep.buttons_len;
|
||||
buttons = calloc(rep.buttons_len, 4);
|
||||
if (!buttons)
|
||||
diff --git a/dix/enterleave.c b/dix/enterleave.c
|
||||
index 867ec74363..ded8679d76 100644
|
||||
--- a/dix/enterleave.c
|
||||
+++ b/dix/enterleave.c
|
||||
@@ -784,8 +784,9 @@ DeviceFocusEvent(DeviceIntPtr dev, int type, int mode, int detail,
|
||||
|
||||
mouse = IsFloating(dev) ? dev : GetMaster(dev, MASTER_POINTER);
|
||||
|
||||
- /* XI 2 event */
|
||||
- btlen = (mouse->button) ? bits_to_bytes(mouse->button->numButtons) : 0;
|
||||
+ /* XI 2 event contains the logical button map - maps are CARD8
|
||||
+ * so we need 256 bits for the possibly maximum mapping */
|
||||
+ btlen = (mouse->button) ? bits_to_bytes(256) : 0;
|
||||
btlen = bytes_to_int32(btlen);
|
||||
len = sizeof(xXIFocusInEvent) + btlen * 4;
|
||||
|
||||
--
|
||||
GitLab
|
||||
|
||||
@@ -0,0 +1,87 @@
|
||||
From ece23be888a93b741aa1209d1dbf64636109d6a5 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Hutterer <peter.hutterer@who-t.net>
|
||||
Date: Mon, 18 Dec 2023 14:27:50 +1000
|
||||
Subject: [PATCH] dix: Allocate sufficient xEvents for our DeviceStateNotify
|
||||
|
||||
If a device has both a button class and a key class and numButtons is
|
||||
zero, we can get an OOB write due to event under-allocation.
|
||||
|
||||
This function seems to assume a device has either keys or buttons, not
|
||||
both. It has two virtually identical code paths, both of which assume
|
||||
they're applying to the first event in the sequence.
|
||||
|
||||
A device with both a key and button class triggered a logic bug - only
|
||||
one xEvent was allocated but the deviceStateNotify pointer was pushed on
|
||||
once per type. So effectively this logic code:
|
||||
|
||||
int count = 1;
|
||||
if (button && nbuttons > 32) count++;
|
||||
if (key && nbuttons > 0) count++;
|
||||
if (key && nkeys > 32) count++; // this is basically always true
|
||||
// count is at 2 for our keys + zero button device
|
||||
|
||||
ev = alloc(count * sizeof(xEvent));
|
||||
FixDeviceStateNotify(ev);
|
||||
if (button)
|
||||
FixDeviceStateNotify(ev++);
|
||||
if (key)
|
||||
FixDeviceStateNotify(ev++); // santa drops into the wrong chimney here
|
||||
|
||||
If the device has more than 3 valuators, the OOB is pushed back - we're
|
||||
off by one so it will happen when the last deviceValuator event is
|
||||
written instead.
|
||||
|
||||
Fix this by allocating the maximum number of events we may allocate.
|
||||
Note that the current behavior is not protocol-correct anyway, this
|
||||
patch fixes only the allocation issue.
|
||||
|
||||
Note that this issue does not trigger if the device has at least one
|
||||
button. While the server does not prevent a button class with zero
|
||||
buttons, it is very unlikely.
|
||||
|
||||
CVE-2024-0229, ZDI-CAN-22678
|
||||
|
||||
This vulnerability was discovered by:
|
||||
Jan-Niklas Sohn working with Trend Micro Zero Day Initiative
|
||||
|
||||
Upstream-Status: Backport [https://gitlab.freedesktop.org/xorg/xserver/-/commit/ece23be888a93b741aa1209d1dbf64636109d6a5]
|
||||
CVE: CVE-2024-0229
|
||||
Signed-off-by: Vijay Anusuri <vanusuri@mvista.com>
|
||||
---
|
||||
dix/enterleave.c | 6 +++---
|
||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/dix/enterleave.c b/dix/enterleave.c
|
||||
index ded8679d76..17964b00a4 100644
|
||||
--- a/dix/enterleave.c
|
||||
+++ b/dix/enterleave.c
|
||||
@@ -675,7 +675,8 @@ static void
|
||||
DeliverStateNotifyEvent(DeviceIntPtr dev, WindowPtr win)
|
||||
{
|
||||
int evcount = 1;
|
||||
- deviceStateNotify *ev, *sev;
|
||||
+ deviceStateNotify sev[6 + (MAX_VALUATORS + 2)/3];
|
||||
+ deviceStateNotify *ev;
|
||||
deviceKeyStateNotify *kev;
|
||||
deviceButtonStateNotify *bev;
|
||||
|
||||
@@ -714,7 +715,7 @@ DeliverStateNotifyEvent(DeviceIntPtr dev, WindowPtr win)
|
||||
}
|
||||
}
|
||||
|
||||
- sev = ev = xallocarray(evcount, sizeof(xEvent));
|
||||
+ ev = sev;
|
||||
FixDeviceStateNotify(dev, ev, NULL, NULL, NULL, first);
|
||||
|
||||
if (b != NULL) {
|
||||
@@ -770,7 +771,6 @@ DeliverStateNotifyEvent(DeviceIntPtr dev, WindowPtr win)
|
||||
|
||||
DeliverEventsToWindow(dev, win, (xEvent *) sev, evcount,
|
||||
DeviceStateNotifyMask, NullGrab);
|
||||
- free(sev);
|
||||
}
|
||||
|
||||
void
|
||||
--
|
||||
GitLab
|
||||
|
||||
@@ -0,0 +1,221 @@
|
||||
From 219c54b8a3337456ce5270ded6a67bcde53553d5 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Hutterer <peter.hutterer@who-t.net>
|
||||
Date: Mon, 18 Dec 2023 12:26:20 +1000
|
||||
Subject: [PATCH] dix: fix DeviceStateNotify event calculation
|
||||
|
||||
The previous code only made sense if one considers buttons and keys to
|
||||
be mutually exclusive on a device. That is not necessarily true, causing
|
||||
a number of issues.
|
||||
|
||||
This function allocates and fills in the number of xEvents we need to
|
||||
send the device state down the wire. This is split across multiple
|
||||
32-byte devices including one deviceStateNotify event and optional
|
||||
deviceKeyStateNotify, deviceButtonStateNotify and (possibly multiple)
|
||||
deviceValuator events.
|
||||
|
||||
The previous behavior would instead compose a sequence
|
||||
of [state, buttonstate, state, keystate, valuator...]. This is not
|
||||
protocol correct, and on top of that made the code extremely convoluted.
|
||||
|
||||
Fix this by streamlining: add both button and key into the deviceStateNotify
|
||||
and then append the key state and button state, followed by the
|
||||
valuators. Finally, the deviceValuator events contain up to 6 valuators
|
||||
per event but we only ever sent through 3 at a time. Let's double that
|
||||
troughput.
|
||||
|
||||
CVE-2024-0229, ZDI-CAN-22678
|
||||
|
||||
This vulnerability was discovered by:
|
||||
Jan-Niklas Sohn working with Trend Micro Zero Day Initiative
|
||||
|
||||
Upstream-Status: Backport [https://gitlab.freedesktop.org/xorg/xserver/-/commit/219c54b8a3337456ce5270ded6a67bcde53553d5]
|
||||
CVE: CVE-2024-0229
|
||||
Signed-off-by: Vijay Anusuri <vanusuri@mvista.com>
|
||||
---
|
||||
dix/enterleave.c | 121 ++++++++++++++++++++---------------------------
|
||||
1 file changed, 52 insertions(+), 69 deletions(-)
|
||||
|
||||
diff --git a/dix/enterleave.c b/dix/enterleave.c
|
||||
index 17964b00a4..7b7ba1098b 100644
|
||||
--- a/dix/enterleave.c
|
||||
+++ b/dix/enterleave.c
|
||||
@@ -615,9 +615,15 @@ FixDeviceValuator(DeviceIntPtr dev, deviceValuator * ev, ValuatorClassPtr v,
|
||||
|
||||
ev->type = DeviceValuator;
|
||||
ev->deviceid = dev->id;
|
||||
- ev->num_valuators = nval < 3 ? nval : 3;
|
||||
+ ev->num_valuators = nval < 6 ? nval : 6;
|
||||
ev->first_valuator = first;
|
||||
switch (ev->num_valuators) {
|
||||
+ case 6:
|
||||
+ ev->valuator2 = v->axisVal[first + 5];
|
||||
+ case 5:
|
||||
+ ev->valuator2 = v->axisVal[first + 4];
|
||||
+ case 4:
|
||||
+ ev->valuator2 = v->axisVal[first + 3];
|
||||
case 3:
|
||||
ev->valuator2 = v->axisVal[first + 2];
|
||||
case 2:
|
||||
@@ -626,7 +632,6 @@ FixDeviceValuator(DeviceIntPtr dev, deviceValuator * ev, ValuatorClassPtr v,
|
||||
ev->valuator0 = v->axisVal[first];
|
||||
break;
|
||||
}
|
||||
- first += ev->num_valuators;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -646,7 +651,7 @@ FixDeviceStateNotify(DeviceIntPtr dev, deviceStateNotify * ev, KeyClassPtr k,
|
||||
ev->num_buttons = b->numButtons;
|
||||
memcpy((char *) ev->buttons, (char *) b->down, 4);
|
||||
}
|
||||
- else if (k) {
|
||||
+ if (k) {
|
||||
ev->classes_reported |= (1 << KeyClass);
|
||||
ev->num_keys = k->xkbInfo->desc->max_key_code -
|
||||
k->xkbInfo->desc->min_key_code;
|
||||
@@ -670,15 +675,26 @@ FixDeviceStateNotify(DeviceIntPtr dev, deviceStateNotify * ev, KeyClassPtr k,
|
||||
}
|
||||
}
|
||||
|
||||
-
|
||||
+/**
|
||||
+ * The device state notify event is split across multiple 32-byte events.
|
||||
+ * The first one contains the first 32 button state bits, the first 32
|
||||
+ * key state bits, and the first 3 valuator values.
|
||||
+ *
|
||||
+ * If a device has more than that, the server sends out:
|
||||
+ * - one deviceButtonStateNotify for buttons 32 and above
|
||||
+ * - one deviceKeyStateNotify for keys 32 and above
|
||||
+ * - one deviceValuator event per 6 valuators above valuator 4
|
||||
+ *
|
||||
+ * All events but the last one have the deviceid binary ORed with MORE_EVENTS,
|
||||
+ */
|
||||
static void
|
||||
DeliverStateNotifyEvent(DeviceIntPtr dev, WindowPtr win)
|
||||
{
|
||||
+ /* deviceStateNotify, deviceKeyStateNotify, deviceButtonStateNotify
|
||||
+ * and one deviceValuator for each 6 valuators */
|
||||
+ deviceStateNotify sev[3 + (MAX_VALUATORS + 6)/6];
|
||||
int evcount = 1;
|
||||
- deviceStateNotify sev[6 + (MAX_VALUATORS + 2)/3];
|
||||
- deviceStateNotify *ev;
|
||||
- deviceKeyStateNotify *kev;
|
||||
- deviceButtonStateNotify *bev;
|
||||
+ deviceStateNotify *ev = sev;
|
||||
|
||||
KeyClassPtr k;
|
||||
ButtonClassPtr b;
|
||||
@@ -691,82 +707,49 @@ DeliverStateNotifyEvent(DeviceIntPtr dev, WindowPtr win)
|
||||
|
||||
if ((b = dev->button) != NULL) {
|
||||
nbuttons = b->numButtons;
|
||||
- if (nbuttons > 32)
|
||||
+ if (nbuttons > 32) /* first 32 are encoded in deviceStateNotify */
|
||||
evcount++;
|
||||
}
|
||||
if ((k = dev->key) != NULL) {
|
||||
nkeys = k->xkbInfo->desc->max_key_code - k->xkbInfo->desc->min_key_code;
|
||||
- if (nkeys > 32)
|
||||
+ if (nkeys > 32) /* first 32 are encoded in deviceStateNotify */
|
||||
evcount++;
|
||||
- if (nbuttons > 0) {
|
||||
- evcount++;
|
||||
- }
|
||||
}
|
||||
if ((v = dev->valuator) != NULL) {
|
||||
nval = v->numAxes;
|
||||
-
|
||||
- if (nval > 3)
|
||||
- evcount++;
|
||||
- if (nval > 6) {
|
||||
- if (!(k && b))
|
||||
- evcount++;
|
||||
- if (nval > 9)
|
||||
- evcount += ((nval - 7) / 3);
|
||||
- }
|
||||
+ /* first three are encoded in deviceStateNotify, then
|
||||
+ * it's 6 per deviceValuator event */
|
||||
+ evcount += ((nval - 3) + 6)/6;
|
||||
}
|
||||
|
||||
- ev = sev;
|
||||
- FixDeviceStateNotify(dev, ev, NULL, NULL, NULL, first);
|
||||
-
|
||||
- if (b != NULL) {
|
||||
- FixDeviceStateNotify(dev, ev++, NULL, b, v, first);
|
||||
- first += 3;
|
||||
- nval -= 3;
|
||||
- if (nbuttons > 32) {
|
||||
- (ev - 1)->deviceid |= MORE_EVENTS;
|
||||
- bev = (deviceButtonStateNotify *) ev++;
|
||||
- bev->type = DeviceButtonStateNotify;
|
||||
- bev->deviceid = dev->id;
|
||||
- memcpy((char *) &bev->buttons[4], (char *) &b->down[4],
|
||||
- DOWN_LENGTH - 4);
|
||||
- }
|
||||
- if (nval > 0) {
|
||||
- (ev - 1)->deviceid |= MORE_EVENTS;
|
||||
- FixDeviceValuator(dev, (deviceValuator *) ev++, v, first);
|
||||
- first += 3;
|
||||
- nval -= 3;
|
||||
- }
|
||||
+ BUG_RETURN(evcount <= ARRAY_SIZE(sev));
|
||||
+
|
||||
+ FixDeviceStateNotify(dev, ev, k, b, v, first);
|
||||
+
|
||||
+ if (b != NULL && nbuttons > 32) {
|
||||
+ deviceButtonStateNotify *bev = (deviceButtonStateNotify *) ++ev;
|
||||
+ (ev - 1)->deviceid |= MORE_EVENTS;
|
||||
+ bev->type = DeviceButtonStateNotify;
|
||||
+ bev->deviceid = dev->id;
|
||||
+ memcpy((char *) &bev->buttons[4], (char *) &b->down[4],
|
||||
+ DOWN_LENGTH - 4);
|
||||
}
|
||||
|
||||
- if (k != NULL) {
|
||||
- FixDeviceStateNotify(dev, ev++, k, NULL, v, first);
|
||||
- first += 3;
|
||||
- nval -= 3;
|
||||
- if (nkeys > 32) {
|
||||
- (ev - 1)->deviceid |= MORE_EVENTS;
|
||||
- kev = (deviceKeyStateNotify *) ev++;
|
||||
- kev->type = DeviceKeyStateNotify;
|
||||
- kev->deviceid = dev->id;
|
||||
- memmove((char *) &kev->keys[0], (char *) &k->down[4], 28);
|
||||
- }
|
||||
- if (nval > 0) {
|
||||
- (ev - 1)->deviceid |= MORE_EVENTS;
|
||||
- FixDeviceValuator(dev, (deviceValuator *) ev++, v, first);
|
||||
- first += 3;
|
||||
- nval -= 3;
|
||||
- }
|
||||
+ if (k != NULL && nkeys > 32) {
|
||||
+ deviceKeyStateNotify *kev = (deviceKeyStateNotify *) ++ev;
|
||||
+ (ev - 1)->deviceid |= MORE_EVENTS;
|
||||
+ kev->type = DeviceKeyStateNotify;
|
||||
+ kev->deviceid = dev->id;
|
||||
+ memmove((char *) &kev->keys[0], (char *) &k->down[4], 28);
|
||||
}
|
||||
|
||||
+ first = 3;
|
||||
+ nval -= 3;
|
||||
while (nval > 0) {
|
||||
- FixDeviceStateNotify(dev, ev++, NULL, NULL, v, first);
|
||||
- first += 3;
|
||||
- nval -= 3;
|
||||
- if (nval > 0) {
|
||||
- (ev - 1)->deviceid |= MORE_EVENTS;
|
||||
- FixDeviceValuator(dev, (deviceValuator *) ev++, v, first);
|
||||
- first += 3;
|
||||
- nval -= 3;
|
||||
- }
|
||||
+ ev->deviceid |= MORE_EVENTS;
|
||||
+ FixDeviceValuator(dev, (deviceValuator *) ++ev, v, first);
|
||||
+ first += 6;
|
||||
+ nval -= 6;
|
||||
}
|
||||
|
||||
DeliverEventsToWindow(dev, win, (xEvent *) sev, evcount,
|
||||
--
|
||||
GitLab
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
From df3c65706eb169d5938df0052059f3e0d5981b74 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Hutterer <peter.hutterer@who-t.net>
|
||||
Date: Thu, 21 Dec 2023 13:48:10 +1000
|
||||
Subject: [PATCH] Xi: when creating a new ButtonClass, set the number of
|
||||
buttons
|
||||
|
||||
There's a racy sequence where a master device may copy the button class
|
||||
from the slave, without ever initializing numButtons. This leads to a
|
||||
device with zero buttons but a button class which is invalid.
|
||||
|
||||
Let's copy the numButtons value from the source - by definition if we
|
||||
don't have a button class yet we do not have any other slave devices
|
||||
with more than this number of buttons anyway.
|
||||
|
||||
CVE-2024-0229, ZDI-CAN-22678
|
||||
|
||||
This vulnerability was discovered by:
|
||||
Jan-Niklas Sohn working with Trend Micro Zero Day Initiative
|
||||
|
||||
Upstream-Status: Backport [https://gitlab.freedesktop.org/xorg/xserver/-/commit/df3c65706eb169d5938df0052059f3e0d5981b74]
|
||||
CVE: CVE-2024-0229
|
||||
Signed-off-by: Vijay Anusuri <vanusuri@mvista.com>
|
||||
---
|
||||
Xi/exevents.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/Xi/exevents.c b/Xi/exevents.c
|
||||
index 54ea11a938..e161714682 100644
|
||||
--- a/Xi/exevents.c
|
||||
+++ b/Xi/exevents.c
|
||||
@@ -605,6 +605,7 @@ DeepCopyPointerClasses(DeviceIntPtr from, DeviceIntPtr to)
|
||||
to->button = calloc(1, sizeof(ButtonClassRec));
|
||||
if (!to->button)
|
||||
FatalError("[Xi] no memory for class shift.\n");
|
||||
+ to->button->numButtons = from->button->numButtons;
|
||||
}
|
||||
else
|
||||
classes->button = NULL;
|
||||
--
|
||||
GitLab
|
||||
|
||||
@@ -0,0 +1,45 @@
|
||||
From 37539cb0bfe4ed96d4499bf371e6b1a474a740fe Mon Sep 17 00:00:00 2001
|
||||
From: Peter Hutterer <peter.hutterer@who-t.net>
|
||||
Date: Thu, 21 Dec 2023 14:10:11 +1000
|
||||
Subject: [PATCH] Xi: require a pointer and keyboard device for
|
||||
XIAttachToMaster
|
||||
|
||||
If we remove a master device and specify which other master devices
|
||||
attached slaves should be returned to, enforce that those two are
|
||||
indeeed a pointer and a keyboard.
|
||||
|
||||
Otherwise we can try to attach the keyboards to pointers and vice versa,
|
||||
leading to possible crashes later.
|
||||
|
||||
Upstream-Status: Backport [https://gitlab.freedesktop.org/xorg/xserver/-/commit/37539cb0bfe4ed96d4499bf371e6b1a474a740fe]
|
||||
CVE: CVE-2024-0229
|
||||
Signed-off-by: Vijay Anusuri <vanusuri@mvista.com>
|
||||
---
|
||||
Xi/xichangehierarchy.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/Xi/xichangehierarchy.c b/Xi/xichangehierarchy.c
|
||||
index 504defe566..d2d985848d 100644
|
||||
--- a/Xi/xichangehierarchy.c
|
||||
+++ b/Xi/xichangehierarchy.c
|
||||
@@ -270,7 +270,7 @@ remove_master(ClientPtr client, xXIRemoveMasterInfo * r, int flags[MAXDEVICES])
|
||||
if (rc != Success)
|
||||
goto unwind;
|
||||
|
||||
- if (!IsMaster(newptr)) {
|
||||
+ if (!IsMaster(newptr) || !IsPointerDevice(newptr)) {
|
||||
client->errorValue = r->return_pointer;
|
||||
rc = BadDevice;
|
||||
goto unwind;
|
||||
@@ -281,7 +281,7 @@ remove_master(ClientPtr client, xXIRemoveMasterInfo * r, int flags[MAXDEVICES])
|
||||
if (rc != Success)
|
||||
goto unwind;
|
||||
|
||||
- if (!IsMaster(newkeybd)) {
|
||||
+ if (!IsMaster(newkeybd) || !IsKeyboardDevice(newkeybd)) {
|
||||
client->errorValue = r->return_keyboard;
|
||||
rc = BadDevice;
|
||||
goto unwind;
|
||||
--
|
||||
GitLab
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
From e5e8586a12a3ec915673edffa10dc8fe5e15dac3 Mon Sep 17 00:00:00 2001
|
||||
From: Olivier Fourdan <ofourdan@redhat.com>
|
||||
Date: Wed, 6 Dec 2023 12:09:41 +0100
|
||||
Subject: [PATCH] glx: Call XACE hooks on the GLX buffer
|
||||
|
||||
The XSELINUX code will label resources at creation by checking the
|
||||
access mode. When the access mode is DixCreateAccess, it will call the
|
||||
function to label the new resource SELinuxLabelResource().
|
||||
|
||||
However, GLX buffers do not go through the XACE hooks when created,
|
||||
hence leaving the resource actually unlabeled.
|
||||
|
||||
When, later, the client tries to create another resource using that
|
||||
drawable (like a GC for example), the XSELINUX code would try to use
|
||||
the security ID of that object which has never been labeled, get a NULL
|
||||
pointer and crash when checking whether the requested permissions are
|
||||
granted for subject security ID.
|
||||
|
||||
To avoid the issue, make sure to call the XACE hooks when creating the
|
||||
GLX buffers.
|
||||
|
||||
Credit goes to Donn Seeley <donn@xmission.com> for providing the patch.
|
||||
|
||||
CVE-2024-0408
|
||||
|
||||
Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
|
||||
Acked-by: Peter Hutterer <peter.hutterer@who-t.net>
|
||||
|
||||
Upstream-Status: Backport [https://gitlab.freedesktop.org/xorg/xserver/-/commit/e5e8586a12a3ec915673edffa10dc8fe5e15dac3]
|
||||
CVE: CVE-2024-0408
|
||||
Signed-off-by: Vijay Anusuri <vanusuri@mvista.com>
|
||||
---
|
||||
glx/glxcmds.c | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
diff --git a/glx/glxcmds.c b/glx/glxcmds.c
|
||||
index fc26a2e345..1e46d0c723 100644
|
||||
--- a/glx/glxcmds.c
|
||||
+++ b/glx/glxcmds.c
|
||||
@@ -48,6 +48,7 @@
|
||||
#include "indirect_util.h"
|
||||
#include "protocol-versions.h"
|
||||
#include "glxvndabi.h"
|
||||
+#include "xace.h"
|
||||
|
||||
static char GLXServerVendorName[] = "SGI";
|
||||
|
||||
@@ -1392,6 +1393,13 @@ DoCreatePbuffer(ClientPtr client, int screenNum, XID fbconfigId,
|
||||
if (!pPixmap)
|
||||
return BadAlloc;
|
||||
|
||||
+ err = XaceHook(XACE_RESOURCE_ACCESS, client, glxDrawableId, RT_PIXMAP,
|
||||
+ pPixmap, RT_NONE, NULL, DixCreateAccess);
|
||||
+ if (err != Success) {
|
||||
+ (*pGlxScreen->pScreen->DestroyPixmap) (pPixmap);
|
||||
+ return err;
|
||||
+ }
|
||||
+
|
||||
/* Assign the pixmap the same id as the pbuffer and add it as a
|
||||
* resource so it and the DRI2 drawable will be reclaimed when the
|
||||
* pbuffer is destroyed. */
|
||||
--
|
||||
GitLab
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
From 2ef0f1116c65d5cb06d7b6d83f8a1aea702c94f7 Mon Sep 17 00:00:00 2001
|
||||
From: Olivier Fourdan <ofourdan@redhat.com>
|
||||
Date: Wed, 6 Dec 2023 11:51:56 +0100
|
||||
Subject: [PATCH] ephyr,xwayland: Use the proper private key for cursor
|
||||
|
||||
The cursor in DIX is actually split in two parts, the cursor itself and
|
||||
the cursor bits, each with their own devPrivates.
|
||||
|
||||
The cursor itself includes the cursor bits, meaning that the cursor bits
|
||||
devPrivates in within structure of the cursor.
|
||||
|
||||
Both Xephyr and Xwayland were using the private key for the cursor bits
|
||||
to store the data for the cursor, and when using XSELINUX which comes
|
||||
with its own special devPrivates, the data stored in that cursor bits'
|
||||
devPrivates would interfere with the XSELINUX devPrivates data and the
|
||||
SELINUX security ID would point to some other unrelated data, causing a
|
||||
crash in the XSELINUX code when trying to (re)use the security ID.
|
||||
|
||||
CVE-2024-0409
|
||||
|
||||
Signed-off-by: Olivier Fourdan <ofourdan@redhat.com>
|
||||
Reviewed-by: Peter Hutterer <peter.hutterer@who-t.net>
|
||||
|
||||
Upstream-Status: Backport [https://gitlab.freedesktop.org/xorg/xserver/-/commit/2ef0f1116c65d5cb06d7b6d83f8a1aea702c94f7]
|
||||
CVE: CVE-2024-0409
|
||||
Signed-off-by: Vijay Anusuri <vanusuri@mvista.com>
|
||||
---
|
||||
hw/kdrive/ephyr/ephyrcursor.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/hw/kdrive/ephyr/ephyrcursor.c b/hw/kdrive/ephyr/ephyrcursor.c
|
||||
index f991899..3f192d0 100644
|
||||
--- a/hw/kdrive/ephyr/ephyrcursor.c
|
||||
+++ b/hw/kdrive/ephyr/ephyrcursor.c
|
||||
@@ -246,7 +246,7 @@ miPointerSpriteFuncRec EphyrPointerSpriteFuncs = {
|
||||
Bool
|
||||
ephyrCursorInit(ScreenPtr screen)
|
||||
{
|
||||
- if (!dixRegisterPrivateKey(&ephyrCursorPrivateKey, PRIVATE_CURSOR_BITS,
|
||||
+ if (!dixRegisterPrivateKey(&ephyrCursorPrivateKey, PRIVATE_CURSOR,
|
||||
sizeof(ephyrCursorRec)))
|
||||
return FALSE;
|
||||
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@@ -0,0 +1,113 @@
|
||||
From 4a5e9b1895627d40d26045bd0b7ef3dce503cbd1 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Hutterer <peter.hutterer@who-t.net>
|
||||
Date: Thu, 4 Jan 2024 10:01:24 +1000
|
||||
Subject: [PATCH] Xi: flush hierarchy events after adding/removing master
|
||||
devices
|
||||
|
||||
The `XISendDeviceHierarchyEvent()` function allocates space to store up
|
||||
to `MAXDEVICES` (256) `xXIHierarchyInfo` structures in `info`.
|
||||
|
||||
If a device with a given ID was removed and a new device with the same
|
||||
ID added both in the same operation, the single device ID will lead to
|
||||
two info structures being written to `info`.
|
||||
|
||||
Since this case can occur for every device ID at once, a total of two
|
||||
times `MAXDEVICES` info structures might be written to the allocation.
|
||||
|
||||
To avoid it, once one add/remove master is processed, send out the
|
||||
device hierarchy event for the current state and continue. That event
|
||||
thus only ever has exactly one of either added/removed in it (and
|
||||
optionally slave attached/detached).
|
||||
|
||||
CVE-2024-21885, ZDI-CAN-22744
|
||||
|
||||
This vulnerability was discovered by:
|
||||
Jan-Niklas Sohn working with Trend Micro Zero Day Initiative
|
||||
|
||||
Upstream-Status: Backport [https://gitlab.freedesktop.org/xorg/xserver/-/commit/4a5e9b1895627d40d26045bd0b7ef3dce503cbd1]
|
||||
CVE: CVE-2024-21885
|
||||
Signed-off-by: Vijay Anusuri <vanusuri@mvista.com>
|
||||
---
|
||||
Xi/xichangehierarchy.c | 27 ++++++++++++++++++++++-----
|
||||
1 file changed, 22 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/Xi/xichangehierarchy.c b/Xi/xichangehierarchy.c
|
||||
index d2d985848d..72d00451e3 100644
|
||||
--- a/Xi/xichangehierarchy.c
|
||||
+++ b/Xi/xichangehierarchy.c
|
||||
@@ -416,6 +416,11 @@ ProcXIChangeHierarchy(ClientPtr client)
|
||||
size_t len; /* length of data remaining in request */
|
||||
int rc = Success;
|
||||
int flags[MAXDEVICES] = { 0 };
|
||||
+ enum {
|
||||
+ NO_CHANGE,
|
||||
+ FLUSH,
|
||||
+ CHANGED,
|
||||
+ } changes = NO_CHANGE;
|
||||
|
||||
REQUEST(xXIChangeHierarchyReq);
|
||||
REQUEST_AT_LEAST_SIZE(xXIChangeHierarchyReq);
|
||||
@@ -465,8 +470,9 @@ ProcXIChangeHierarchy(ClientPtr client)
|
||||
rc = add_master(client, c, flags);
|
||||
if (rc != Success)
|
||||
goto unwind;
|
||||
- }
|
||||
+ changes = FLUSH;
|
||||
break;
|
||||
+ }
|
||||
case XIRemoveMaster:
|
||||
{
|
||||
xXIRemoveMasterInfo *r = (xXIRemoveMasterInfo *) any;
|
||||
@@ -475,8 +481,9 @@ ProcXIChangeHierarchy(ClientPtr client)
|
||||
rc = remove_master(client, r, flags);
|
||||
if (rc != Success)
|
||||
goto unwind;
|
||||
- }
|
||||
+ changes = FLUSH;
|
||||
break;
|
||||
+ }
|
||||
case XIDetachSlave:
|
||||
{
|
||||
xXIDetachSlaveInfo *c = (xXIDetachSlaveInfo *) any;
|
||||
@@ -485,8 +492,9 @@ ProcXIChangeHierarchy(ClientPtr client)
|
||||
rc = detach_slave(client, c, flags);
|
||||
if (rc != Success)
|
||||
goto unwind;
|
||||
- }
|
||||
+ changes = CHANGED;
|
||||
break;
|
||||
+ }
|
||||
case XIAttachSlave:
|
||||
{
|
||||
xXIAttachSlaveInfo *c = (xXIAttachSlaveInfo *) any;
|
||||
@@ -495,16 +503,25 @@ ProcXIChangeHierarchy(ClientPtr client)
|
||||
rc = attach_slave(client, c, flags);
|
||||
if (rc != Success)
|
||||
goto unwind;
|
||||
+ changes = CHANGED;
|
||||
+ break;
|
||||
}
|
||||
+ default:
|
||||
break;
|
||||
}
|
||||
|
||||
+ if (changes == FLUSH) {
|
||||
+ XISendDeviceHierarchyEvent(flags);
|
||||
+ memset(flags, 0, sizeof(flags));
|
||||
+ changes = NO_CHANGE;
|
||||
+ }
|
||||
+
|
||||
len -= any->length * 4;
|
||||
any = (xXIAnyHierarchyChangeInfo *) ((char *) any + any->length * 4);
|
||||
}
|
||||
|
||||
unwind:
|
||||
-
|
||||
- XISendDeviceHierarchyEvent(flags);
|
||||
+ if (changes != NO_CHANGE)
|
||||
+ XISendDeviceHierarchyEvent(flags);
|
||||
return rc;
|
||||
}
|
||||
--
|
||||
GitLab
|
||||
|
||||
@@ -0,0 +1,74 @@
|
||||
From bc1fdbe46559dd947674375946bbef54dd0ce36b Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?Jos=C3=A9=20Exp=C3=B3sito?= <jexposit@redhat.com>
|
||||
Date: Fri, 22 Dec 2023 18:28:31 +0100
|
||||
Subject: [PATCH] Xi: do not keep linked list pointer during recursion
|
||||
|
||||
The `DisableDevice()` function is called whenever an enabled device
|
||||
is disabled and it moves the device from the `inputInfo.devices` linked
|
||||
list to the `inputInfo.off_devices` linked list.
|
||||
|
||||
However, its link/unlink operation has an issue during the recursive
|
||||
call to `DisableDevice()` due to the `prev` pointer pointing to a
|
||||
removed device.
|
||||
|
||||
This issue leads to a length mismatch between the total number of
|
||||
devices and the number of device in the list, leading to a heap
|
||||
overflow and, possibly, to local privilege escalation.
|
||||
|
||||
Simplify the code that checked whether the device passed to
|
||||
`DisableDevice()` was in `inputInfo.devices` or not and find the
|
||||
previous device after the recursion.
|
||||
|
||||
CVE-2024-21886, ZDI-CAN-22840
|
||||
|
||||
This vulnerability was discovered by:
|
||||
Jan-Niklas Sohn working with Trend Micro Zero Day Initiative
|
||||
|
||||
Upstream-Status: Backport [https://gitlab.freedesktop.org/xorg/xserver/-/commit/bc1fdbe46559dd947674375946bbef54dd0ce36b]
|
||||
CVE: CVE-2024-21886
|
||||
Signed-off-by: Vijay Anusuri <vanusuri@mvista.com>
|
||||
---
|
||||
dix/devices.c | 15 ++++++++++++---
|
||||
1 file changed, 12 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/dix/devices.c b/dix/devices.c
|
||||
index dca98c8d1b..389d28a23c 100644
|
||||
--- a/dix/devices.c
|
||||
+++ b/dix/devices.c
|
||||
@@ -453,14 +453,20 @@ DisableDevice(DeviceIntPtr dev, BOOL sendevent)
|
||||
{
|
||||
DeviceIntPtr *prev, other;
|
||||
BOOL enabled;
|
||||
+ BOOL dev_in_devices_list = FALSE;
|
||||
int flags[MAXDEVICES] = { 0 };
|
||||
|
||||
if (!dev->enabled)
|
||||
return TRUE;
|
||||
|
||||
- for (prev = &inputInfo.devices;
|
||||
- *prev && (*prev != dev); prev = &(*prev)->next);
|
||||
- if (*prev != dev)
|
||||
+ for (other = inputInfo.devices; other; other = other->next) {
|
||||
+ if (other == dev) {
|
||||
+ dev_in_devices_list = TRUE;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ if (!dev_in_devices_list)
|
||||
return FALSE;
|
||||
|
||||
TouchEndPhysicallyActiveTouches(dev);
|
||||
@@ -511,6 +517,9 @@ DisableDevice(DeviceIntPtr dev, BOOL sendevent)
|
||||
LeaveWindow(dev);
|
||||
SetFocusOut(dev);
|
||||
|
||||
+ for (prev = &inputInfo.devices;
|
||||
+ *prev && (*prev != dev); prev = &(*prev)->next);
|
||||
+
|
||||
*prev = dev->next;
|
||||
dev->next = inputInfo.off_devices;
|
||||
inputInfo.off_devices = dev;
|
||||
--
|
||||
GitLab
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
From 26769aa71fcbe0a8403b7fb13b7c9010cc07c3a8 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Hutterer <peter.hutterer@who-t.net>
|
||||
Date: Fri, 5 Jan 2024 09:40:27 +1000
|
||||
Subject: [PATCH] dix: when disabling a master, float disabled slaved devices
|
||||
too
|
||||
|
||||
Disabling a master device floats all slave devices but we didn't do this
|
||||
to already-disabled slave devices. As a result those devices kept their
|
||||
reference to the master device resulting in access to already freed
|
||||
memory if the master device was removed before the corresponding slave
|
||||
device.
|
||||
|
||||
And to match this behavior, also forcibly reset that pointer during
|
||||
CloseDownDevices().
|
||||
|
||||
Related to CVE-2024-21886, ZDI-CAN-22840
|
||||
|
||||
Upstream-Status: Backport [https://gitlab.freedesktop.org/xorg/xserver/-/commit/26769aa71fcbe0a8403b7fb13b7c9010cc07c3a8]
|
||||
CVE: CVE-2024-21886
|
||||
Signed-off-by: Vijay Anusuri <vanusuri@mvista.com>
|
||||
---
|
||||
dix/devices.c | 12 ++++++++++++
|
||||
1 file changed, 12 insertions(+)
|
||||
|
||||
diff --git a/dix/devices.c b/dix/devices.c
|
||||
index 389d28a23c..84a6406d13 100644
|
||||
--- a/dix/devices.c
|
||||
+++ b/dix/devices.c
|
||||
@@ -483,6 +483,13 @@ DisableDevice(DeviceIntPtr dev, BOOL sendevent)
|
||||
flags[other->id] |= XISlaveDetached;
|
||||
}
|
||||
}
|
||||
+
|
||||
+ for (other = inputInfo.off_devices; other; other = other->next) {
|
||||
+ if (!IsMaster(other) && GetMaster(other, MASTER_ATTACHED) == dev) {
|
||||
+ AttachDevice(NULL, other, NULL);
|
||||
+ flags[other->id] |= XISlaveDetached;
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
else {
|
||||
for (other = inputInfo.devices; other; other = other->next) {
|
||||
@@ -1088,6 +1095,11 @@ CloseDownDevices(void)
|
||||
dev->master = NULL;
|
||||
}
|
||||
|
||||
+ for (dev = inputInfo.off_devices; dev; dev = dev->next) {
|
||||
+ if (!IsMaster(dev) && !IsFloating(dev))
|
||||
+ dev->master = NULL;
|
||||
+ }
|
||||
+
|
||||
CloseDeviceList(&inputInfo.devices);
|
||||
CloseDeviceList(&inputInfo.off_devices);
|
||||
|
||||
--
|
||||
GitLab
|
||||
|
||||
@@ -4,6 +4,18 @@ SRC_URI += "file://0001-xf86pciBus.c-use-Intel-ddx-only-for-pre-gen4-hardwar.pat
|
||||
file://0001-Avoid-duplicate-definitions-of-IOPortBase.patch \
|
||||
file://CVE-2023-5367.patch \
|
||||
file://CVE-2023-5380.patch \
|
||||
file://CVE-2023-6377.patch \
|
||||
file://CVE-2023-6478.patch \
|
||||
file://CVE-2023-6816.patch \
|
||||
file://CVE-2024-0229-1.patch \
|
||||
file://CVE-2024-0229-2.patch \
|
||||
file://CVE-2024-0229-3.patch \
|
||||
file://CVE-2024-0229-4.patch \
|
||||
file://CVE-2024-21885.patch \
|
||||
file://CVE-2024-21886-1.patch \
|
||||
file://CVE-2024-21886-2.patch \
|
||||
file://CVE-2024-0408.patch \
|
||||
file://CVE-2024-0409.patch \
|
||||
"
|
||||
SRC_URI[sha256sum] = "38aadb735650c8024ee25211c190bf8aad844c5f59632761ab1ef4c4d5aeb152"
|
||||
|
||||
|
||||
@@ -147,7 +147,7 @@ LIC_FILES_CHKSUM = "file://LICENCE.Abilis;md5=b5ee3f410780e56711ad48eadc22b8bc \
|
||||
"
|
||||
# WHENCE checksum is defined separately to ease overriding it if
|
||||
# class-devupstream is selected.
|
||||
WHENCE_CHKSUM = "41f9a48bf27971b126a36f9344594dcd"
|
||||
WHENCE_CHKSUM = "ceb5248746d24d165b603e71b288cf75"
|
||||
|
||||
# These are not common licenses, set NO_GENERIC_LICENSE for them
|
||||
# so that the license files will be copied from fetched source
|
||||
@@ -231,7 +231,7 @@ SRC_URI:class-devupstream = "git://git.kernel.org/pub/scm/linux/kernel/git/firmw
|
||||
# Pin this to the 20220509 release, override this in local.conf
|
||||
SRCREV:class-devupstream ?= "b19cbdca78ab2adfd210c91be15a22568e8b8cae"
|
||||
|
||||
SRC_URI[sha256sum] = "88d46c543847ee3b03404d4941d91c92974690ee1f6fdcbee9cef3e5f97db688"
|
||||
SRC_URI[sha256sum] = "c98d200fc4a3120de1a594713ce34e135819dff23e883a4ed387863ba25679c7"
|
||||
|
||||
inherit allarch
|
||||
|
||||
@@ -4,7 +4,7 @@ Date: Sat, 12 Nov 2022 16:12:00 +0100
|
||||
Subject: [PATCH] avcodec/rpzaenc: stop accessing out of bounds frame
|
||||
|
||||
Upstream-Status: Backport [https://github.com/FFmpeg/FFmpeg/commit/92f9b28ed84a77138105475beba16c146bdaf984]
|
||||
|
||||
CVE: CVE-2022-3964
|
||||
Signed-off-by: <narpat.mali@windriver.com>
|
||||
|
||||
---
|
||||
|
||||
@@ -5,6 +5,7 @@ Subject: [PATCH] avcodec/smcenc: stop accessing out of bounds frame
|
||||
|
||||
Upstream-Status: Backport [https://github.com/FFmpeg/FFmpeg/commit/13c13109759090b7f7182480d075e13b36ed8edd]
|
||||
|
||||
CVE: CVE-2022-3965
|
||||
Signed-off-by: <narpat.mali@windriver.com>
|
||||
|
||||
---
|
||||
|
||||
31
meta/recipes-multimedia/libtiff/tiff/CVE-2023-6228.patch
Normal file
31
meta/recipes-multimedia/libtiff/tiff/CVE-2023-6228.patch
Normal file
@@ -0,0 +1,31 @@
|
||||
From 1e7d217a323eac701b134afc4ae39b6bdfdbc96a Mon Sep 17 00:00:00 2001
|
||||
From: Su_Laus <sulau@freenet.de>
|
||||
Date: Wed, 17 Jan 2024 06:38:24 +0000
|
||||
Subject: [PATCH] codec of input image is available, independently from codec
|
||||
check of output image and return with error if not.
|
||||
|
||||
Fixes #606.
|
||||
|
||||
CVE: CVE-2023-6228
|
||||
Upstream-Status: Backport [https://gitlab.com/libtiff/libtiff/-/commit/1e7d217a323eac701b134afc4ae39b6bdfdbc96a]
|
||||
|
||||
Signed-off-by: Yogita Urade <yogita.urade@windriver.com>
|
||||
---
|
||||
tools/tiffcp.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/tools/tiffcp.c b/tools/tiffcp.c
|
||||
index 34b6ef2..17c6524 100644
|
||||
--- a/tools/tiffcp.c
|
||||
+++ b/tools/tiffcp.c
|
||||
@@ -724,6 +724,8 @@ tiffcp(TIFF* in, TIFF* out)
|
||||
else
|
||||
CopyField(TIFFTAG_COMPRESSION, compression);
|
||||
TIFFGetFieldDefaulted(in, TIFFTAG_COMPRESSION, &input_compression);
|
||||
+ if (!TIFFIsCODECConfigured(input_compression))
|
||||
+ return FALSE;
|
||||
TIFFGetFieldDefaulted(in, TIFFTAG_PHOTOMETRIC, &input_photometric);
|
||||
if (input_compression == COMPRESSION_JPEG) {
|
||||
/* Force conversion to RGB */
|
||||
--
|
||||
2.40.0
|
||||
@@ -47,6 +47,7 @@ SRC_URI = "http://download.osgeo.org/libtiff/tiff-${PV}.tar.gz \
|
||||
file://CVE-2023-1916.patch \
|
||||
file://CVE-2023-40745.patch \
|
||||
file://CVE-2023-41175.patch \
|
||||
file://CVE-2023-6228.patch \
|
||||
"
|
||||
|
||||
SRC_URI[sha256sum] = "0e46e5acb087ce7d1ac53cf4f56a09b221537fc86dfc5daaad1c2e89e1b37ac8"
|
||||
|
||||
@@ -1,39 +0,0 @@
|
||||
From 0c667188e0c6cda615a036b8a2b4125f2c404dde Mon Sep 17 00:00:00 2001
|
||||
From: SaltyMilk <soufiane.elmelcaoui@gmail.com>
|
||||
Date: Mon, 10 Jul 2023 21:43:28 +0200
|
||||
Subject: [PATCH] fopen: optimize
|
||||
|
||||
Closes #11419
|
||||
|
||||
Upstream-Status: Backport [https://github.com/curl/curl/commit/0c667188e0c6cda615a036b8a2b4125f2c404dde]
|
||||
CVE: CVE-2023-32001
|
||||
Signed-off-by: Ashish Sharma <asharma@mvista.com>
|
||||
|
||||
|
||||
lib/fopen.c | 12 ++++++------
|
||||
1 file changed, 6 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/lib/fopen.c b/lib/fopen.c
|
||||
index c9c9e3d6e73a2..b6e3cadddef65 100644
|
||||
--- a/lib/fopen.c
|
||||
+++ b/lib/fopen.c
|
||||
@@ -56,13 +56,13 @@ CURLcode Curl_fopen(struct Curl_easy *data, const char *filename,
|
||||
int fd = -1;
|
||||
*tempname = NULL;
|
||||
|
||||
- if(stat(filename, &sb) == -1 || !S_ISREG(sb.st_mode)) {
|
||||
- /* a non-regular file, fallback to direct fopen() */
|
||||
- *fh = fopen(filename, FOPEN_WRITETEXT);
|
||||
- if(*fh)
|
||||
- return CURLE_OK;
|
||||
+ *fh = fopen(filename, FOPEN_WRITETEXT);
|
||||
+ if(!*fh)
|
||||
goto fail;
|
||||
- }
|
||||
+ if(fstat(fileno(*fh), &sb) == -1 || !S_ISREG(sb.st_mode))
|
||||
+ return CURLE_OK;
|
||||
+ fclose(*fh);
|
||||
+ *fh = NULL;
|
||||
|
||||
result = Curl_rand_hex(data, randsuffix, sizeof(randsuffix));
|
||||
if(result)
|
||||
52
meta/recipes-support/curl/curl/CVE-2023-46218.patch
Normal file
52
meta/recipes-support/curl/curl/CVE-2023-46218.patch
Normal file
@@ -0,0 +1,52 @@
|
||||
Backport of:
|
||||
|
||||
From 2b0994c29a721c91c572cff7808c572a24d251eb Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Stenberg <daniel@haxx.se>
|
||||
Date: Thu, 23 Nov 2023 08:15:47 +0100
|
||||
Subject: [PATCH] cookie: lowercase the domain names before PSL checks
|
||||
|
||||
Reported-by: Harry Sintonen
|
||||
|
||||
Closes #12387
|
||||
|
||||
CVE: CVE-2023-46218
|
||||
Upstream-Status: Backport [https://github.com/curl/curl/commit/2b0994c29a721c91c57]
|
||||
Signed-off-by: Poonam Jadhav <poonam.jadhav@kpit.com>
|
||||
---
|
||||
lib/cookie.c | 24 ++++++++++++++++--------
|
||||
1 file changed, 16 insertions(+), 8 deletions(-)
|
||||
|
||||
--- a/lib/cookie.c
|
||||
+++ b/lib/cookie.c
|
||||
@@ -1044,15 +1044,23 @@ Curl_cookie_add(struct Curl_easy *data,
|
||||
* dereference it.
|
||||
*/
|
||||
if(data && (domain && co->domain && !Curl_host_is_ipnum(co->domain))) {
|
||||
- const psl_ctx_t *psl = Curl_psl_use(data);
|
||||
- int acceptable;
|
||||
-
|
||||
- if(psl) {
|
||||
- acceptable = psl_is_cookie_domain_acceptable(psl, domain, co->domain);
|
||||
- Curl_psl_release(data);
|
||||
+ bool acceptable = FALSE;
|
||||
+ char lcase[256];
|
||||
+ char lcookie[256];
|
||||
+ size_t dlen = strlen(domain);
|
||||
+ size_t clen = strlen(co->domain);
|
||||
+ if((dlen < sizeof(lcase)) && (clen < sizeof(lcookie))) {
|
||||
+ const psl_ctx_t *psl = Curl_psl_use(data);
|
||||
+ if(psl) {
|
||||
+ /* the PSL check requires lowercase domain name and pattern */
|
||||
+ Curl_strntolower(lcase, domain, dlen + 1);
|
||||
+ Curl_strntolower(lcookie, co->domain, clen + 1);
|
||||
+ acceptable = psl_is_cookie_domain_acceptable(psl, lcase, lcookie);
|
||||
+ Curl_psl_release(data);
|
||||
+ }
|
||||
+ else
|
||||
+ acceptable = !bad_domain(domain);
|
||||
}
|
||||
- else
|
||||
- acceptable = !bad_domain(domain);
|
||||
|
||||
if(!acceptable) {
|
||||
infof(data, "cookie '%s' dropped, domain '%s' must not "
|
||||
@@ -51,9 +51,9 @@ SRC_URI = "https://curl.se/download/${BP}.tar.xz \
|
||||
file://CVE-2023-28321.patch \
|
||||
file://CVE-2023-28322-1.patch \
|
||||
file://CVE-2023-28322-2.patch \
|
||||
file://CVE-2023-32001.patch \
|
||||
file://CVE-2023-38545.patch \
|
||||
file://CVE-2023-38546.patch \
|
||||
file://CVE-2023-46218.patch \
|
||||
"
|
||||
SRC_URI[sha256sum] = "0aaa12d7bd04b0966254f2703ce80dd5c38dbbd76af0297d3d690cdce58a583c"
|
||||
|
||||
|
||||
125
meta/recipes-support/gnutls/gnutls/CVE-2024-0553.patch
Normal file
125
meta/recipes-support/gnutls/gnutls/CVE-2024-0553.patch
Normal file
@@ -0,0 +1,125 @@
|
||||
From 40dbbd8de499668590e8af51a15799fbc430595e Mon Sep 17 00:00:00 2001
|
||||
From: Daiki Ueno <ueno@gnu.org>
|
||||
Date: Wed, 10 Jan 2024 19:13:17 +0900
|
||||
Subject: [PATCH] rsa-psk: minimize branching after decryption
|
||||
|
||||
This moves any non-trivial code between gnutls_privkey_decrypt_data2
|
||||
and the function return in _gnutls_proc_rsa_psk_client_kx up until the
|
||||
decryption. This also avoids an extra memcpy to session->key.key.
|
||||
|
||||
Signed-off-by: Daiki Ueno <ueno@gnu.org>
|
||||
|
||||
Upstream-Status: Backport [https://gitlab.com/gnutls/gnutls/-/commit/40dbbd8de499668590e8af51a15799fbc430595e]
|
||||
CVE: CVE-2024-0553
|
||||
Signed-off-by: Vijay Anusuri <vanusuri@mvista.com>
|
||||
---
|
||||
lib/auth/rsa_psk.c | 68 ++++++++++++++++++++++++----------------------
|
||||
1 file changed, 35 insertions(+), 33 deletions(-)
|
||||
|
||||
diff --git a/lib/auth/rsa_psk.c b/lib/auth/rsa_psk.c
|
||||
index 93c2dc9..c6cfb92 100644
|
||||
--- a/lib/auth/rsa_psk.c
|
||||
+++ b/lib/auth/rsa_psk.c
|
||||
@@ -269,7 +269,6 @@ _gnutls_proc_rsa_psk_client_kx(gnutls_session_t session, uint8_t * data,
|
||||
int ret, dsize;
|
||||
ssize_t data_size = _data_size;
|
||||
gnutls_psk_server_credentials_t cred;
|
||||
- gnutls_datum_t premaster_secret = { NULL, 0 };
|
||||
volatile uint8_t ver_maj, ver_min;
|
||||
|
||||
cred = (gnutls_psk_server_credentials_t)
|
||||
@@ -329,24 +328,48 @@ _gnutls_proc_rsa_psk_client_kx(gnutls_session_t session, uint8_t * data,
|
||||
ver_maj = _gnutls_get_adv_version_major(session);
|
||||
ver_min = _gnutls_get_adv_version_minor(session);
|
||||
|
||||
- premaster_secret.data = gnutls_malloc(GNUTLS_MASTER_SIZE);
|
||||
- if (premaster_secret.data == NULL) {
|
||||
+ /* Find the key of this username. A random value will be
|
||||
+ * filled in if the key is not found.
|
||||
+ */
|
||||
+ ret = _gnutls_psk_pwd_find_entry(session, info->username,
|
||||
+ strlen(info->username), &pwd_psk);
|
||||
+ if (ret < 0)
|
||||
+ return gnutls_assert_val(ret);
|
||||
+
|
||||
+ /* Allocate memory for premaster secret, and fill in the
|
||||
+ * fields except the decryption result.
|
||||
+ */
|
||||
+ session->key.key.size = 2 + GNUTLS_MASTER_SIZE + 2 + pwd_psk.size;
|
||||
+ session->key.key.data = gnutls_malloc(session->key.key.size);
|
||||
+ if (session->key.key.data == NULL) {
|
||||
gnutls_assert();
|
||||
+ _gnutls_free_key_datum(&pwd_psk);
|
||||
+ /* No need to zeroize, as the secret is not copied in yet */
|
||||
+ _gnutls_free_datum(&session->key.key);
|
||||
return GNUTLS_E_MEMORY_ERROR;
|
||||
}
|
||||
- premaster_secret.size = GNUTLS_MASTER_SIZE;
|
||||
|
||||
/* Fallback value when decryption fails. Needs to be unpredictable. */
|
||||
- ret = gnutls_rnd(GNUTLS_RND_NONCE, premaster_secret.data,
|
||||
- premaster_secret.size);
|
||||
+ ret = gnutls_rnd(GNUTLS_RND_NONCE, session->key.key.data + 2,
|
||||
+ GNUTLS_MASTER_SIZE);
|
||||
if (ret < 0) {
|
||||
gnutls_assert();
|
||||
- goto cleanup;
|
||||
+ _gnutls_free_key_datum(&pwd_psk);
|
||||
+ /* No need to zeroize, as the secret is not copied in yet */
|
||||
+ _gnutls_free_datum(&session->key.key);
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
+ _gnutls_write_uint16(GNUTLS_MASTER_SIZE, session->key.key.data);
|
||||
+ _gnutls_write_uint16(pwd_psk.size,
|
||||
+ &session->key.key.data[2 + GNUTLS_MASTER_SIZE]);
|
||||
+ memcpy(&session->key.key.data[2 + GNUTLS_MASTER_SIZE + 2], pwd_psk.data,
|
||||
+ pwd_psk.size);
|
||||
+ _gnutls_free_key_datum(&pwd_psk);
|
||||
+
|
||||
gnutls_privkey_decrypt_data2(session->internals.selected_key, 0,
|
||||
- &ciphertext, premaster_secret.data,
|
||||
- premaster_secret.size);
|
||||
+ &ciphertext, session->key.key.data + 2,
|
||||
+ GNUTLS_MASTER_SIZE);
|
||||
/* After this point, any conditional on failure that cause differences
|
||||
* in execution may create a timing or cache access pattern side
|
||||
* channel that can be used as an oracle, so tread carefully */
|
||||
@@ -365,31 +388,10 @@ _gnutls_proc_rsa_psk_client_kx(gnutls_session_t session, uint8_t * data,
|
||||
/* This is here to avoid the version check attack
|
||||
* discussed above.
|
||||
*/
|
||||
- premaster_secret.data[0] = ver_maj;
|
||||
- premaster_secret.data[1] = ver_min;
|
||||
+ session->key.key.data[2] = ver_maj;
|
||||
+ session->key.key.data[3] = ver_min;
|
||||
|
||||
- /* find the key of this username
|
||||
- */
|
||||
- ret =
|
||||
- _gnutls_psk_pwd_find_entry(session, info->username, strlen(info->username), &pwd_psk);
|
||||
- if (ret < 0) {
|
||||
- gnutls_assert();
|
||||
- goto cleanup;
|
||||
- }
|
||||
-
|
||||
- ret =
|
||||
- set_rsa_psk_session_key(session, &pwd_psk, &premaster_secret);
|
||||
- if (ret < 0) {
|
||||
- gnutls_assert();
|
||||
- goto cleanup;
|
||||
- }
|
||||
-
|
||||
- ret = 0;
|
||||
- cleanup:
|
||||
- _gnutls_free_key_datum(&pwd_psk);
|
||||
- _gnutls_free_temp_key_datum(&premaster_secret);
|
||||
-
|
||||
- return ret;
|
||||
+ return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
--
|
||||
2.25.1
|
||||
|
||||
184
meta/recipes-support/gnutls/gnutls/CVE-2024-0567.patch
Normal file
184
meta/recipes-support/gnutls/gnutls/CVE-2024-0567.patch
Normal file
@@ -0,0 +1,184 @@
|
||||
From 9edbdaa84e38b1bfb53a7d72c1de44f8de373405 Mon Sep 17 00:00:00 2001
|
||||
From: Daiki Ueno <ueno@gnu.org>
|
||||
Date: Thu, 11 Jan 2024 15:45:11 +0900
|
||||
Subject: [PATCH] x509: detect loop in certificate chain
|
||||
|
||||
There can be a loop in a certificate chain, when multiple CA
|
||||
certificates are cross-signed with each other, such as A → B, B → C,
|
||||
and C → A. Previously, the verification logic was not capable of
|
||||
handling this scenario while sorting the certificates in the chain in
|
||||
_gnutls_sort_clist, resulting in an assertion failure. This patch
|
||||
properly detects such loop and aborts further processing in a graceful
|
||||
manner.
|
||||
|
||||
Signed-off-by: Daiki Ueno <ueno@gnu.org>
|
||||
|
||||
Upstream-Status: Backport [https://gitlab.com/gnutls/gnutls/-/commit/9edbdaa84e38b1bfb53a7d72c1de44f8de373405]
|
||||
CVE: CVE-2024-0567
|
||||
Signed-off-by: Vijay Anusuri <vanusuri@mvista.com>
|
||||
---
|
||||
lib/x509/common.c | 4 ++
|
||||
tests/test-chains.h | 125 ++++++++++++++++++++++++++++++++++++++++++++
|
||||
2 files changed, 129 insertions(+)
|
||||
|
||||
diff --git a/lib/x509/common.c b/lib/x509/common.c
|
||||
index fad9da5..6367b03 100644
|
||||
--- a/lib/x509/common.c
|
||||
+++ b/lib/x509/common.c
|
||||
@@ -1790,6 +1790,10 @@ unsigned int _gnutls_sort_clist(gnutls_x509_crt_t *clist,
|
||||
break;
|
||||
}
|
||||
|
||||
+ if (insorted[prev]) { /* loop detected */
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
sorted[i] = clist[prev];
|
||||
insorted[prev] = 1;
|
||||
}
|
||||
diff --git a/tests/test-chains.h b/tests/test-chains.h
|
||||
index dd7ccf0..09a5461 100644
|
||||
--- a/tests/test-chains.h
|
||||
+++ b/tests/test-chains.h
|
||||
@@ -4263,6 +4263,129 @@ static const char *rsa_sha1_not_in_trusted_ca[] = {
|
||||
NULL
|
||||
};
|
||||
|
||||
+static const char *cross_signed[] = {
|
||||
+ /* server (signed by A1) */
|
||||
+ "-----BEGIN CERTIFICATE-----\n"
|
||||
+ "MIIBqDCCAVqgAwIBAgIUejlil+8DBffazcnMNwyOOP6yCCowBQYDK2VwMBoxGDAW\n"
|
||||
+ "BgNVBAMTD0ludGVybWVkaWF0ZSBBMTAgFw0yNDAxMTEwNjI3MjJaGA85OTk5MTIz\n"
|
||||
+ "MTIzNTk1OVowNzEbMBkGA1UEChMSR251VExTIHRlc3Qgc2VydmVyMRgwFgYDVQQD\n"
|
||||
+ "Ew90ZXN0LmdudXRscy5vcmcwKjAFBgMrZXADIQA1ZVS0PcNeTPQMZ+FuVz82AHrj\n"
|
||||
+ "qL5hWEpCDgpG4M4fxaOBkjCBjzAMBgNVHRMBAf8EAjAAMBoGA1UdEQQTMBGCD3Rl\n"
|
||||
+ "c3QuZ251dGxzLm9yZzATBgNVHSUEDDAKBggrBgEFBQcDATAOBgNVHQ8BAf8EBAMC\n"
|
||||
+ "B4AwHQYDVR0OBBYEFGtEUv+JSt+zPoO3lu0IiObZVoiNMB8GA1UdIwQYMBaAFPnY\n"
|
||||
+ "v6Pw0IvKSqIlb6ewHyEAmTA3MAUGAytlcANBAAS2lyc87kH/aOvNKzPjqDwUYxPA\n"
|
||||
+ "CfYjyaKea2d0DZLBM5+Bjnj/4aWwTKgVTJzWhLJcLtaSdVHrXqjr9NhEhQ0=\n"
|
||||
+ "-----END CERTIFICATE-----\n",
|
||||
+ /* A1 (signed by A) */
|
||||
+ "-----BEGIN CERTIFICATE-----\n"
|
||||
+ "MIIBUjCCAQSgAwIBAgIUe/R+NVp04e74ySw2qgI6KZgFR20wBQYDK2VwMBExDzAN\n"
|
||||
+ "BgNVBAMTBlJvb3QgQTAgFw0yNDAxMTEwNjI1MDFaGA85OTk5MTIzMTIzNTk1OVow\n"
|
||||
+ "GjEYMBYGA1UEAxMPSW50ZXJtZWRpYXRlIEExMCowBQYDK2VwAyEAlkTNqwz973sy\n"
|
||||
+ "u3whMjSiUMs77CZu5YA7Gi5KcakExrKjYzBhMA8GA1UdEwEB/wQFMAMBAf8wDgYD\n"
|
||||
+ "VR0PAQH/BAQDAgIEMB0GA1UdDgQWBBT52L+j8NCLykqiJW+nsB8hAJkwNzAfBgNV\n"
|
||||
+ "HSMEGDAWgBRbYgOkRGsd3Z74+CauX4htzLg0lzAFBgMrZXADQQBM0NBaFVPd3cTJ\n"
|
||||
+ "DSaZNT34fsHuJk4eagpn8mBxKQpghq4s8Ap+nYtp2KiXjcizss53PeLXVnkfyLi0\n"
|
||||
+ "TLVBHvUJ\n"
|
||||
+ "-----END CERTIFICATE-----\n",
|
||||
+ /* A (signed by B) */
|
||||
+ "-----BEGIN CERTIFICATE-----\n"
|
||||
+ "MIIBSDCB+6ADAgECAhQtdJpg+qlPcLoRW8iiztJUD4xNvDAFBgMrZXAwETEPMA0G\n"
|
||||
+ "A1UEAxMGUm9vdCBCMCAXDTI0MDExMTA2MTk1OVoYDzk5OTkxMjMxMjM1OTU5WjAR\n"
|
||||
+ "MQ8wDQYDVQQDEwZSb290IEEwKjAFBgMrZXADIQA0vDYyg3tgotSETL1Wq2hBs32p\n"
|
||||
+ "WbnINkmOSNmOiZlGHKNjMGEwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\n"
|
||||
+ "AgQwHQYDVR0OBBYEFFtiA6REax3dnvj4Jq5fiG3MuDSXMB8GA1UdIwQYMBaAFJFA\n"
|
||||
+ "s2rg6j8w9AKItRnOOOjG2FG6MAUGAytlcANBAPv674p9ek5GjRcRfVQhgN+kQlHU\n"
|
||||
+ "u774wL3Vx3fWA1E7+WchdMzcHrPoa5OKtKmxjIKUTO4SeDZL/AVpvulrWwk=\n"
|
||||
+ "-----END CERTIFICATE-----\n",
|
||||
+ /* A (signed by C) */
|
||||
+ "-----BEGIN CERTIFICATE-----\n"
|
||||
+ "MIIBSDCB+6ADAgECAhReNpCiVn7eFDUox3mvM5qE942AVzAFBgMrZXAwETEPMA0G\n"
|
||||
+ "A1UEAxMGUm9vdCBDMCAXDTI0MDExMTA2MjEyMVoYDzk5OTkxMjMxMjM1OTU5WjAR\n"
|
||||
+ "MQ8wDQYDVQQDEwZSb290IEIwKjAFBgMrZXADIQAYX92hS97OGKbMzwrD7ReVifwM\n"
|
||||
+ "3iz5tnfQHWQSkvvYMKNjMGEwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\n"
|
||||
+ "AgQwHQYDVR0OBBYEFJFAs2rg6j8w9AKItRnOOOjG2FG6MB8GA1UdIwQYMBaAFEh/\n"
|
||||
+ "XKjIuMeEavX5QVoy39Q+GhnwMAUGAytlcANBAIwghH3gelXty8qtoTGIEJb0+EBv\n"
|
||||
+ "BH4YOUh7TamxjxkjvvIhDA7ZdheofFb7NrklJco7KBcTATUSOvxakYRP9Q8=\n"
|
||||
+ "-----END CERTIFICATE-----\n",
|
||||
+ /* B1 (signed by B) */
|
||||
+ "-----BEGIN CERTIFICATE-----\n"
|
||||
+ "MIIBUjCCAQSgAwIBAgIUfpmrVDc1XBA5/7QYMyGBuB9mTtUwBQYDK2VwMBExDzAN\n"
|
||||
+ "BgNVBAMTBlJvb3QgQjAgFw0yNDAxMTEwNjI1MjdaGA85OTk5MTIzMTIzNTk1OVow\n"
|
||||
+ "GjEYMBYGA1UEAxMPSW50ZXJtZWRpYXRlIEIxMCowBQYDK2VwAyEAh6ZTuJWsweVB\n"
|
||||
+ "a5fsye5iq89kWDC2Y/Hlc0htLmjzMP+jYzBhMA8GA1UdEwEB/wQFMAMBAf8wDgYD\n"
|
||||
+ "VR0PAQH/BAQDAgIEMB0GA1UdDgQWBBTMQu37PKyLjKfPODZgxYCaayff+jAfBgNV\n"
|
||||
+ "HSMEGDAWgBSRQLNq4Oo/MPQCiLUZzjjoxthRujAFBgMrZXADQQBblmguY+lnYvOK\n"
|
||||
+ "rAZJnqpEUGfm1tIFyu3rnlE7WOVcXRXMIoNApLH2iHIipQjlvNWuSBFBTC1qdewh\n"
|
||||
+ "/e+0cgQB\n"
|
||||
+ "-----END CERTIFICATE-----\n",
|
||||
+ /* B (signed by A) */
|
||||
+ "-----BEGIN CERTIFICATE-----\n"
|
||||
+ "MIIBSDCB+6ADAgECAhRpEm+dWNX6DMZh/nottkFfFFrXXDAFBgMrZXAwETEPMA0G\n"
|
||||
+ "A1UEAxMGUm9vdCBBMCAXDTI0MDExMTA2MTcyNloYDzk5OTkxMjMxMjM1OTU5WjAR\n"
|
||||
+ "MQ8wDQYDVQQDEwZSb290IEIwKjAFBgMrZXADIQAYX92hS97OGKbMzwrD7ReVifwM\n"
|
||||
+ "3iz5tnfQHWQSkvvYMKNjMGEwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\n"
|
||||
+ "AgQwHQYDVR0OBBYEFJFAs2rg6j8w9AKItRnOOOjG2FG6MB8GA1UdIwQYMBaAFFti\n"
|
||||
+ "A6REax3dnvj4Jq5fiG3MuDSXMAUGAytlcANBAFvmcK3Ida5ViVYDzxKVLPcPsCHe\n"
|
||||
+ "3hxz99lBrerJC9iJSvRYTJoPBvjTxDYnBn5EFrQYMrUED+6i71lmGXNU9gs=\n"
|
||||
+ "-----END CERTIFICATE-----\n",
|
||||
+ /* B (signed by C) */
|
||||
+ "-----BEGIN CERTIFICATE-----\n"
|
||||
+ "MIIBSDCB+6ADAgECAhReNpCiVn7eFDUox3mvM5qE942AVzAFBgMrZXAwETEPMA0G\n"
|
||||
+ "A1UEAxMGUm9vdCBDMCAXDTI0MDExMTA2MjEyMVoYDzk5OTkxMjMxMjM1OTU5WjAR\n"
|
||||
+ "MQ8wDQYDVQQDEwZSb290IEIwKjAFBgMrZXADIQAYX92hS97OGKbMzwrD7ReVifwM\n"
|
||||
+ "3iz5tnfQHWQSkvvYMKNjMGEwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\n"
|
||||
+ "AgQwHQYDVR0OBBYEFJFAs2rg6j8w9AKItRnOOOjG2FG6MB8GA1UdIwQYMBaAFEh/\n"
|
||||
+ "XKjIuMeEavX5QVoy39Q+GhnwMAUGAytlcANBAIwghH3gelXty8qtoTGIEJb0+EBv\n"
|
||||
+ "BH4YOUh7TamxjxkjvvIhDA7ZdheofFb7NrklJco7KBcTATUSOvxakYRP9Q8=\n"
|
||||
+ "-----END CERTIFICATE-----\n",
|
||||
+ /* C1 (signed by C) */
|
||||
+ "-----BEGIN CERTIFICATE-----\n"
|
||||
+ "MIIBUjCCAQSgAwIBAgIUSKsfY1wD3eD2VmaaK1wt5naPckMwBQYDK2VwMBExDzAN\n"
|
||||
+ "BgNVBAMTBlJvb3QgQzAgFw0yNDAxMTEwNjI1NDdaGA85OTk5MTIzMTIzNTk1OVow\n"
|
||||
+ "GjEYMBYGA1UEAxMPSW50ZXJtZWRpYXRlIEMxMCowBQYDK2VwAyEA/t7i1chZlKkV\n"
|
||||
+ "qxJOrmmyATn8XnpK+nV/iT4OMHSHfAyjYzBhMA8GA1UdEwEB/wQFMAMBAf8wDgYD\n"
|
||||
+ "VR0PAQH/BAQDAgIEMB0GA1UdDgQWBBRmpF3JjoP3NiBzE5J5ANT0bvfRmjAfBgNV\n"
|
||||
+ "HSMEGDAWgBRIf1yoyLjHhGr1+UFaMt/UPhoZ8DAFBgMrZXADQQAeRBXv6WCTOp0G\n"
|
||||
+ "3wgd8bbEGrrILfpi+qH7aj/MywgkPIlppDYRQ3jL6ASd+So/408dlE0DV9DXKBi0\n"
|
||||
+ "725XUUYO\n"
|
||||
+ "-----END CERTIFICATE-----\n",
|
||||
+ /* C (signed by A) */
|
||||
+ "-----BEGIN CERTIFICATE-----\n"
|
||||
+ "MIIBSDCB+6ADAgECAhRvbZv3SRTjDOiAbyFWHH4y0yMZkjAFBgMrZXAwETEPMA0G\n"
|
||||
+ "A1UEAxMGUm9vdCBBMCAXDTI0MDExMTA2MTg1MVoYDzk5OTkxMjMxMjM1OTU5WjAR\n"
|
||||
+ "MQ8wDQYDVQQDEwZSb290IEMwKjAFBgMrZXADIQDxm6Ubhsa0gSa1vBCIO5e+qZEH\n"
|
||||
+ "8Oocz+buNHfIJbh5NaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\n"
|
||||
+ "AgQwHQYDVR0OBBYEFEh/XKjIuMeEavX5QVoy39Q+GhnwMB8GA1UdIwQYMBaAFFti\n"
|
||||
+ "A6REax3dnvj4Jq5fiG3MuDSXMAUGAytlcANBAPl+SyiOfXJnjSWx8hFMhJ7w92mn\n"
|
||||
+ "tkGifCFHBpUhYcBIMeMtLw0RBLXqaaN0EKlTFimiEkLClsU7DKYrpEEJegs=\n"
|
||||
+ "-----END CERTIFICATE-----\n",
|
||||
+ /* C (signed by B) */
|
||||
+ "-----BEGIN CERTIFICATE-----\n"
|
||||
+ "MIIBSDCB+6ADAgECAhQU1OJWRVOLrGrgJiLwexd1/MwKkTAFBgMrZXAwETEPMA0G\n"
|
||||
+ "A1UEAxMGUm9vdCBCMCAXDTI0MDExMTA2MjAzMFoYDzk5OTkxMjMxMjM1OTU5WjAR\n"
|
||||
+ "MQ8wDQYDVQQDEwZSb290IEMwKjAFBgMrZXADIQDxm6Ubhsa0gSa1vBCIO5e+qZEH\n"
|
||||
+ "8Oocz+buNHfIJbh5NaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\n"
|
||||
+ "AgQwHQYDVR0OBBYEFEh/XKjIuMeEavX5QVoy39Q+GhnwMB8GA1UdIwQYMBaAFJFA\n"
|
||||
+ "s2rg6j8w9AKItRnOOOjG2FG6MAUGAytlcANBALXeyuj8vj6Q8j4l17VzZwmJl0gN\n"
|
||||
+ "bCGoKMl0J/0NiN/fQRIsdbwQDh0RUN/RN3I6DTtB20ER6f3VdnzAh8nXkQ4=\n"
|
||||
+ "-----END CERTIFICATE-----\n",
|
||||
+ NULL
|
||||
+};
|
||||
+
|
||||
+static const char *cross_signed_ca[] = {
|
||||
+ /* A (self-signed) */
|
||||
+ "-----BEGIN CERTIFICATE-----\n"
|
||||
+ "MIIBJzCB2qADAgECAhQs1Ur+gzPs1ISxs3Tbs700q0CZcjAFBgMrZXAwETEPMA0G\n"
|
||||
+ "A1UEAxMGUm9vdCBBMCAXDTI0MDExMTA2MTYwMFoYDzk5OTkxMjMxMjM1OTU5WjAR\n"
|
||||
+ "MQ8wDQYDVQQDEwZSb290IEEwKjAFBgMrZXADIQA0vDYyg3tgotSETL1Wq2hBs32p\n"
|
||||
+ "WbnINkmOSNmOiZlGHKNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC\n"
|
||||
+ "AgQwHQYDVR0OBBYEFFtiA6REax3dnvj4Jq5fiG3MuDSXMAUGAytlcANBAHrVv7E9\n"
|
||||
+ "5scuOVCH9gNRRm8Z9SUoLakRHAPnySdg6z/kI3vOgA/OM7reArpnW8l1H2FapgpL\n"
|
||||
+ "bDeZ2XJH+BdVFwg=\n"
|
||||
+ "-----END CERTIFICATE-----\n",
|
||||
+ NULL
|
||||
+};
|
||||
+
|
||||
#if defined __clang__ || __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
|
||||
# pragma GCC diagnostic push
|
||||
# pragma GCC diagnostic ignored "-Wunused-variable"
|
||||
@@ -4442,6 +4565,8 @@ static struct
|
||||
rsa_sha1_not_in_trusted, rsa_sha1_not_in_trusted_ca,
|
||||
GNUTLS_PROFILE_TO_VFLAGS(GNUTLS_PROFILE_MEDIUM),
|
||||
GNUTLS_CERT_INSECURE_ALGORITHM | GNUTLS_CERT_INVALID, NULL, 1620118136, 1},
|
||||
+ { "cross signed - ok", cross_signed, cross_signed_ca, 0, 0, 0,
|
||||
+ 1704955300 },
|
||||
{ NULL, NULL, NULL, 0, 0}
|
||||
};
|
||||
|
||||
--
|
||||
2.25.1
|
||||
|
||||
@@ -24,6 +24,8 @@ SRC_URI = "https://www.gnupg.org/ftp/gcrypt/gnutls/v${SHRT_VER}/gnutls-${PV}.tar
|
||||
file://CVE-2022-2509.patch \
|
||||
file://CVE-2023-0361.patch \
|
||||
file://CVE-2023-5981.patch \
|
||||
file://CVE-2024-0553.patch \
|
||||
file://CVE-2024-0567.patch \
|
||||
"
|
||||
|
||||
SRC_URI[sha256sum] = "e6adbebcfbc95867de01060d93c789938cf89cc1d1f6ef9ef661890f6217451f"
|
||||
|
||||
44
meta/recipes-support/sqlite/files/CVE-2023-7104.patch
Normal file
44
meta/recipes-support/sqlite/files/CVE-2023-7104.patch
Normal file
@@ -0,0 +1,44 @@
|
||||
From 09f1652f36c5c4e8a6a640ce887f9ea0f48a7958 Mon Sep 17 00:00:00 2001
|
||||
From: dan <Dan Kennedy>
|
||||
Date: Thu, 7 Sep 2023 13:53:09 +0000
|
||||
Subject: [PATCH] Fix a buffer overread in the sessions extension that could
|
||||
occur when processing a corrupt changeset.
|
||||
|
||||
Upstream-Status: Backport [https://sqlite.org/src/info/0e4e7a05c4204b47]
|
||||
CVE: CVE-2022-46908
|
||||
Signed-off-by: Peter Marko <peter.marko@siemens.com>
|
||||
---
|
||||
sqlite3.c | 18 +++++++++++-------
|
||||
1 file changed, 11 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/ext/session/sqlite3session.c b/ext/session/sqlite3session.c
|
||||
index 9f862f2465..0491549231 100644
|
||||
--- a/sqlite3.c
|
||||
+++ b/sqlite3.c
|
||||
@@ -213482,15 +213482,19 @@ static int sessionReadRecord(
|
||||
}
|
||||
}
|
||||
if( eType==SQLITE_INTEGER || eType==SQLITE_FLOAT ){
|
||||
- sqlite3_int64 v = sessionGetI64(aVal);
|
||||
- if( eType==SQLITE_INTEGER ){
|
||||
- sqlite3VdbeMemSetInt64(apOut[i], v);
|
||||
+ if( (pIn->nData-pIn->iNext)<8 ){
|
||||
+ rc = SQLITE_CORRUPT_BKPT;
|
||||
}else{
|
||||
- double d;
|
||||
- memcpy(&d, &v, 8);
|
||||
- sqlite3VdbeMemSetDouble(apOut[i], d);
|
||||
+ sqlite3_int64 v = sessionGetI64(aVal);
|
||||
+ if( eType==SQLITE_INTEGER ){
|
||||
+ sqlite3VdbeMemSetInt64(apOut[i], v);
|
||||
+ }else{
|
||||
+ double d;
|
||||
+ memcpy(&d, &v, 8);
|
||||
+ sqlite3VdbeMemSetDouble(apOut[i], d);
|
||||
+ }
|
||||
+ pIn->iNext += 8;
|
||||
}
|
||||
- pIn->iNext += 8;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -7,6 +7,7 @@ SRC_URI = "http://www.sqlite.org/2022/sqlite-autoconf-${SQLITE_PV}.tar.gz \
|
||||
file://0001-sqlite-Increased-the-size-of-loop-variables-in-the-printf-implementation.patch \
|
||||
file://CVE-2022-46908.patch \
|
||||
file://CVE-2023-36191.patch \
|
||||
file://CVE-2023-7104.patch \
|
||||
"
|
||||
SRC_URI[sha256sum] = "5af07de982ba658fd91a03170c945f99c971f6955bc79df3266544373e39869c"
|
||||
|
||||
|
||||
@@ -703,7 +703,7 @@ def draw_processes_recursively(ctx, proc, proc_tree, y, proc_h, rect, clip) :
|
||||
cmdString = proc.cmd
|
||||
else:
|
||||
cmdString = ''
|
||||
if (OPTIONS.show_pid or OPTIONS.show_all) and ipid is not 0:
|
||||
if (OPTIONS.show_pid or OPTIONS.show_all) and ipid != 0:
|
||||
cmdString = cmdString + " [" + str(ipid // 1000) + "]"
|
||||
if OPTIONS.show_all:
|
||||
if proc.args:
|
||||
@@ -801,7 +801,7 @@ class CumlSample:
|
||||
if self.color is None:
|
||||
i = self.next() % HSV_MAX_MOD
|
||||
h = 0.0
|
||||
if i is not 0:
|
||||
if i != 0:
|
||||
h = (1.0 * i) / HSV_MAX_MOD
|
||||
s = 0.5
|
||||
v = 1.0
|
||||
|
||||
Reference in New Issue
Block a user